"use client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import type { CartoesReportData } from "@/lib/relatorios/cartoes-report"; import { cn } from "@/lib/utils"; import { title_font } from "@/public/fonts/font_index"; import { RiArrowDownLine, RiArrowUpLine, RiBankCard2Line, } from "@remixicon/react"; import Image from "next/image"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; type CardsOverviewProps = { data: CartoesReportData; }; const BRAND_ASSETS: Record = { visa: "/bandeiras/visa.svg", mastercard: "/bandeiras/mastercard.svg", amex: "/bandeiras/amex.svg", american: "/bandeiras/amex.svg", elo: "/bandeiras/elo.svg", hipercard: "/bandeiras/hipercard.svg", hiper: "/bandeiras/hipercard.svg", }; const resolveBrandAsset = (brand: string | null) => { if (!brand) return null; const normalized = brand.trim().toLowerCase(); const match = ( Object.keys(BRAND_ASSETS) as Array ).find((entry) => normalized.includes(entry)); return match ? BRAND_ASSETS[match] : null; }; 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}`; }; export function CardsOverview({ data }: CardsOverviewProps) { const searchParams = useSearchParams(); const periodoParam = searchParams.get("periodo"); const formatCurrency = (value: number) => { return new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL", minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(value); }; const getUsageColor = (percent: number) => { if (percent < 50) return "bg-green-500"; if (percent < 80) return "bg-yellow-500"; return "bg-red-500"; }; const buildUrl = (cardId: string) => { const params = new URLSearchParams(); if (periodoParam) params.set("periodo", periodoParam); params.set("cartao", cardId); return `/relatorios/cartoes?${params.toString()}`; }; if (data.cards.length === 0) { return ( Resumo dos Cartões

Nenhum cartão ativo encontrado

); } return ( Resumo dos Cartões

Limite Total

{formatCurrency(data.totalLimit)}

Uso Total

{formatCurrency(data.totalUsage)}

Utilização

{data.totalUsagePercent.toFixed(0)}%

{data.cards.map((card) => { const logoPath = resolveLogoPath(card.logo); const brandAsset = resolveBrandAsset(card.brand); return (
{/* Logo container - size-10 like expenses-by-category */}
{logoPath ? ( {`Logo ) : ( )}
{/* Name and brand */}
{card.name} {brandAsset && ( {`Bandeira )}
{formatCurrency(card.currentUsage)} /{" "} {formatCurrency(card.limit)}
{/* Trend and percentage */}
{card.usagePercent.toFixed(0)}%
{card.trend === "up" && ( )} {card.trend === "down" && ( )} {card.changePercent > 0 ? "+" : ""} {card.changePercent.toFixed(0)}%
{/* Progress bar - aligned with content */}
div]:${getUsageColor(card.usagePercent)}`, )} />
); })}
); }