"use client"; import { RiBankCard2Line } from "@remixicon/react"; import Image from "next/image"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; import MoneyValues from "@/components/money-values"; import { Card, CardContent } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import type { CartoesReportData } from "@/lib/relatorios/cartoes-report"; import { cn } from "@/lib/utils"; 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) => 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()}`; }; const summaryCards = [ { title: "Limite", value: data.totalLimit, isMoney: true }, { title: "Usado", value: data.totalUsage, isMoney: true }, { title: "Disponível", value: data.totalLimit - data.totalUsage, isMoney: true, }, { title: "Utilização", value: data.totalUsagePercent, isMoney: false }, ]; if (data.cards.length === 0) { return (

Nenhum cartão encontrado

); } return (
{/* Summary stats */}
{summaryCards.map((card) => (

{card.title}

{card.isMoney ? ( ) : (

{card.value.toFixed(0)}%

)}
))}

Meus cartões

{/* Cards list */}
{data.cards.map((card) => { const logoPath = resolveLogoPath(card.logo); const brandAsset = resolveBrandAsset(card.brand); const isSelected = data.selectedCard?.card.id === card.id; return (
{logoPath ? ( {card.name} ) : ( )}
{card.name} {brandAsset && ( {card.brand )}

{formatCurrency(card.currentUsage)} /{" "} {formatCurrency(card.limit)}

div]:${getUsageColor(card.usagePercent)}`, )} /> {card.usagePercent.toFixed(0)}%
); })}
); }