import React, { useState, useCallback, useRef } from 'react';
import { 
  BarChart3,
  Download,
  Loader2
} from 'lucide-react';
import { motion, AnimatePresence } from 'framer-motion';
import { cn } from '@/lib/utils';
import { toast } from 'sonner';
import { useCnabDashboard } from '../hooks/useCnabDashboard';
import RemessaDetailsModal from '../components/RemessaDetailsModal';
import PagamentosDetailsModal from '../components/PagamentosDetailsModal';
import cnabService from '../services/cnabService';
import { useCnabStore } from '../hooks/useCnabStore';
import { CnabRemessaExportAgent } from '../utils/CnabRemessaExportAgent';

// Importando subcomponentes isolados (Crucial para evitar React Error #310)
import DashboardMenu from '../components/dashboard/DashboardMenu';

const DashboardView = () => {
  const { 
    view, setView,
    loading,
    timeFilter, setTimeFilter,
    stats,
    chartData,
    reportData,
    logsData,
    handleExport,
    paymentMode
  } = useCnabDashboard();

  // Store para obter o banco selecionado
  const { selectedBank } = useCnabStore();
  
  // Instância do agente de exportação (persistente entre renders)
  const exportAgent = useRef(new CnabRemessaExportAgent()).current;

  // 2. States locais para Modais
  const [selectedRemessa, setSelectedRemessa] = useState(null);
  const [remessaDetails, setRemessaDetails] = useState([]);
  const [loadingDetails, setLoadingDetails] = useState(false);
  /** Linha da tabela de Relatórios para o modal de detalhes (nomes_remessa_valores) — sem rota extra */
  const [selectedDetailRow, setSelectedDetailRow] = useState(null);

  // 3. Callbacks de formatação (Memoizados)
  const formatMoney = useCallback((val) => {
    const numVal = parseFloat(val);
    if (isNaN(numVal) || numVal === null || numVal === undefined) return 'R$ 0,00';
    return `R$ ${numVal.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
  }, []);
  
  const formatDoc = useCallback((val) => {
    const clean = String(val || "").replace(/\D/g, "");
    if (clean.length === 11) return clean.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, "$1.$2.$3-$4");
    if (clean.length === 14) return clean.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, "$1.$2.$3/$4-$5");
    return val;
  }, []);

  // 4. Handlers de Ação
  const handleExportRemessa = useCallback(async (nRemessa, record = null) => {
    if (!nRemessa) {
      toast.error('Número de remessa não informado');
      return;
    }

    try {
      // 1. Validação via Agente
      const validation = exportAgent.validateExport(record || { n_remessa: nRemessa }, selectedBank, paymentMode);
      if (!validation.valid) {
        toast.error(`Erro de validação: ${validation.errors.join(', ')}`);
        return;
      }

      // 2. Determinação de Banco e Tipo via Agente
      const { bank, type } = exportAgent.determineBankAndType(
        record || { n_remessa: nRemessa },
        selectedBank,
        paymentMode
      );

      console.log(`[handleExportRemessa] Iniciando exportação - Banco: ${bank}, Tipo: ${type}, Remessa: ${nRemessa}`);

      // 3. Consulta lista de arquivos
      toast.loading('Consultando arquivos disponíveis...');
      const filesList = await cnabService.getRemessaFilesList(bank, paymentMode);
      
      // O serviço retorna { arquivos: [...], quantidade_arquivos: X }
      if (!filesList || !filesList.arquivos || filesList.arquivos.length === 0) {
        toast.error('Nenhum arquivo encontrado na listagem');
        return;
      }

      console.log(`[handleExportRemessa] Lista recebida. Buscando arquivo...`);

      // 4. Busca nome do arquivo via Agente (passa o objeto com arquivos)
      const filename = exportAgent.findFilenameInList(filesList, type, nRemessa);

      // 5. Fallback para download direto caso não ache na lista (comportamento legado robusto)
      if (!filename) {
        console.warn(`[handleExportRemessa] Arquivo não encontrado na listagem. Tentando download direto pelo ID...`);
        const totalArquivos = filesList.arquivos.length;
        const manualFilename = nRemessa.toString().includes('.REM') ? nRemessa : `${nRemessa}.REM`;
        
        toast.dismiss();
        toast.warning('Arquivo não encontrado na listagem', {
          description: `Não foi possível localizar o arquivo para a remessa #${nRemessa}. Foram encontrados ${totalArquivos} arquivo(s) disponível(is), mas nenhum corresponde. Tentando download direto...`
        });
        
        try {
          const blob = await cnabService.exportRemessaFile(bank, paymentMode, manualFilename);
          if (!blob) {
            toast.error('Arquivo não encontrado', {
              description: `O arquivo ${manualFilename} não foi encontrado no servidor. Verifique se o número da remessa está correto ou se o arquivo foi gerado.`
            });
            return;
          }
          
          downloadBlob(blob, manualFilename);
        } catch (fallbackError) {
          toast.error('Erro ao tentar download direto', {
            description: `Não foi possível baixar o arquivo ${manualFilename}. Verifique se a remessa existe e está disponível.`
          });
        }
        return;
      }

      console.log(`[handleExportRemessa] Arquivo encontrado: ${filename}`);

      // 6. Download do arquivo encontrado
      toast.dismiss();
      toast.loading(`Baixando arquivo ${filename}...`);
      const blob = await cnabService.exportRemessaFile(bank, paymentMode, filename);
      
      if (!blob) {
        toast.dismiss();
        toast.error('Erro ao baixar arquivo', {
          description: `Não foi possível baixar o conteúdo do arquivo ${filename}. O arquivo pode estar corrompido ou não estar mais disponível no servidor.`
        });
        return;
      }

      downloadBlob(blob, filename);

    } catch (error) {
      console.error('[handleExportRemessa] Erro:', error);
      toast.dismiss();
      
      // Mensagens de erro mais específicas
      if (error.response?.status === 404) {
        toast.error('Arquivo não encontrado no servidor', {
          description: `O arquivo REM para a remessa #${nRemessa} não foi encontrado no servidor. Verifique se a remessa foi gerada e está disponível.`
        });
      } else if (error.response?.status === 403) {
        toast.error('Acesso negado', {
          description: 'Você não tem permissão para acessar este arquivo. Entre em contato com o administrador.'
        });
      } else {
        toast.error('Erro ao exportar remessa', {
          description: error.message || 'Ocorreu um erro inesperado ao tentar exportar a remessa. Tente novamente mais tarde.'
        });
      }
    }
  }, [paymentMode, selectedBank, exportAgent]);

  // Helper para download
  const downloadBlob = (blob, filename) => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename;
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    document.body.removeChild(a);
    toast.dismiss();
    toast.success('Download concluído!', {
      description: `Arquivo ${filename} baixado com sucesso.`
    });
  };

  const handleOpenPagamentos = useCallback(async (row) => {
    const nRemessa = row.n_remessa;
    if (!nRemessa) return;

    setLoadingDetails(true);
    setSelectedRemessa(nRemessa);

    try {
      const response = await cnabService.getDetalhamentoRemessa(nRemessa);
      let dados = [];
      if (Array.isArray(response)) {
        dados = response;
      } else if (response?.Base_Dados_API) {
        dados = Array.isArray(response.Base_Dados_API) 
          ? response.Base_Dados_API 
          : (response.Base_Dados_API?.dados || []);
      } else if (response?.dados) {
        dados = Array.isArray(response.dados) ? response.dados : [];
      } else if (response) {
        dados = Array.isArray(response) ? response : [];
      }
      setRemessaDetails(dados);
    } catch (error) {
      console.error('Erro detalhamento:', error);
      toast.error('Erro ao carregar detalhes');
      setRemessaDetails([]);
    } finally {
      setLoadingDetails(false);
    }
  }, []);

  const handleCloseModal = useCallback(() => {
    setSelectedRemessa(null);
    setRemessaDetails([]);
  }, []);

  /** Abre o modal de detalhes com a linha clicada (reutiliza dados da tabela; sem rota extra) */
  const handleOpenPagamentosDetalhes = useCallback((row) => {
    if (!row?.cpf_cnpj) return;
    setSelectedDetailRow(row);
  }, []);

  const handleClosePagamentosModal = useCallback(() => {
    setSelectedDetailRow(null);
  }, []);

  return (
    <div className="h-full flex flex-col space-y-6 animate-in fade-in duration-700">
      
      {/* Header */}
      <div className="flex flex-col lg:flex-row justify-between items-start lg:items-center gap-6 shrink-0 bg-white/5 dark:bg-zinc-900/50 p-6 rounded-[2.5rem] border border-white/5 shadow-2xl">
        <div className="flex items-center gap-4">
           <div className="w-14 h-14 rounded-2xl bg-gradient-to-br from-emerald-500 to-teal-600 flex items-center justify-center shadow-lg shadow-emerald-500/20">
              <BarChart3 className="text-white" size={28} />
           </div>
           <div>
              <h2 className="text-[clamp(1.25rem,2vw,1.75rem)] font-bold text-slate-900 dark:text-white tracking-tighter leading-none mb-1">
                Analytics <span className="text-emerald-500">Transação</span>
              </h2>
              <p className="text-slate-600 dark:text-zinc-300 text-[clamp(0.875rem,1.2vw,1rem)] font-bold uppercase tracking-widest">
                Ambiente de Gestão <span className="text-emerald-500">{paymentMode}</span>
              </p>
           </div>
        </div>
        
        <div className="flex flex-wrap items-center gap-3">

            <button 
              onClick={() => handleExport()}
              className="flex items-center gap-2 px-6 py-3 bg-emerald-600 hover:bg-emerald-500 text-white rounded-2xl text-[clamp(0.65vw,0.6rem,0.8rem)] font-bold uppercase tracking-widest transition-all shadow-xl shadow-emerald-900/10 active:scale-95 border border-emerald-500/20"
            >
              <Download size={16} />
              Exportar
            </button>
        </div>
      </div>

      <AnimatePresence mode="wait">
        {loading ? (
            <motion.div 
              key="loading"
              initial={{ opacity: 0 }}
              animate={{ opacity: 1 }}
              exit={{ opacity: 0 }}
              transition={{ duration: 0.2 }}
              className="flex-1 flex flex-col items-center justify-center space-y-4"
            >
                <div className="w-16 h-16 rounded-3xl bg-emerald-500/10 border border-emerald-500/20 animate-spin flex items-center justify-center">
                    <Loader2 className="text-emerald-500 w-8 h-8" />
                </div>
                <p className="text-slate-600 dark:text-zinc-300 text-[clamp(0.875rem,1vw,0.9375rem)] font-bold uppercase tracking-[0.3em]">Processando dados em nuvem...</p>
            </motion.div>
        ) : view === 'Menu' ? (
            <DashboardMenu 
                key={`dashboard-menu-${paymentMode}`}
                loading={loading}
                stats={stats}
                chartData={chartData}
                reportData={reportData}
                paymentMode={paymentMode}
                timeFilter={timeFilter}
                setTimeFilter={setTimeFilter}
                onOpenPagamentos={handleOpenPagamentos}
                formatMoney={formatMoney}
            />
        ) : null}
      </AnimatePresence>

      <RemessaDetailsModal
        isOpen={!!selectedRemessa}
        onClose={handleCloseModal}
        remessaId={selectedRemessa}
        details={remessaDetails}
        loading={loadingDetails}
      />

      <PagamentosDetailsModal
        isOpen={!!selectedDetailRow}
        onClose={handleClosePagamentosModal}
        row={selectedDetailRow}
      />

    </div>
  );
};

export default DashboardView;
