import { Schema, model } from 'mongoose';
import { ITargetsDoc, ITargetsModel } from '@/modules/targets/targets.interface.js';
import { paginate, toJSON } from '@/shared/utils/plugins/index.js';
import { TargetType } from '@/shared/constants/enum.constant.js';

const targetsSchema = new Schema<ITargetsDoc>(
  {
    companyId: {
      type: Schema.Types.ObjectId,
      ref: 'Company',
    },

    period: {
      month: {
        type: Number,
        required: true,
        min: 1,
        max: 12,
      },
      year: {
        type: Number,
        required: true,
      },
    },

    targetType: {
      type: String,
      required: true,
      enum: Object.values(TargetType),
    },

    team: {
      type: Schema.Types.ObjectId,
      ref: 'Team',
      required: true,
    },

    member: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
    salesAmount: {
      target: { type: Number, required: true, min: 0 },
      achieved: { type: Number, default: 0, min: 0 },
    },
    unitsSold: {
      target: { type: Number, default: 0, min: 0 },
      achieved: { type: Number, default: 0, min: 0 },
    },
    meetings: {
      target: { type: Number, default: 0, min: 0 },
      achieved: { type: Number, default: 0, min: 0 },
    },
    siteVisits: {
      target: { type: Number, default: 0, min: 0 },
      achieved: { type: Number, default: 0, min: 0 },
    },
    calls: {
      target: { type: Number, default: 0, min: 0 },
      achieved: { type: Number, default: 0, min: 0 },
    },

    createdBy: { type: Schema.Types.ObjectId, ref: 'User' },
    updatedBy: { type: Schema.Types.ObjectId, ref: 'User' },
  },
  {
    timestamps: true,
  },
);

targetsSchema.index(
  {
    companyId: 1,
    period: 1,
    targetType: 1,
    team: 1,
    member: 1,
  },
  { unique: true, partialFilterExpression: { member: { $exists: true } } },
);

targetsSchema.index(
  {
    companyId: 1,
    period: 1,
    targetType: 1,
    team: 1,
  },
  { unique: true, partialFilterExpression: { member: { $exists: false } } },
);

targetsSchema.plugin(toJSON);
targetsSchema.plugin(paginate);

export const Targets = model<ITargetsDoc, ITargetsModel>('Targets', targetsSchema);
