"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 { 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()); // Calcular se está tudo selecionado (apenas parcelas não pagas) const isAllSelected = useMemo(() => { const allInstallmentsSelected = data.installmentGroups.every((group) => { const groupSelection = selectedInstallments.get(group.seriesId); const unpaidInstallments = group.pendingInstallments.filter( (i) => !i.isSettled ); if (!groupSelection || unpaidInstallments.length === 0) return false; return groupSelection.size === unpaidInstallments.length; }); return allInstallmentsSelected && data.installmentGroups.length > 0; }, [selectedInstallments, data]); // Função para selecionar/desselecionar tudo const toggleSelectAll = () => { if (isAllSelected) { // Desmarcar tudo setSelectedInstallments(new Map()); } else { // Marcar tudo (exceto parcelas já pagas) const newInstallments = new Map>(); data.installmentGroups.forEach((group) => { const unpaidIds = group.pendingInstallments .filter((i) => !i.isSettled) .map((i) => i.id); if (unpaidIds.length > 0) { newInstallments.set(group.seriesId, new Set(unpaidIds)); } }); setSelectedInstallments(newInstallments); } }; // 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); }; // Calcular totais const { totalInstallments, 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 && !installment.isSettled) { installmentsSum += installment.amount; installmentsCount++; } }); } }); return { totalInstallments: installmentsSum, grandTotal: installmentsSum, selectedCount: installmentsCount, }; }, [selectedInstallments, data]); const hasNoData = data.installmentGroups.length === 0; return (
{/* Header */}

Análise de Parcelas

Quanto você gastaria pagando tudo que está em aberto

{/* Card de resumo principal */}

Se você pagar tudo que está selecionado:

{selectedCount} {selectedCount === 1 ? "parcela" : "parcelas"} selecionadas

{/* 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 .filter((i) => !i.isSettled) .map((i) => i.id) ) } onToggleInstallment={(installmentId) => toggleInstallmentSelection(group.seriesId, installmentId) } /> ))}
)} {/* Estado vazio */} {hasNoData && (

Nenhuma parcela pendente

Você está em dia com seus pagamentos!

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