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

// Sale Types
interface BaseSale {
  kind: 'Project' | 'Property';
  soldBy?: Types.ObjectId;
  salesAt?: Date;
  notes?: string;
}

export interface ProjectSale extends BaseSale {
  kind: 'Project';
  project: Types.ObjectId;
}

export interface PropertySale extends BaseSale {
  kind: 'Property';
  property: Types.ObjectId;
}

export type Sale = ProjectSale | PropertySale;

// Customer base type
export interface ICustomer extends AuditFields {
  company: Types.ObjectId;
  unitBookingOrHold: Types.ObjectId;
  paymentPlan?: Types.ObjectId;
  propertyTitle?: string;
  name: string;
  email: string;
  phone: number;
  contactId?: Types.ObjectId;
  leadId?: Types.ObjectId;
  sales: Sale[];
  totalAmount?: number;
  bookingAmount?: number;
  rentAmount?: number;
  rentAmountPaid?: number;
  depositAmount?: number;
  depositAmountPaid?: number;
  bookingStatus?: 'active' | 'cancelled';
  cancellationDetails?: {
    cancelledAt?: Date;
    cancelledBy?: Types.ObjectId;
    reason?: string;
  };
  documents?: {
    document: Types.ObjectId;
    status: string;
    generatedAt?: Date;
    sentAt?: Date;
    url?: string;
    generatedBy?: Types.ObjectId;
    sentBy?: Types.ObjectId;
  }[];
  bankAccountId?: Types.ObjectId;
}

// ✅ Use `type` for document + model typing
export type ICustomerDoc = ICustomer & Document;

export interface ICustomerModel extends IPaginateModel<ICustomerDoc> {}

export type NewCreatedCustomer = ICustomer &
  Partial<Pick<AuditFields, 'createdBy' | 'updatedBy'>>;
export type UpdateCustomerBody = Partial<ICustomer>;

export type PopulatedCustomer = {
  _id: Types.ObjectId;
  createdBy: {
    email: string;
  };

  leadId: {
    contactDetails: {
      name: string;
      email: string;
      phone: string;
    };
  };

  contactId: {
    phone: Phone[];
    firstName: string;
    lastName: string;
    addressLine1: string;
  };
  sales: Sale[];
};
