import { useMemo } from "react"; import type { CostByBiller, CostByProviderModel } from "@paperclipai/shared"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { QuotaBar } from "./QuotaBar"; import { billingTypeDisplayName, formatCents, formatTokens, providerDisplayName } from "@/lib/utils"; interface BillerSpendCardProps { row: CostByBiller; weekSpendCents: number; budgetMonthlyCents: number; totalCompanySpendCents: number; providerRows: CostByProviderModel[]; } export function BillerSpendCard({ row, weekSpendCents, budgetMonthlyCents, totalCompanySpendCents, providerRows, }: BillerSpendCardProps) { const providerBreakdown = useMemo(() => { const map = new Map(); for (const entry of providerRows) { const current = map.get(entry.provider) ?? { provider: entry.provider, costCents: 0, inputTokens: 0, outputTokens: 0, }; current.costCents += entry.costCents; current.inputTokens += entry.inputTokens + entry.cachedInputTokens; current.outputTokens += entry.outputTokens; map.set(entry.provider, current); } return Array.from(map.values()).sort((a, b) => b.costCents - a.costCents); }, [providerRows]); const billingTypeBreakdown = useMemo(() => { const map = new Map(); for (const entry of providerRows) { map.set(entry.billingType, (map.get(entry.billingType) ?? 0) + entry.costCents); } return Array.from(map.entries()).sort((a, b) => b[1] - a[1]); }, [providerRows]); const providerBudgetShare = budgetMonthlyCents > 0 && totalCompanySpendCents > 0 ? (row.costCents / totalCompanySpendCents) * budgetMonthlyCents : budgetMonthlyCents; const budgetPct = providerBudgetShare > 0 ? Math.min(100, (row.costCents / providerBudgetShare) * 100) : 0; return (
{providerDisplayName(row.biller)} {formatTokens(row.inputTokens + row.cachedInputTokens)} in {" · "} {formatTokens(row.outputTokens)} out {" · "} {row.providerCount} provider{row.providerCount === 1 ? "" : "s"} {" · "} {row.modelCount} model{row.modelCount === 1 ? "" : "s"}
{formatCents(row.costCents)}
{budgetMonthlyCents > 0 && ( )}
{row.apiRunCount > 0 ? `${row.apiRunCount} metered run${row.apiRunCount === 1 ? "" : "s"}` : "0 metered runs"} {" · "} {row.subscriptionRunCount > 0 ? `${row.subscriptionRunCount} subscription run${row.subscriptionRunCount === 1 ? "" : "s"}` : "0 subscription runs"} {" · "} {formatCents(weekSpendCents)} this week
{billingTypeBreakdown.length > 0 && ( <>

Billing types

{billingTypeBreakdown.map(([billingType, costCents]) => (
{billingTypeDisplayName(billingType as any)} {formatCents(costCents)}
))}
)} {providerBreakdown.length > 0 && ( <>

Upstream providers

{providerBreakdown.map((entry) => (
{providerDisplayName(entry.provider)}
{formatCents(entry.costCents)}
{formatTokens(entry.inputTokens + entry.outputTokens)} tok
))}
)} ); }