"use client"; import { RiInformationLine } from "@remixicon/react"; import Image from "next/image"; import { type ReactNode, useMemo } from "react"; import MoneyValues from "@/components/money-values"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils/ui"; type DetailValue = string | number | ReactNode; type AccountStatementCardProps = { accountName: string; accountType: string; status: string; periodLabel: string; currentBalance: number; openingBalance: number; totalIncomes: number; totalExpenses: number; logo?: string | null; actions?: React.ReactNode; }; const resolveLogoPath = (logo?: string | null) => { if (!logo) return null; if ( logo.startsWith("http://") || logo.startsWith("https://") || logo.startsWith("data:") ) { return logo; } return logo.startsWith("/") ? logo : `/logos/${logo}`; }; const getAccountStatusBadgeVariant = ( status: string, ): "success" | "secondary" => { const normalizedStatus = status.toLowerCase(); if (normalizedStatus === "ativa") { return "success"; } return "outline"; }; export function AccountStatementCard({ accountName, accountType, status, periodLabel, currentBalance, openingBalance, totalIncomes, totalExpenses, logo, actions, }: AccountStatementCardProps) { const logoPath = useMemo(() => resolveLogoPath(logo), [logo]); const formatCurrency = (value: number) => value.toLocaleString("pt-BR", { style: "currency", currency: "BRL", }); return (
{logoPath ? (
{`Logo
) : null}
{accountName}

Extrato de {periodLabel}

{actions ?
{actions}
: null}
{/* Composição do Saldo */}
} tooltip="Saldo inicial cadastrado na conta somado aos lançamentos pagos anteriores a este mês." />
{formatCurrency(totalIncomes)} } tooltip="Total de receitas deste mês classificadas como pagas para esta conta." /> {formatCurrency(totalExpenses)} } tooltip="Total de despesas pagas neste mês (considerando divisão entre pagadores)." /> = 0 ? "text-emerald-600" : "text-destructive", )} /> } tooltip="Diferença entre entradas e saídas do mês; positivo indica saldo crescente." />
{/* Saldo Atual - Destaque Principal */} } tooltip="Saldo inicial do período + entradas - saídas realizadas neste mês." />
{/* Informações da Conta */}
{status}
} tooltip="Indica se a conta está ativa para lançamentos ou foi desativada." />
); } function DetailItem({ label, value, className, tooltip, }: { label: string; value: DetailValue; className?: string; tooltip?: string; }) { return (
{label} {tooltip ? ( {tooltip} ) : null}
{value}
); }