import Link from "next/link";
import { Download } from "lucide-react";
import { requireAdmin } from "@/lib/session";
import { getEconomics, parseRange, rangeLabel } from "@/lib/queries/admin";
import { formatBytes, formatNumber, formatPercent, formatUsd } from "@/lib/format";
import { PageHeader } from "@/components/ui/page-header";
import { Button } from "@/components/ui/button";
import { Table, TableBody, TableCell, TableEmpty, TableHead, TableHeader, TableRow } from "@/components/ui/table";
import { MarginText, NetworkBadge, Panel, PlanBadge, ProviderBadge, RangeTabs, numCell } from "@/components/admin/primitives";
import { EconomicsChart } from "@/components/admin/charts";
import type { EconRow } from "@/lib/queries/admin";
export const dynamic = "force-dynamic";
function EconTable({ rows, labelHead, renderLabel }: { rows: EconRow[]; labelHead: string; renderLabel: (r: EconRow) => React.ReactNode }) {
return (
{labelHead}
Requests
Success
Revenue
Upstream
Margin
GB
{rows.length === 0 ? (
No data in this range.
) : (
rows.map((r) => (
{renderLabel(r)}
{formatNumber(r.requests)}
{formatPercent(r.requests ? (r.successes / r.requests) * 100 : null)}
{formatUsd(r.revenue, true)}
{formatUsd(r.cost, true)}
{formatBytes(r.bytes)}
))
)}
);
}
export default async function AdminUsagePage({ searchParams }: { searchParams: Promise> }) {
await requireAdmin();
const sp = await searchParams;
const range = parseRange(sp.range);
const e = await getEconomics(range);
const totals = e.byBucket.reduce((acc, r) => ({ revenue: acc.revenue + r.revenue, cost: acc.cost + r.cost, requests: acc.requests + r.requests }), { revenue: 0, cost: 0, requests: 0 });
return (
<>
>
}
/>
{e.unit === "hour" ? new Date(r.key).toLocaleString(undefined, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }) : new Date(r.key).toLocaleDateString(undefined, { month: "short", day: "numeric" })}} />
Provider
Attempts
Successes
Success
Upstream cost
Attributed revenue
Margin
Cost / success
GB
{e.byProvider.length === 0 ? (
No attempts in this range.
) : (
e.byProvider.map((p) => (
{formatNumber(p.attempts)}
{formatNumber(p.successes)}
{formatPercent(p.attempts ? (p.successes / p.attempts) * 100 : null)}
{formatUsd(p.cost, true)}
{formatUsd(p.attributedRevenue, true)}
0 ? ((p.attributedRevenue - p.cost) / p.attributedRevenue) * 100 : null} />
{formatUsd(p.costPerSuccess, true)}
{formatBytes(p.bytes)}
))
)}
Organization
Plan
Requests
Success
Revenue
Upstream
Margin
GB
{e.topCustomers.length === 0 ? (
No customer activity in this range.
) : (
e.topCustomers.map((c) => (
{c.name}
{formatNumber(c.requests)}
{formatPercent(c.requests ? (c.successes / c.requests) * 100 : null)}
{formatUsd(c.revenue, true)}
{formatUsd(c.cost, true)}
{formatBytes(c.bytes)}
))
)}
>
);
}