import mongoose, { Schema, Document } from 'mongoose';

export interface IAssetDocument extends Document {
  _id: any;
  projectId: any;
  parentAssetId?: any | null;
  assetType: string;
  name: string;
  code: string;
  serialNumber?: string;
  manufacturer?: string;
  productModel?: string;
  capacityKW?: number;
  commissioningDate?: Date;
  warrantyEndDate?: Date;
  status: 'active' | 'maintenance' | 'inactive' | 'decommissioned' | 'faulty';
  locationGPS?: { lat: number; lng: number };
  specifications?: Record<string, any>;
  createdAt: Date;
  updatedAt: Date;
}

const assetSchema = new Schema<IAssetDocument>(
  {
    _id: { type: Schema.Types.Mixed, default: () => new mongoose.Types.ObjectId().toString() }, // Support both string demo IDs and auto-gen string IDs
    projectId: { type: Schema.Types.Mixed, ref: 'Project', required: true },
    parentAssetId: { type: Schema.Types.Mixed, ref: 'Asset', default: null },
    assetType: {
      type: String,
      required: true,
    },
    name: { type: String, required: true },
    code: { type: String, required: true },
    serialNumber: String,
    manufacturer: String,
    productModel: String,
    capacityKW: Number,
    commissioningDate: Date,
    warrantyEndDate: Date,
    status: {
      type: String,
      enum: ['active', 'maintenance', 'inactive', 'decommissioned', 'faulty'],
      default: 'active',
    },
    locationGPS: {
      lat: Number,
      lng: Number,
    },
    specifications: { type: Schema.Types.Mixed, default: {} },
  },
  {
    timestamps: true,
  }
);

assetSchema.index({ projectId: 1, code: 1 }, { unique: true });
assetSchema.index({ parentAssetId: 1 });
assetSchema.index({ assetType: 1 });
assetSchema.index({ status: 1 });

export const Asset = mongoose.model<IAssetDocument>('Asset', assetSchema);
