import mongoose, { Schema, Document } from 'mongoose';

export interface IPMScheduleDocument extends Document {
  _id: any;
  projectId: any;
  contractId: any; // Required: Link to O&M Contract
  assetId?: any; // Optional: Reference to customer asset (for information only)
  title: string;
  description?: string;
  frequency: 'Daily' | 'Weekly' | 'Monthly' | 'Quarterly' | 'Semi-Annually' | 'Annually';
  lastPerformed?: Date;
  nextDue: Date;
  assignedTo?: any;
  status: 'Active' | 'Paused' | 'Inactive';
  createdAt: Date;
  updatedAt: Date;
}

const pmScheduleSchema = new Schema<IPMScheduleDocument>(
  {
    _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 },
    contractId: { type: Schema.Types.Mixed, ref: 'Contract', required: true }, // Required: O&M Contract
    assetId: { type: Schema.Types.Mixed, ref: 'Asset' }, // Optional: Reference to customer asset
    title: { type: String, required: true },
    description: String,
    frequency: {
      type: String,
      required: true,
      enum: ['Daily', 'Weekly', 'Monthly', 'Quarterly', 'Semi-Annually', 'Annually'],
    },
    lastPerformed: Date,
    nextDue: { type: Date, required: true },
    assignedTo: { type: Schema.Types.Mixed, ref: 'User' },
    status: {
      type: String,
      enum: ['Active', 'Paused', 'Inactive'],
      default: 'Active',
    },
  },
  {
    timestamps: true,
  }
);

pmScheduleSchema.index({ contractId: 1 });
pmScheduleSchema.index({ projectId: 1 });
pmScheduleSchema.index({ status: 1 });
pmScheduleSchema.index({ nextDue: 1 });

export const PMSchedule = mongoose.model<IPMScheduleDocument>('PMSchedule', pmScheduleSchema);
