import { generateQueryString } from "@/utils/queryStringUtil";
import { apiSlice } from ".";
import URLS from "./constants";

// --- Response Types ---
interface StageData {
  id: string;
  stage: string;
  count: number;
  percentage: string;
  avgScore: number;
  color: string;
}
interface Statics {
  totalLeads: number;
  conversionRate: string;
  bottleneck: {
    stage: string;
    count: number;
  };
  avgLeadScore: number;
}
interface LeadStageDistributionResponse {
  code: number;
  message: string;
  success: boolean;
  data: {
    stageData: StageData[];
    statics: Statics;
  };
}

// --- Lost Leads Analysis Types ---
interface LostLeadsSummary {
  totalLostLeads: number;
  averageLeadAge: number;
  topLostReason: string;
}
interface ReasonDistribution {
  reason: string;
  leadsLost: number;
  percentageOfLost: number;
}
interface StageAtLossDistribution {
  stage: string;
  leadsLost: number;
  percentageOfLost: number;
}
export interface LostLeadDetail {
  contactDetails: {
    name: string;
    email?: string;
    companyName?: string;
  };
  contact: {
    firstName: string;
    lastName?: string;
    phone: { countryCode: number; number: number; isPrimary: boolean }[];
    companyName?: string;
    createdOn?: string | null;
    updatedOn?: string | null;
    id: string;
  };
  source: { id: string; name: string };
  company: { name: string; companyType: string; id: string };
  leadStage: { color: string; id: string };
  priority: string;
  assignedTo: { firstName: string; lastName: string; id: string };
  interestType: string;
  propertyType: any[];
  createdBy: { id: string };
  updatedBy?: { id: string };
  shortlisted: any[];
  removed: any[];
  buyingPreference: string;
  loanRequired: boolean;
  loanStage?: string;
  purpose?: { id: string };
  project?: { id: string; projectName: string };
  preferredLocalities: any[];
  budget: number;
  createdAt: string;
  updatedAt: string;
  reason: string;
  notes?: string;
  createdOn: string;
  updatedOn: string;
  id: string;
  phoneNumber: string;
  name: string;
  leadStageName: string;
  email?: string;
  previousLeadStage?: { id: string; stageName: string };
  transferEndDate?: string;
  transferFrom?: { id: string };
  transferStartDate?: string;
  transferType?: string;
  lastPermissionUpdate?: string;
  leadScore?: number;
}

interface LostLeadsAnalysisResponse {
  code: number;
  message: string;
  success: boolean;
  data: {
    summary: LostLeadsSummary;
    reasonDistribution: ReasonDistribution[];
    stageAtLossDistribution: StageAtLossDistribution[];
    tableData: {
      results: LostLeadDetail[];
      page: number;
      limit: number;
      totalPages: number;
      totalResults: number;
    };
  };
}

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

interface TeamActivitySummaryResponse {
  code: number;
  message: string;
  success: boolean;
  data: TeamActivityData[];
}

interface StageTransition {
  count: number;
  percentage: number;
  stageName: string;
}

export interface LeadSourcePerformance {
  id: string;
  source: string;
  totalLeads: number;
  stages: Record<string, StageTransition>; // ✅ dynamic keys handled
  finalBookings: number;
  conversionRate: number;
}

interface LeadSourcePerformanceResponse {
  code: number;
  message: string;
  data: LeadSourcePerformance[];
}

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

interface SalesByLeadSourceResponse {
  code: number;
  message: string;
  data: LeadSourceData[];
}

// --- Sales Conversion Rate Types ---
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;
}

interface SalesConversionRateResponse {
  code: number;
  message: string;
  success: boolean;
  data: {
    teamMemberConversionData: TeamMemberConversionData[];
    leadSourceConversionData: LeadSourceConversionData[];
    transactionTypeConversionData: TransactionTypeConversionData[];
    projectConversionData: ProjectConversionData[];
  };
}

export interface SalesPerformanceByAgent {
  id: string;
  name: string;
  totalLeads: number;
  sellCount: number;
  rentCount: number;
  leaseCount: number;
  buyCount: number;
  totalDeals: number;
  totalTransactionValue: number;
  avgDealValue: number;
  fastestClosure: number | null;
  avgClosureTime: number | null;
  conversionRate: number;
}

