import { Controller, Get, Query, Res, UseGuards } from "@nestjs/common"
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { ReportService } from "./report.service"
import { TripSummaryDto } from "../dto/trip-summary.dto"
import { DispatcherPerformanceDto } from "../dto/dispatcher-performance.dto"
import { CustomerTransportHistoryDto } from "../dto/customer-transport-history.dto"
import { HospitalReportDto } from "../dto/hospital-report.dto"
import { DriverPerformanceDto } from "../dto/driver-performance.dto"
import { VehicleUtilizationDto } from "../dto/vehicle-utilization.dto"
import { PaymentCollectionSummaryDto } from "../dto/payment-collection-summary.dto"
import { AnnualTransportBusinessSummaryDto } from "../dto/annual-transport-business-summary.dto"
import { PendingPaymentsOutstandingDto } from "../dto/pending-payments-outstanding.dto"
import { Response } from "express"

@ApiTags("Report")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@Controller("report")
export class ReportController {
  constructor(private readonly reportService: ReportService) {}

  @Get("trip-summary")
  async getReport(@Query() query: TripSummaryDto, @Res() res: Response) {
    const {
      start_date,
      end_date,
      driver_id,
      dispatcher_id,
      client_id,
      city_id,
      service_type,
      status,
      search,
      skip,
      limit,
      is_export,
    } = query

    const result = await this.reportService.tripSummary({
      start_date,
      end_date,
      driver_id: driver_id ? +driver_id : undefined,
      dispatcher_id: dispatcher_id ? +dispatcher_id : undefined,
      client_id: client_id ? +client_id : undefined,
      city_id: city_id ? +city_id : undefined,
      service_type,
      status,
      search,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=trip-summary-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("dispatcher-performance")
  async getDispatcherPerformanceReport(
    @Query() query: DispatcherPerformanceDto,
    @Res() res: Response,
  ) {
    const {
      start_date,
      end_date,
      dispatcher_id,
      search,
      skip,
      limit,
      is_export,
    } = query

    const result = await this.reportService.dispatcherPerformance({
      start_date,
      end_date,
      dispatcher_id: dispatcher_id ? +dispatcher_id : undefined,
      search,
      skip: skip ? (skip ? +skip : 0) : 0,
      limit: limit ? (limit ? +limit : 10) : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=dispatcher-performance-${Date.now()}.xlsx`,
      )

      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("customer-transport-history")
  async getCustomerTransportHistoryReport(
    @Query() query: CustomerTransportHistoryDto,
    @Res() res: Response,
  ) {
    const { search, skip, limit, is_export } = query

    const result = await this.reportService.customerTransportHistory({
      search,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=customer-transport-history-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("hospital-report")
  async getHospitalReport(
    @Query() query: HospitalReportDto,
    @Res() res: Response,
  ) {
    const { search, state, skip, limit, is_export } = query

    const result = await this.reportService.hospitalReport({
      search,
      state,
      skip: skip ? (skip ? +skip : 0) : 0,
      limit: limit ? (limit ? +limit : 10) : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=hospital-report-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("driver-performance")
  async getDriverPerformanceReport(
    @Query() query: DriverPerformanceDto,
    @Res() res: Response,
  ) {
    const { start_date, end_date, driver_id, search, skip, limit, is_export } =
      query

    const result = await this.reportService.driverPerformance({
      start_date,
      end_date,
      driver_id: driver_id ? +driver_id : undefined,
      search,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=driver-performance-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("vehicle-utilization")
  async getVehicleUtilizationReport(
    @Query() query: VehicleUtilizationDto,
    @Res() res: Response,
  ) {
    const { search, skip, limit, is_export, state, vehicle_type } = query

    const result = await this.reportService.vehicleUtilization({
      search,
      state,
      vehicle_type,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=vehicle-utilization-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("payment-collection-summary")
  async getPaymentCollectionSummaryReport(
    @Query() query: PaymentCollectionSummaryDto,
    @Res() res: Response,
  ) {
    const {
      start_date,
      end_date,
      search,
      client_id,
      payment_method,
      skip,
      limit,
      is_export,
    } = query

    const result = await this.reportService.paymentCollectionSummary({
      start_date,
      end_date,
      search,
      client_id,
      payment_method,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=payment-collection-summary-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("pending-payments-outstanding")
  async getPendingPaymentsOutstandingReport(
    @Query() query: PendingPaymentsOutstandingDto,
    @Res() res: Response,
  ) {
    const { start_date, end_date, search, client_id, skip, limit, is_export } =
      query

    const result = await this.reportService.pendingPaymentsOutstandingReport({
      start_date,
      end_date,
      search,
      client_id,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=pending-payments-outstanding-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }

  @Get("annual-transport-business-summary")
  async getAnnualTransportBusinessSummaryReport(
    @Query() query: AnnualTransportBusinessSummaryDto,
    @Res() res: Response,
  ) {
    const { year, search, skip, limit, is_export } = query

    const result = await this.reportService.annualTransportBusinessSummary({
      year,
      search,
      skip: skip ? +skip : 0,
      limit: limit ? +limit : 10,
      is_export: is_export === "true",
    })

    if (is_export === "true") {
      res.setHeader(
        "Content-Type",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      )
      res.setHeader(
        "Content-Disposition",
        `attachment; filename=annual-transport-business-summary-${Date.now()}.xlsx`,
      )
      return res.send(result?.data)
    }

    return res.json(result)
  }
}
