import MoneyValues from "@/components/money-values"; import { CardContent } from "@/components/ui/card"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import type { InstallmentExpensesData } from "@/lib/dashboard/expenses/installment-expenses"; import { calculateLastInstallmentDate, formatLastInstallmentDate, } from "@/lib/installments/utils"; import { RiNumbersLine, RiArrowRightSLine } from "@remixicon/react"; import Image from "next/image"; import Link from "next/link"; import { Progress } from "../ui/progress"; import { WidgetEmptyState } from "../widget-empty-state"; type InstallmentExpensesWidgetProps = { data: InstallmentExpensesData; }; const buildCompactInstallmentLabel = ( currentInstallment: number | null, installmentCount: number | null ) => { if (currentInstallment && installmentCount) { return `${currentInstallment} de ${installmentCount}`; } return null; }; const isLastInstallment = ( currentInstallment: number | null, installmentCount: number | null ) => { if (!currentInstallment || !installmentCount) return false; return currentInstallment === installmentCount && installmentCount > 1; }; const calculateRemainingInstallments = ( currentInstallment: number | null, installmentCount: number | null ) => { if (!currentInstallment || !installmentCount) return 0; return Math.max(0, installmentCount - currentInstallment); }; const calculateRemainingAmount = ( amount: number, currentInstallment: number | null, installmentCount: number | null ) => { const remaining = calculateRemainingInstallments( currentInstallment, installmentCount ); return amount * remaining; }; const formatEndDate = ( period: string, currentInstallment: number | null, installmentCount: number | null ) => { if (!currentInstallment || !installmentCount) return null; const lastDate = calculateLastInstallmentDate( period, currentInstallment, installmentCount ); return formatLastInstallmentDate(lastDate); }; const buildProgress = ( currentInstallment: number | null, installmentCount: number | null ) => { if (!currentInstallment || !installmentCount || installmentCount <= 0) { return 0; } return Math.min( 100, Math.max(0, (currentInstallment / installmentCount) * 100) ); }; export function InstallmentExpensesWidget({ data, }: InstallmentExpensesWidgetProps) { if (data.expenses.length === 0) { return ( } title="Nenhuma despesa parcelada" description="Lançamentos parcelados aparecerão aqui conforme forem registrados." /> ); } return ( {data.expenses.map((expense) => { const compactLabel = buildCompactInstallmentLabel( expense.currentInstallment, expense.installmentCount ); const isLast = isLastInstallment( expense.currentInstallment, expense.installmentCount ); const remainingInstallments = calculateRemainingInstallments( expense.currentInstallment, expense.installmentCount ); const remainingAmount = calculateRemainingAmount( expense.amount, expense.currentInstallment, expense.installmentCount ); const endDate = formatEndDate( expense.period, expense.currentInstallment, expense.installmentCount ); const progress = buildProgress( expense.currentInstallment, expense.installmentCount ); return ( {expense.name} {compactLabel && ( {compactLabel} {isLast && ( Última parcela Última parcela! )} )} Restantes {remainingInstallments} {endDate && ` • Termina em ${endDate}`} {" • Restante "} ); })} Ver Análise Completa ); }
{expense.name}
Restantes {remainingInstallments} {endDate && ` • Termina em ${endDate}`} {" • Restante "}