"use client";

import { useCallback, useEffect, useState } from "react";
import {
  getFinancialReport,
  getFleetReport,
  getMaintenanceReport,
  getReportSummary,
} from "@/services/report-service";
import {
  FinancialReportResponse,
  FleetReportResponse,
  MaintenanceReportResponse,
  ReportFilterParams,
  ReportSummaryStats,
  ReportTabType,
} from "@/types/reports";

export function useReports() {
  const [filters, setFilters] = useState<ReportFilterParams>({
    tab: "financial",
    period: "all",
    search: "",
  });

  const [summary, setSummary] = useState<ReportSummaryStats>({
    totalRevenue: 0,
    totalMaintenanceCost: 0,
    netProfit: 0,
    activeRentalsCount: 0,
    totalEquipmentCount: 0,
    rentedEquipmentCount: 0,
    fleetUtilizationRate: 0,
  });

  const [financialData, setFinancialData] = useState<FinancialReportResponse>({
    items: [],
    summary: { totalReceivables: 0, totalPayables: 0, balance: 0 },
  });

  const [fleetData, setFleetData] = useState<FleetReportResponse>({
    items: [],
  });

  const [maintenanceData, setMaintenanceData] = useState<MaintenanceReportResponse>({
    items: [],
    summary: { totalOrders: 0, totalCost: 0 },
  });

  const [isLoading, setIsLoading] = useState(true);

  const loadData = useCallback(async () => {
    setIsLoading(true);
    try {
      const summaryRes = await getReportSummary(filters);
      setSummary(summaryRes);

      if (filters.tab === "financial") {
        const finRes = await getFinancialReport(filters);
        setFinancialData(finRes);
      } else if (filters.tab === "fleet") {
        const fleetRes = await getFleetReport(filters);
        setFleetData(fleetRes);
      } else if (filters.tab === "maintenance") {
        const mainRes = await getMaintenanceReport(filters);
        setMaintenanceData(mainRes);
      }
    } catch (err) {
      console.error("Erro ao carregar relatórios:", err);
    } finally {
      setIsLoading(false);
    }
  }, [filters]);

  useEffect(() => {
    loadData();
  }, [loadData]);

  const setTab = (tab: ReportTabType) => {
    setFilters((prev) => ({ ...prev, tab }));
  };

  const setPeriod = (period: ReportFilterParams["period"]) => {
    let startDate: string | undefined = undefined;
    let endDate: string | undefined = undefined;

    const now = new Date();

    if (period === "30days") {
      const past = new Date();
      past.setDate(now.getDate() - 30);
      startDate = past.toISOString().split("T")[0];
      endDate = now.toISOString().split("T")[0];
    } else if (period === "month") {
      const firstDay = new Date(now.getFullYear(), now.getMonth(), 1);
      startDate = firstDay.toISOString().split("T")[0];
      endDate = now.toISOString().split("T")[0];
    } else if (period === "year") {
      const firstDayOfYear = new Date(now.getFullYear(), 0, 1);
      startDate = firstDayOfYear.toISOString().split("T")[0];
      endDate = now.toISOString().split("T")[0];
    }

    setFilters((prev) => ({ ...prev, period, startDate, endDate }));
  };

  const setDateRange = (startDate?: string, endDate?: string) => {
    setFilters((prev) => ({ ...prev, startDate, endDate }));
  };

  const setSearch = (search: string) => {
    setFilters((prev) => ({ ...prev, search }));
  };

  const exportCSV = () => {
    let csvContent = "";
    let fileName = `relatorio-${filters.tab}-${new Date().toISOString().split("T")[0]}.csv`;

    if (filters.tab === "financial") {
      csvContent = "ID,Tipo,Descricao,Entidade,Valor (R$),Status,Data Vencimento\n";
      financialData.items.forEach((item) => {
        csvContent += `"${item.id}","${item.type}","${item.description}","${item.entityName}",${item.amount},"${item.status}","${item.dueDate.split("T")[0]}"\n`;
      });
    } else if (filters.tab === "fleet") {
      csvContent = "Codigo,Nome,Categoria,Marca,Modelo,Status,Total Locacoes,Receita Total (R$),Custo Manutencao (R$),Saldo Liquido (R$)\n";
      fleetData.items.forEach((item) => {
        csvContent += `"${item.code}","${item.name}","${item.categoryName}","${item.brand}","${item.model}","${item.status}",${item.totalRentals},${item.totalRevenue},${item.totalMaintenanceCost},${item.netBalance}\n`;
      });
    } else if (filters.tab === "maintenance") {
      csvContent = "Codigo OS,Titulo,Equipamento,Fornecedor/Oficina,Custo (R$),Status,Data Abertura\n";
      maintenanceData.items.forEach((item) => {
        csvContent += `"${item.code}","${item.title}","${item.equipmentName}","${item.supplierName}",${item.cost},"${item.status}","${item.openedAt.split("T")[0]}"\n`;
      });
    }

    const blob = new Blob(["\ufeff" + csvContent], { type: "text/csv;charset=utf-8;" });
    const url = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.setAttribute("href", url);
    link.setAttribute("download", fileName);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  };

  return {
    filters,
    summary,
    financialData,
    fleetData,
    maintenanceData,
    isLoading,
    setTab,
    setPeriod,
    setDateRange,
    setSearch,
    loadData,
    exportCSV,
  };
}
