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

export type UnitActionType = 'book' | 'hold';

export interface UnitBookingOrHoldQueryFilter {
  lead?: string;
  project?: string;
  contactId?: string;
  unit?: string;
  action?: UnitActionType;
  createdBy?: string;
  updatedBy?: string;
  [key: string]: unknown;
}

// Strongly typed interface for one person with all document URLs
export interface IPersonWithDocs {
  name: string;
  aadharFront: string;
  aadharBack: string;
  panCard: string;
  passportPhoto: string;
  additionalDocs?: string[];
}

export interface IUnitBookingOrHoldBase {
  lead: Types.ObjectId | string;
  project?: Types.ObjectId | string;
  contactId?: Types.ObjectId | string;
  unit?: Types.ObjectId | string;
  property?: Types.ObjectId | string;
  paymentPlan?: Types.ObjectId | string;
  action: UnitActionType;
  comment?: string;

  holdUntil?: Date | string;

  bookingAmount?: number;

  // New typed array of persons with documents
  persons?: IPersonWithDocs[];

  soldBy?: Types.ObjectId | string;
  cpContact?: Types.ObjectId | string;

  customFields?: Record<string, unknown>;
  company?: Types.ObjectId | string;
}

export interface IUnitBookingOrHold
  extends IUnitBookingOrHoldBase,
    AuditFields {}

export interface IUnitBookingOrHoldDoc extends IUnitBookingOrHold, Document {}

export interface IUnitBookingOrHoldModel
  extends IPaginateModel<IUnitBookingOrHoldDoc> {}

export type NewCreatedUnitBookingOrHold = IUnitBookingOrHoldBase &
  Partial<Pick<AuditFields, 'createdBy' | 'updatedBy'>>;

export type UpdateUnitBookingOrHoldBody = Partial<IUnitBookingOrHold>;
