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;
  };
}

export type LeadStageDistributionQueryParams = {
  startDate?: string;
  endDate?: string;
};

// --- 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: unknown[];
  createdBy: { id: string };
  updatedBy?: { id: string };
  shortlisted: unknown[];
  removed: unknown[];
  buyingPreference: string;
  loanRequired: boolean;
  loanStage?: string;
  purpose?: { id: string };
  project?: { id: string; projectName: string };
  preferredLocalities: unknown[];
  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;
}

export type TeamActivitySummaryQueryParams = {
  startDate?: string;
  endDate?: string;
};

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

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 TeamActivityDetailsItem {
  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 TeamActivityDetailsReportData {
  summary: TeamActivityDetailsSummary;
  activityDistribution: TeamActivityDistributionItem[];
  activityStatusByType: TeamActivityStatusByTypeItem[];
  tableData: {
    results: TeamActivityDetailsItem[];
    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[];
  };
}

interface TeamActivityDetailsResponse {
  code: number;
  message: string;
  success: boolean;
  data: TeamActivityDetailsReportData;
}

export type TeamActivityDetailsReportQueryParams = {
  page?: number;
  limit?: number;
  view?: "all" | "overview" | "detail";
  search?: string;
  assignedTo?: string;
  activityType?: string;
  status?: string;
  projectId?: string;
  leadStageId?: string;
  sourceId?: string;
  startDate?: string;
  endDate?: string;
};

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

export interface CaptureLeadStage {
  "New Lead": number;
  Contacted: number;
  Interested: number;
  "Visit Completed": number;
  Negotiation: number;
  "Lead Won": number;
  "Lead Lost": number;
}

export interface CaptureLeadItem {
  name: string;
  stages: CaptureLeadStage;
}

export interface LeadSourcePerformance {
  id: string;
  source: string;
  platform?: string;
  totalLeads: number;
  stages: Record<string, StageTransition>; // kept for backward compatibility
  finalBookings: number;
  conversionRate: number;
  captuerLeads?: CaptureLeadItem[];
  // Explicit stage-wise counts from backend
  newLeads?: number;
  contacted?: number;
  qualified?: number;
  proposal?: number;
  negotiation?: number;
  won?: number;
  lost?: 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[];
}

export type LeadSourceReportQueryParams = {
  project?: string;

  source?: string;
  startDate?: string;
  endDate?: string;
};

// --- 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;
}

export type SalesConversionRateQueryParams = {
  startDate?: string;
  endDate?: string;
};

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;
}

export type SalesPerformanceByAgentQueryParams = {
  startDate?: string;
  endDate?: string;
};

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;
}

export type SalesByPropertyTypeQueryParams = {
  startDate?: string;
  endDate?: 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;
}

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

export interface SalesSummaryPieChart {
  id: string;
  name: string;
  value: number;
}

export interface SalesSummaryBarChart {
  id: string;
  source: string;
  value: number;
}

export interface SalesSummaryLineChart {
  month: string;
  sales: number;
  count: number;
}

export interface SalesSummaryCharts {
  pieChart: SalesSummaryPieChart[];
  barChart: SalesSummaryBarChart[];
  lineChart: SalesSummaryLineChart[];
}

export interface SalesSummaryDetail {
  id: string;
  bookingDate: string;
  projectName: string;
  unitNumber: string;
  customerName: string;
  totalUnitPrice: number;
  bookingAmount: number;
  source: string;
  leadId: string;
  projectId: string;
  unitId: string;
}

export interface SalesSummaryDetailedList {
  results: SalesSummaryDetail[];
  page: number;
  limit: number;
  totalPages: number;
  totalResults: number;
}

export interface SalesSummaryData {
  analytics: SalesSummaryAnalytics;
  charts: SalesSummaryCharts;
  detailedList: SalesSummaryDetailedList;
  filterOptions?: {
    entities: Array<{ id: string; name: string }>;
    sources: Array<{ id: string; name: string }>;
  };
}

interface SalesSummaryResponse {
  code: number;
  message: string;
  success: boolean;
  data: SalesSummaryData;
}

export type SalesSummaryQueryParams = {
  projectId?: string;
  propertyId?: string;
  sourceId?: string;
  startDate?: string;
  endDate?: string;
  view?: "overview" | "detail" | "all";
};

