import { ILeadDoc } from '../lead/lead.interface';
import { IPaginateResult } from '@/shared/interfaces/model.interface';
import { Types } from 'mongoose';

interface LostLeadSummary {
  totalLostLeads: number;
  averageLeadAge: number;
  topLostReason: string | null;
}

export interface ReasonDistribution {
  reason: string;
  leadsLost: number;
  percentageOfLost: number;
}

export interface StageAtLossDistribution {
  stage: string;
  leadsLost: number;
  percentageOfLost: number;
}

export interface LostLeadAnalysisResult {
  summary: LostLeadSummary;
  reasonDistribution: ReasonDistribution[];
  stageAtLossDistribution: StageAtLossDistribution[];
  tableData: IPaginateResult<ILeadDoc>;
}

export const emptyPaginateResult: IPaginateResult<ILeadDoc> = {
  docs: [],
  results: [],
  page: 1,
  limit: 10,
  totalPages: 0,
  totalDocs: 0,
};

export interface ActivityStats {
  total: number;
  success: number;
  pending: number;
}

export interface TeamActivityData {
  id: string;
  teamMember: string;
  calls: ActivityStats;
  callsSuccessRate: number;
  meetings: ActivityStats;
  meetingsSuccessRate: number;
  siteVisits: ActivityStats;
  siteVisitsSuccessRate: number;
  totalActivities: number;
  overallSuccessRate: number;
  sales: { count: number; value: number };
  activitySaleRatio: number;
}

export interface TeamActivityDetailsSummary {
  totalActivities: number;
  completed: number;
  pending: number;
  overdue: number;
  cancelled: number;
}

export interface TeamActivityDistributionItem {
  activityType: string;
  count: number;
}

export interface TeamActivityStatusByTypeItem {
  activityType: string;
  completed: number;
  pending: number;
  overdue: number;
  cancelled: number;
}

export interface TeamActivityDetailsTableItem {
  id: string;
  dateTime: string;
  activityType: string;
  teamMember: string;
  leadName: string;
  contactNumber: string;
  project: string;
  activityStatus: string;
  leadStage: string;
  leadSource: string;
  notes: string;
  nextActivityDate: string | null;
  nextActivityType: string | null;
}

export interface TeamActivityDetailsFilterOption {
  id: string;
  name: string;
}

export interface TeamActivityDetailsFilters {
  assignedTo?: string;
  activityType?: string;
  status?: string;
  source?: string;
  sourceId?: string;
  leadStage?: string;
  leadStageId?: string;
  projectId?: string;
  project?: string;
  propertyId?: string;
  view?: 'overview' | 'detail' | 'all';
  startDate?: string | Date;
  endDate?: string | Date;
  search?: string;
}

export interface TeamActivityDetailsReportData {
  summary: TeamActivityDetailsSummary;
  activityDistribution: TeamActivityDistributionItem[];
  activityStatusByType: TeamActivityStatusByTypeItem[];
  tableData: {
    results: TeamActivityDetailsTableItem[];
    page: number;
    limit: number;
    totalPages: number;
    totalResults: number;
  };
  filterOptions: {
    teamMembers: TeamActivityDetailsFilterOption[];
    activityTypes: Array<{ value: string; label: string }>;
    activityStatuses: Array<{ value: string; label: string }>;
    projects: TeamActivityDetailsFilterOption[];
    leadStages: TeamActivityDetailsFilterOption[];
    leadSources: TeamActivityDetailsFilterOption[];
  };
}

export interface TeamMemberLite {
  _id: Types.ObjectId;
  firstName?: string;
  lastName?: string;
}

export interface StagePerformance {
  count: number;
  percentage: number;
  stageName: string;
}

export interface CaptureLeadStages {
  name: string;
  stages: Record<string, number>;
}

export interface LeadSourcePerformanceData {
  id: string; // source _id
  source: string;
  totalLeads: number;
  stages: Record<string, StagePerformance>;
  captuerLeads: CaptureLeadStages[];
  finalBookings: number;
  conversionRate: number;
  // New stage count fields
  newLeads: number;
  contacted: number;
  qualified: number;
  proposal: number;
  negotiation: number;
  won: number;
  lost: number;
}

export interface LeadSourceData {
  id: string;
  source: string;
  totalLeads: number;
  qualifiedLeads: number;
  dealsClosed: number;
  conversionRate: number;
  totalTransactionValue: number;
  avgDealValue: number;
  contributionToSales: number;
  avgClosureTime: number;
}

export interface SalesAgingClosedDealItem {
  id: string;
  leadId: string;
  teamMember: {
    id: string;
    name: string;
    avatar: string | null;
  };
  transactionType: string;
  projectId: string | null;
  projectProperty: string;
  customerName: string;
  dealValue: number;
  leadCreatedDate: string;
  dealClosedDate: string;
  closureDuration: number;
}

