import { Request, Response } from 'express';

import * as reportsService from '@/modules/reports/reports.service';
import catchAsync from '@/shared/utils/catchAsync';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { pick } from '@/shared/utils';

const { ReportsResponseCodes } = responseCodes;

export const getReports = catchAsync(async (req: Request, res: Response) => {
  const companyId = req.user?.company?.id;
  const userId = req.user?.id;
  const { type, time } = pick(req.query, ['type', 'time']);

  const filter = pick(req.query, [
    'company',
    'leadStage',
    'leadStageId',
    'companyName',
    'source',
    'sourceId',
    'search',
    'createdBy',
    'assignedTo',
    'activityType',
    'status',
    'userType',
    'startDate',
    'endDate',
    'projectId',
    'project',
    'propertyId',
    'categoryId',
    'subCategoryId',
    'dateRange',
    'view',
  ]);
  const options = pick(req.query, [
    'sortBy',
    'limit',
    'page',
    'fields',
    'populate',
    'includeTimeStamps',
    'alias',
  ]);

  let reports;

  switch (type) {
    case 'lead-stage-distribution':
      reports = await reportsService.leadDistributionStage(companyId,filter);
      break;

    case 'lost-leads-analysis':
      reports = await reportsService.lostLeadAnalysis(
        companyId,
        filter,
        options,
      );
      break;

    case 'team-activity-summary':
      reports = await reportsService.teamActivityPerformance(userId, companyId, filter);
      break;

    case 'team-activity-details':
      reports = await reportsService.teamActivityDetailsReport(
        companyId,
        filter,
        options,
      );
      break;

    case 'lead-source-performance-analysis':
      reports = await reportsService.leadSourcePerformance(companyId, filter);
      break;

    case 'sales-by-lead-source':
      reports = await reportsService.salesByLeadSource(companyId, filter);
      break;

    case 'sales-conversion-rate':
      reports = await reportsService.salesConversionRate(userId, companyId, filter);
      break;

    case 'sales-performance-by-agent':
      reports = await reportsService.salesPerformanceByAgent(companyId,filter);
      break;

    case 'sales-by-property-type':
      reports = await reportsService.salesByPropertyType(companyId,filter);
      break;

    case 'monthly-yearly-sales-comparison':
      reports = await reportsService.monthlyYearlySalesComparison(
        companyId,
        time,
      );
      break;

    case 'sales-aging-report':
      reports = await reportsService.salesAgingReport(companyId, filter, {
        userId,
        userType: req.user?.userType,
      });
      console.log("reports",reports);
      break;

    case 'sales-summary':
      reports = await reportsService.salesSummary({companyId, filter, options});
      break;

    default:
      return res.success(
        null,
        ReportsResponseCodes.INVALID_TYPE,
        `Invalid report type: ${type}`,
      );
  }

  res.success(
    reports,
    ReportsResponseCodes.SUCCESS,
    'Report fetched successfully',
  );
});
