import { Document, Types } from 'mongoose';
import { IPaginateModel } from '@/shared/interfaces/model.interface';
import { AuditFields } from '@/shared/types/common';

export type ActivityType =
  | 'call'
  | 'meeting'
  | 'site-visit'
  | 'schedule'
  | 'quote'
  | 'files'
  | 'book-hold'
  | 'book'
  | 'notes'
  | 'other';

export type ActivityStatus = 'pending' | 'completed' | 'overdue';

export interface QueryFilter {
  search?: string;
  lead?: string;
  contact?: string;
  task?: string;
  assignedTo?: string;
  status?: ActivityStatus;
  company?: string;
  [key: string]: unknown;
}

export interface IActivityBase {
  lead?: Types.ObjectId | string;
  contact?: Types.ObjectId | string;
  task?: Types.ObjectId | string;
  title: string;
  comment?: string;
  type: ActivityType;
  assignedTo: Types.ObjectId | string;
  status?: ActivityStatus;
  company?: Types.ObjectId | string;
  project?: Types.ObjectId;
  property?: Types.ObjectId;
  unit?: Types.ObjectId;
  files?: Types.ObjectId[];
  unitBookingOrHold?: Types.ObjectId;
  scheduleDateTime?: string | Date;
  location?: string;
  isEmail?: boolean;
  completionNote?: string;
  quotationFile?: string;
  duration?: number;
  audioFileName?: string;
  price?: number;
  total?: number;
  myoperatorReferenceId?: string;
}

export interface IActivity extends IActivityBase, AuditFields {}

export interface IActivityDoc extends IActivity, Document {}

export interface IActivityModel extends IPaginateModel<IActivityDoc> {}

export type NewCreatedActivity = IActivity &
  Partial<Pick<AuditFields, 'createdBy' | 'updatedBy'>> & {
    secondaryEmail?: string;
    primaryEmail?: string;
  };

export type UpdateActivityBody = Partial<IActivity>;

export interface FileDoc {
  name: string;
  fileType?: string;
  fileUrl: string;
}

export interface Contact {
  _id: Types.ObjectId;
  email: string;
  workEmail?: string;
  secondaryEmail?: string;
}

export interface PopulatedActivity {
  _id: Types.ObjectId;
  title: string;
  comment?: string;
  type: ActivityType;
  quotationFile?: string;
  status?: ActivityStatus;
  unit?: { unitNumber: string; price: number };
  files?: FileDoc[];
  lead?: {
    project?: { projectName: string };
    contact?: Contact;
    contactDetails?: {
      name: string;
      email: string;
      companyName?: string;
      phone?: string;
    };
  };
  company?: {
    _id: Types.ObjectId;
    name: string;
  };
  assignedTo?: {
    firstName: string;
    lastName: string;
    email: string;
    phone: {
      countryCode: string;
      number: string;
    };
  };
}


export interface ActivityPayload {
  type: ActivityType;
  isEmail?: boolean;
}

export interface ActivityFile {
  name: string;
  fileType?: string;
  fileUrl: string;
}

export interface FullActivity {
  quotationFile?: string;
  files?: ActivityFile[];

  company?: {
    _id: Types.ObjectId;
    name?: string;
  };

  project?: {
    projectName?: string;
  };

  assignedTo?: {
    firstName?: string;
    lastName?: string;
    email?: string;
    phone?: {
      countryCode?: string;
      number?: string;
    };
  };

  lead?: {
    contactDetails?: {
      name?: string;
      phone?: string;
    };
  };
}