interface SalesPerformanceByAgentResponse {
  code: number;
  message: string;
  success: boolean;
  data: SalesPerformanceByAgent[];
}

export interface SalesByPropertyType {
  id: string;
  sellCount: number;
  rentCount: number;
  leaseCount: number;
  preLeaseCount: number;
  totalTransactions: number;
  totalValue: number;
  category: string;
  subCategory: string;
  configuration: string;
}

interface SalesByPropertyTypeResponse {
  code: number;
  message: string;
  success: boolean;
  data: SalesByPropertyType[];
}

export interface MonthlyYearlySalesComparison {
  id: string;
  period: string;
  sellDeals: number;
  rentDeals: number;
  leaseDeals: number;
  preLeaseDeals: number;
  totalDeals: number;
  totalValue: number;
  avgDealValue: number;
  growthPercentage: number | null;
}

interface MonthlyYearlySalesComparisonResponse {
  code: number;
  message: string;
  data: MonthlyYearlySalesComparison[];
  success: boolean;
}

// --- API ---
export const reportsApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getLeadStageDistribution: builder.query<
      LeadStageDistributionResponse,
      void
    >({
      query: () => ({
        url: `${URLS.REPORTS}?type=lead-stage-distribution`,
        method: "GET",
      }),
    }),
    getLostLeadsAnalysis: builder.query<
      LostLeadsAnalysisResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        company?: string;
        populate?: string;
        includeTimeStamps?: boolean;
        sortBy?: string;
        alias?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.REPORTS}?type=lost-leads-analysis&${generateQueryString(
          params as Record<string, unknown>
        )}`,
        method: "GET",
      }),
    }),
    getTeamActivitySummary: builder.query<TeamActivitySummaryResponse, void>({
      query: () => ({
        url: `${URLS.REPORTS}?type=team-activity-summary`,
        method: "GET",
      }),
    }),
    getLeadSourcePerformanceAnalysis: builder.query<
      LeadSourcePerformanceResponse,
      void
    >({
      query: () => ({
        url: `${URLS.REPORTS}?type=lead-source-performance-analysis`,
        method: "GET",
      }),
    }),
    getSalesByLeadSource: builder.query<SalesByLeadSourceResponse, void>({
      query: () => ({
        url: `${URLS.REPORTS}?type=sales-by-lead-source`,
        method: "GET",
      }),
    }),
    getSalesConversionRate: builder.query<SalesConversionRateResponse, void>({
      query: () => ({
        url: `${URLS.REPORTS}?type=sales-conversion-rate`,
        method: "GET",
      }),
    }),
    getSalesPerformanceByAgent: builder.query<
      SalesPerformanceByAgentResponse,
      void
    >({
      query: () => ({
        url: `${URLS.REPORTS}?type=sales-performance-by-agent`,
        method: "GET",
      }),
    }),
    getSalesByPropertyType: builder.query<SalesByPropertyTypeResponse, void>({
      query: () => ({
        url: `${URLS.REPORTS}?type=sales-by-property-type`,
        method: "GET",
      }),
    }),
    getMonthlyYearlySalesComparison: builder.query<
      MonthlyYearlySalesComparisonResponse,
      { time: "monthly" | "yearly" | "quarterly" }
    >({
      query: ({ time }) => ({
        url: `${URLS.REPORTS}?type=monthly-yearly-sales-comparison&time=${time}`,
        method: "GET",
      }),
    }),
  }),
});

export const {
  useGetLeadStageDistributionQuery,
  useGetLostLeadsAnalysisQuery,
  useGetTeamActivitySummaryQuery,
  useGetLeadSourcePerformanceAnalysisQuery,
  useGetSalesByLeadSourceQuery,
  useGetSalesConversionRateQuery,
  useGetSalesPerformanceByAgentQuery,
  useGetSalesByPropertyTypeQuery,
  useGetMonthlyYearlySalesComparisonQuery,
} = reportsApi;
