"use client"; import MoneyValues from "@/components/money-values"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Separator } from "@/components/ui/separator"; import { useMemo, useState } from "react"; import type { InstallmentAnalysisData } from "./types"; import { InstallmentGroupCard } from "./installment-group-card"; import { PendingInvoiceCard } from "./pending-invoice-card"; import { AnalysisSummaryPanel } from "./analysis-summary-panel"; import { RiCalculatorLine, RiCheckboxBlankLine, RiCheckboxLine, } from "@remixicon/react"; type InstallmentAnalysisPageProps = { data: InstallmentAnalysisData; }; export function InstallmentAnalysisPage({ data, }: InstallmentAnalysisPageProps) { // Estado para parcelas selecionadas: Map> const [selectedInstallments, setSelectedInstallments] = useState< Map> >(new Map()); // Estado para faturas selecionadas: Set const [selectedInvoices, setSelectedInvoices] = useState>( new Set() ); // Calcular se está tudo selecionado const isAllSelected = useMemo(() => { const allInstallmentsSelected = data.installmentGroups.every((group) => { const groupSelection = selectedInstallments.get(group.seriesId); if (!groupSelection) return false; return ( groupSelection.size === group.pendingInstallments.length && group.pendingInstallments.length > 0 ); }); const allInvoicesSelected = data.pendingInvoices.length === selectedInvoices.size; return ( allInstallmentsSelected && allInvoicesSelected && (data.installmentGroups.length > 0 || data.pendingInvoices.length > 0) ); }, [selectedInstallments, selectedInvoices, data]); // Função para selecionar/desselecionar tudo const toggleSelectAll = () => { if (isAllSelected) { // Desmarcar tudo setSelectedInstallments(new Map()); setSelectedInvoices(new Set()); } else { // Marcar tudo const newInstallments = new Map>(); data.installmentGroups.forEach((group) => { const ids = new Set(group.pendingInstallments.map((i) => i.id)); newInstallments.set(group.seriesId, ids); }); const newInvoices = new Set( data.pendingInvoices.map((inv) => `${inv.cartaoId}:${inv.period}`) ); setSelectedInstallments(newInstallments); setSelectedInvoices(newInvoices); } }; // Função para selecionar/desselecionar um grupo de parcelas const toggleGroupSelection = (seriesId: string, installmentIds: string[]) => { const newMap = new Map(selectedInstallments); const current = newMap.get(seriesId) || new Set(); if (current.size === installmentIds.length) { // Já está tudo selecionado, desmarcar newMap.delete(seriesId); } else { // Marcar tudo newMap.set(seriesId, new Set(installmentIds)); } setSelectedInstallments(newMap); }; // Função para selecionar/desselecionar parcela individual const toggleInstallmentSelection = (seriesId: string, installmentId: string) => { const newMap = new Map(selectedInstallments); const current = newMap.get(seriesId) || new Set(); if (current.has(installmentId)) { current.delete(installmentId); if (current.size === 0) { newMap.delete(seriesId); } else { newMap.set(seriesId, current); } } else { current.add(installmentId); newMap.set(seriesId, current); } setSelectedInstallments(newMap); }; // Função para selecionar/desselecionar fatura const toggleInvoiceSelection = (invoiceKey: string) => { const newSet = new Set(selectedInvoices); if (newSet.has(invoiceKey)) { newSet.delete(invoiceKey); } else { newSet.add(invoiceKey); } setSelectedInvoices(newSet); }; // Calcular totais const { totalInstallments, totalInvoices, grandTotal, selectedCount } = useMemo(() => { let installmentsSum = 0; let installmentsCount = 0; selectedInstallments.forEach((installmentIds, seriesId) => { const group = data.installmentGroups.find( (g) => g.seriesId === seriesId ); if (group) { installmentIds.forEach((id) => { const installment = group.pendingInstallments.find( (i) => i.id === id ); if (installment) { installmentsSum += installment.amount; installmentsCount++; } }); } }); let invoicesSum = 0; let invoicesCount = 0; selectedInvoices.forEach((key) => { const [cartaoId, period] = key.split(":"); const invoice = data.pendingInvoices.find( (inv) => inv.cartaoId === cartaoId && inv.period === period ); if (invoice) { invoicesSum += invoice.totalAmount; invoicesCount++; } }); return { totalInstallments: installmentsSum, totalInvoices: invoicesSum, grandTotal: installmentsSum + invoicesSum, selectedCount: installmentsCount + invoicesCount, }; }, [selectedInstallments, selectedInvoices, data]); const hasNoData = data.installmentGroups.length === 0 && data.pendingInvoices.length === 0; return (
{/* Header */}

Análise de Parcelas e Faturas

Veja quanto você gastaria pagando tudo que está em aberto

{/* Card de resumo principal */}

Se você pagar tudo que está selecionado:

{selectedCount} {selectedCount === 1 ? "item" : "itens"} selecionados

{/* Botões de ação */} {!hasNoData && (
)}
{/* Conteúdo principal */}
{/* Seção de Lançamentos Parcelados */} {data.installmentGroups.length > 0 && (

Lançamentos Parcelados

{data.installmentGroups.map((group) => ( toggleGroupSelection( group.seriesId, group.pendingInstallments.map((i) => i.id) ) } onToggleInstallment={(installmentId) => toggleInstallmentSelection(group.seriesId, installmentId) } /> ))}
)} {/* Seção de Faturas Pendentes */} {data.pendingInvoices.length > 0 && (

Faturas Pendentes

{data.pendingInvoices.map((invoice) => { const invoiceKey = `${invoice.cartaoId}:${invoice.period}`; return ( toggleInvoiceSelection(invoiceKey)} /> ); })}
)} {/* Estado vazio */} {hasNoData && (

Nenhuma parcela ou fatura pendente

Você está em dia com seus pagamentos!

)}
{/* Painel lateral de resumo (sticky) */} {!hasNoData && (
)}
); }