import { Schema } from 'mongoose';
import { ITasksDoc } from '@/modules/tasks/tasks.interface.js';
import { paginate, toJSON } from '@/shared/utils/plugins/index.js';
import { TaskActivityType, TaskStatus } from '@/modules/tasks/tasks.constant';

export const tasksBaseSchema = new Schema<ITasksDoc>(
  {
    companyId: {
      type: Schema.Types.ObjectId,
      ref: 'Company',
    },

    contactId: {
      type: Schema.Types.ObjectId,
      ref: 'Contact',
    },
    leadId: {
      type: Schema.Types.ObjectId,
      ref: 'Lead',
    },
    assignedTo: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
    notes: {
      type: String,
    },
    activityType: {
      type: String,
      enum: Object.values(TaskActivityType),
    },
    activityDate: {
      type: Date,
    },
    status: {
      type: String,
      enum: Object.values(TaskStatus),
      default: TaskStatus.PENDING,
    },
    createdBy: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
    updatedBy: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
    customFields: {
      type: Map,
      of: Schema.Types.Mixed,
      default: {},
    },
    notifyAt: {
      type: [Date],
    },
  },
  {
    timestamps: true,
    discriminatorKey: 'activityType',
  },
);

// add plugin that converts mongoose to json
tasksBaseSchema.plugin(toJSON);
tasksBaseSchema.plugin(paginate);

tasksBaseSchema.index({ leadId: 1, status: 1 });

// Critical compound indexes for team activity summary queries (prevents COLLSCAN)
tasksBaseSchema.index({
  companyId: 1,
  assignedTo: 1,
  activityType: 1,
  status: 1,
});

// Index for date range queries in dashboard
tasksBaseSchema.index({
  companyId: 1,
  assignedTo: 1,
  activityType: 1,
  activityDate: 1,
});

// Index for project-specific queries
tasksBaseSchema.index({
  companyId: 1,
  assignedTo: 1,
  activityType: 1,
  project: 1,
});