export interface SalesAgingOpenDealItem {
  id: string;
  leadId: string;
  teamMember: {
    id: string;
    name: string;
    avatar: string | null;
  };
  customerName: string;
  projectId: string | null;
  projectProperty: string;
  leadStage: string;
  leadCreatedDate: string;
  agingBucket: string;
  lastActivityDate: string;
  nextFollowup: string | null;
}

export interface SalesAgingBucketCount {
  bucket: string;
  count: number;
}

export interface SalesAgingStageCount {
  stage: string;
  count: number;
}

export interface SalesAgingTransactionClosure {
  transactionType: string;
  avgDays: number;
  deals: number;
}

export interface SalesAgingClosedOverview {
  totalClosedDeals: number;
  avgClosureDuration: number;
  fastestClosure: number;
  totalDealValue: number;
  closureDurationByTransactionType: SalesAgingTransactionClosure[];
  closureDurationDistribution: SalesAgingBucketCount[];
}

export interface SalesAgingOpenOverview {
  totalOpenLeads: number;
  leadsNeedingFollowup: number;
  agingOverThirtyDays: number;
  noFollowupScheduled: number;
  leadsByAgingBucket: SalesAgingBucketCount[];
  leadsByStage: SalesAgingStageCount[];
}

export interface SalesAgingReportData {
  closedOverview: SalesAgingClosedOverview;
  openOverview: SalesAgingOpenOverview;
  closedDeals: SalesAgingClosedDealItem[];
  openDeals: SalesAgingOpenDealItem[];
}

export interface TeamMemberConversionData {
  id: string;
  name: string;
  leadsHandled: number;
  dealsClosed: number;
  conversionRate: number;
  avgDays: number;
}

export interface LeadSourceConversionData {
  id: string;
  source: string;
  leads: number;
  deals: number;
  conversionRate: number;
  avgDays: number;
}

export interface TransactionTypeConversionData {
  id: string;
  type: string;
  leads: number;
  deals: number;
  conversionRate: number;
}

export interface ProjectConversionData {
  id: string;
  projectName: string;
  leads: number;
  deals: number;
  conversionRate: number;
  totalSales: number;
}

export interface SalesConversionResponse {
  teamMemberConversionData: TeamMemberConversionData[];
  leadSourceConversionData: LeadSourceConversionData[];
  transactionTypeConversionData: TransactionTypeConversionData[];
  projectConversionData: ProjectConversionData[];
}

export interface SalesComparisonResult {
  id: string;
  period: string; // e.g. "Jan-25", "Q1-25", "2025"
  sellDeals: number;
  rentDeals: number;
  leaseDeals: number;
  preLeaseDeals: number;
  totalDeals: number;
  totalValue: number;
  avgDealValue: number;
  growthPercentage: number | null;
}

export type ComparisonTime = 'monthly' | 'quarterly' | 'yearly';

// Sales Summary Report Interfaces
export interface SalesSummaryAnalytics {
  totalSalesValue: number;
  amountCollected: number;
  collectionRate: number;
  averageSalesValue: number;
  totalSoldUnits: number;
}

export interface SalesChartData {
  pieChart: Array<{ name: string; value: number; id: string }>;
  barChart: Array<{ source: string; value: number; id: string }>;
  lineChart: Array<{ month: string; sales: number; count: number }>;
}

export interface DayWiseSalesData {
  date: string;
  totalBookings: number;
  totalSalesValue: number;
  amountCollected: number;
}

export interface DetailedSalesItem {
  results: Array<{
    id: string;
    bookingDate: string;
    projectName: string;
    unitNumber: string;
    customerName: string;
    totalUnitPrice: number;
    bookingAmount: number;
    source: string;
    leadId: string;
    projectId: string;
    unitId: string;
  }>;
  page: number;
  limit: number;
  totalPages: number;
  totalResults: number;
}

export interface SalesSummaryReport {
  analytics: SalesSummaryAnalytics;
  charts: SalesChartData;
  detailedList: DetailedSalesItem;
  filterOptions: {
    entities: Array<{ id: string; name: string }>;
    sources: Array<{ id: string; name: string }>;
  };
}

export interface SalesSummaryFilters {
  userType?: 'broker' | 'builder';
  startDate?: string;
  endDate?: string;
  projectId?: string;
  propertyId?: string;
  sourceId?: string;
  source?: string;
  view?: 'overview' | 'detail' | 'all';
  categoryId?: string;
  subCategoryId?: string;
  dateRange?:
    | 'last_month'
    | 'last_6_months'
    | 'last_3_months'
    | 'this_month'
    | 'custom';
}