// --- Sales Aging Report Types ---
export interface SalesAgingDealMember {
  id: string;
  name: string;
  avatar: string | null;
}

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

export interface SalesAgingOpenDeal {
  id: string;
  leadId: string;
  teamMember: SalesAgingDealMember;
  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: Array<{
    bucket: string;
    count: number;
  }>;
}

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

export interface SalesAgingReportData {
  closedOverview: SalesAgingClosedOverview;
  openOverview: SalesAgingOpenOverview;
  closedDeals: SalesAgingClosedDeal[];
  openDeals: SalesAgingOpenDeal[];
}

interface SalesAgingReportResponse {
  code: number;
  message: string;
  success: boolean;
  data: SalesAgingReportData;
}

export type SalesAgingReportQueryParams = {
  projectId?: string;
  propertyId?: string;
  view?: "all" | "closed" | "open";
  startDate?: string;
  endDate?: string;
};

// --- API ---
export const reportsApi = apiSlice.injectEndpoints({
  endpoints: (builder) => ({
    getLeadStageDistribution: builder.query<
      LeadStageDistributionResponse,
      LeadStageDistributionQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=lead-stage-distribution${suffix}`,
          method: "GET",
        };
      },
    }),
    getLostLeadsAnalysis: builder.query<
      LostLeadsAnalysisResponse,
      {
        page?: number;
        limit?: number;
        search?: string;
        company?: string;
        populate?: string;
        includeTimeStamps?: boolean;
        sortBy?: string;
        alias?: string;
        startDate?: string;
        endDate?: string;
      }
    >({
      query: (params) => ({
        url: `${URLS.REPORTS}?type=lost-leads-analysis&${generateQueryString(
          params as Record<string, unknown>,
        )}`,
        method: "GET",
      }),
    }),
    getTeamActivitySummary: builder.query<
      TeamActivitySummaryResponse,
      TeamActivitySummaryQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=team-activity-summary${suffix}`,
          method: "GET",
        };
      },
    }),
    getTeamActivityDetails: builder.query<
      TeamActivityDetailsResponse,
      TeamActivityDetailsReportQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=team-activity-details${suffix}`,
          method: "GET",
        };
      },
    }),
    getLeadSourcePerformanceAnalysis: builder.query<
      LeadSourcePerformanceResponse,
      LeadSourceReportQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=lead-source-performance-analysis${suffix}`,
          method: "GET",
        };
      },
    }),
    getSalesByLeadSource: builder.query<
      SalesByLeadSourceResponse,
      LeadSourceReportQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-by-lead-source${suffix}`,
          method: "GET",
        };
      },
    }),
    getSalesConversionRate: builder.query<
      SalesConversionRateResponse,
      SalesConversionRateQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-conversion-rate${suffix}`,
          method: "GET",
        };
      },
    }),
    getSalesPerformanceByAgent: builder.query<
      SalesPerformanceByAgentResponse,
      SalesPerformanceByAgentQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-performance-by-agent${suffix}`,
          method: "GET",
        };
      },
    }),
    getSalesByPropertyType: builder.query<
      SalesByPropertyTypeResponse,
      SalesByPropertyTypeQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-by-property-type${suffix}`,
          method: "GET",
        };
      },
    }),
    getMonthlyYearlySalesComparison: builder.query<
      MonthlyYearlySalesComparisonResponse,
      { time: "monthly" | "yearly" | "quarterly" }
    >({
      query: ({ time }) => ({
        url: `${URLS.REPORTS}?type=monthly-yearly-sales-comparison&time=${time}`,
        method: "GET",
      }),
    }),
    getSalesSummary: builder.query<
      SalesSummaryResponse,
      SalesSummaryQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-summary${suffix}`,
          method: "GET",
        };
      },
    }),
    getSalesAgingReport: builder.query<
      SalesAgingReportResponse,
      SalesAgingReportQueryParams | void
    >({
      query: (params) => {
        const qs = params
          ? generateQueryString(params as Record<string, unknown>)
          : "";
        const suffix = qs ? `&${qs}` : "";
        return {
          url: `${URLS.REPORTS}?type=sales-aging-report${suffix}`,
          method: "GET",
        };
      },
    }),
  }),
});

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