import { useState, useEffect, useCallback } from 'react';
import { toast } from 'sonner';
import cnabService from '../services/cnabService';
import { useCnabStore } from './useCnabStore';

/**
 * Hook customizado para o Dashboard CNAB alinhado com o backend real
 * Suporta visões de Gráficos (Dashboard) e Logs (Relatórios)
 */
export const useCnabDashboard = () => {
    const { paymentMode } = useCnabStore();
    const isTed = paymentMode === 'TED';

    // Estados de Controle de UI
    const [view, setView] = useState('Menu'); // 'Menu' (Gráficos) ou 'Relatorios' (Logs)
    const [loading, setLoading] = useState(true);
    const [timeFilter, setTimeFilter] = useState('Todos'); // 'Ano', 'Mes', 'Todos'

    // Dados para visão MENU (Gráficos)
    const [stats, setStats] = useState([]);
    const [chartData, setChartData] = useState([]);
    const [reportData, setReportData] = useState([]); // Tabela da visão de Dashboard

    // Dados para visão RELATÓRIOS (Logs)
    const [logsData, setLogsData] = useState([]);

    /**
     * Carrega dados da visão principal (DASHBOARD / GRÁFICOS)
     */
    const loadDashboardData = useCallback(async () => {
        setLoading(true);
        try {
            const date = new Date();
            const params = {};
            if (timeFilter === 'Ano') params.ano = date.getFullYear();
            if (timeFilter === 'Mes') {
                params.mes = date.getMonth() + 1;
                params.ano = date.getFullYear();
            }

            // 1. Totais (Stats)
            const totals = await cnabService.getDashboardTotal(params, isTed);
            const favData = Array.isArray(totals) ? totals[0] : (totals.Base_Dados_API || totals);

            setStats([
                { 
                    title: 'Total Favorecidos Pagos no Período', 
                    value: String(favData.total_favorecidos || 0), 
                    detail: 'Favorecidos com pagamento no período', 
                    icon: 'people' 
                },
                { 
                    title: 'Valor Total', 
                    value: `R$ ${parseFloat(favData.total_valor_pagamento || 0).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}`, 
                    detail: 'Volume Financeiro', 
                    icon: 'currency' 
                },
                { 
                    title: 'Qtd. Remessas', 
                    value: String(favData.total_remessas || 0), 
                    detail: 'Arquivos Gerados', 
                    icon: 'files' 
                },
            ]);

            // 2. Dados do Gráfico (Fluxo por mês)
            const remessasMes = await cnabService.getDashboardRemessasMes(isTed);
            const rawChart = Array.isArray(remessasMes) ? remessasMes : (remessasMes.Base_Dados_API || []);
            const formattedChart = rawChart.map(item => ({
                name: `${item.mes}/${item.ano % 100}`,
                valor: (item.remessas || []).reduce((acc, r) => acc + (parseFloat(r.total) || 0), 0),
                quantidade: (item.remessas || []).reduce((acc, r) => acc + (parseInt(r.quantidade) || 0), 0)
            })).reverse();
            setChartData(formattedChart);

            // 3. Tabela de Remessas Recentes
            const remessasPorData = await cnabService.getDashboardRemessasPorData(isTed);
            const rawTable = Array.isArray(remessasPorData) ? remessasPorData : (remessasPorData.Base_Dados_API || []);
            
            // Flatten dos dados resiliente com normalização de campos
            const flatData = [];
            rawTable.forEach(day => {
                // Se o item já tiver campos de remessa (ex: VALOR_PAGAMENTO), adiciona direto
                if (day.VALOR_PAGAMENTO || day.NOME_FAVORECIDO) {
                    flatData.push(day);
                } 
                // Se vier agrupado por data (estilo legado)
                else if (day.remessas && Array.isArray(day.remessas)) {
                    day.remessas.forEach(r => {
                        flatData.push({
                            ...r,
                            data_pagamento: day.data_pagamento || r.data_pagamento,
                            // Normalização: mapear 'total' para 'VALOR_PAGAMENTO' se necessário
                            VALOR_PAGAMENTO: r.VALOR_PAGAMENTO || r.total || 0
                        });
                    });
                }
                // Se vier como objeto direto com campo 'total' (estrutura atual da API)
                else if (day.total !== undefined || day.n_remessa) {
                    flatData.push({
                        ...day,
                        // Normalização: mapear 'total' para 'VALOR_PAGAMENTO' se necessário
                        VALOR_PAGAMENTO: day.VALOR_PAGAMENTO || day.total || 0
                    });
                }
            });
            setReportData(flatData);

        } catch (error) {
            console.error('[useCnabDashboard] Erro no carregamento do dashboard:', error);
            toast.error('Erro ao sincronizar dados do dashboard.');
        } finally {
            setLoading(false);
        }
    }, [isTed, timeFilter, paymentMode]);

    /**
     * Carrega dados da visão de RELATÓRIOS (LOGS)
     */
    const loadRelatoriosData = useCallback(async () => {
        setLoading(true);
        try {
            const logs = await cnabService.getRelatoriosLogs(isTed);
            const logsContent = Array.isArray(logs) ? logs : (logs.Base_Dados_API || []);
            setLogsData(logsContent);
        } catch (error) {
            console.error('[useCnabDashboard] Erro no carregamento de relatórios:', error);
            toast.error('Erro ao carregar logs de remessa.');
        } finally {
            setLoading(false);
        }
    }, [isTed, paymentMode]);

    /**
     * Exportação de Relatórios
     */
    const handleExport = useCallback(async () => {
        try {
            toast.loading('Preparando exportação...');
            const blob = await cnabService.exportRelatorioDashboard(isTed);
            const url = window.URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = `Relatorio_CNAB_${paymentMode}_${new Date().getTime()}.xlsx`;
            document.body.appendChild(a);
            a.click();
            window.URL.revokeObjectURL(url);
            document.body.removeChild(a);
            toast.dismiss();
            toast.success('Relatório exportado com sucesso.');
        } catch (error) {
            console.error(error);
            toast.dismiss();
            toast.error('Erro ao exportar relatório.');
        }
    }, [isTed, paymentMode]);

    // Efeito para carregar dados baseados na visão selecionada
    useEffect(() => {
        if (view === 'Menu') {
            loadDashboardData();
        } else if (view === 'Relatorios') {
            loadRelatoriosData();
        }
    }, [view, loadDashboardData, loadRelatoriosData]);

    const refresh = useCallback(() => {
        if (view === 'Menu') return loadDashboardData();
        return loadRelatoriosData();
    }, [view, loadDashboardData, loadRelatoriosData]);

    return {
        view,
        setView,
        loading,
        timeFilter,
        setTimeFilter,
        stats,
        chartData,
        reportData,
        logsData,
        handleExport,
        refresh,
        paymentMode,
        isTed
    };
};

