"use client";
import { ArrowRight, Eye } from "lucide-react";
import { useTranslation } from "react-i18next";
import type { SettlementBillRow } from "@/api/admin-agent-settlement";
import { AdminNoResourceState } from "@/components/admin/admin-no-resource-state";
import { AdminLoadingState } from "@/components/admin/admin-loading-state";
import { AdminRowActionsMenu } from "@/components/admin/admin-row-actions-menu";
import { AdminStatusBadge } from "@/components/admin/admin-status-badge";
import { signedMoneyClass } from "@/lib/admin-signed-money";
import { cn } from "@/lib/utils";
import { formatSettlementPeriodSpan } from "@/lib/agent-settlement-period-range";
import {
formatSignedSettlementMoney,
} from "@/modules/settlement/settlement-signed-money";
import {
describeBillPaymentDirection,
} from "@/modules/settlement/settlement-bill-display";
import {
formatPlatformPartyLabel,
SettlementDashCell,
} from "@/modules/settlement/settlement-party-cells";
import {
settlementBillStatusLabel,
settlementBillTypeLabel,
} from "@/modules/settlement/settlement-status-label";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
type BillTypeFilter = "all" | "player" | "agent";
type SettlementBillsTableProps = {
rows: SettlementBillRow[];
loading: boolean;
currencyCode: string;
billTypeFilter?: BillTypeFilter;
emptyMessage?: string;
onOpenDetail: (billId: number) => void;
};
function billRowTone(row: SettlementBillRow): string {
if (row.bill_type === "player") {
return "border-l-2 border-l-sky-300/80";
}
if (row.bill_type === "agent") {
return "border-l-2 border-l-amber-300/80 bg-amber-50/20";
}
if (row.bill_type === "adjustment" || row.bill_type === "reversal") {
return "border-l-2 border-l-emerald-300/80 bg-emerald-50/20";
}
if (row.bill_type === "bad_debt") {
return "border-l-2 border-l-rose-300/80 bg-rose-50/20";
}
return "";
}
function billTypeTone(row: SettlementBillRow): string {
if (row.bill_type === "player") {
return "border-sky-200 bg-sky-50 text-sky-700";
}
if (row.bill_type === "agent") {
return "border-amber-200 bg-amber-50 text-amber-800";
}
if (row.bill_type === "adjustment" || row.bill_type === "reversal") {
return "border-emerald-200 bg-emerald-50 text-emerald-700";
}
if (row.bill_type === "bad_debt") {
return "border-rose-200 bg-rose-50 text-rose-700";
}
return "border-border/70 bg-muted/25 text-muted-foreground";
}
function unpaidMoneyClass(row: SettlementBillRow): string {
if (row.unpaid_amount <= 0) {
return "text-muted-foreground";
}
if (row.status === "overdue") {
return "font-medium text-destructive";
}
return "font-medium text-amber-800 dark:text-amber-300";
}
function paidMoneyClass(row: SettlementBillRow): string {
if ((row.paid_amount ?? 0) <= 0) {
return "text-muted-foreground";
}
if (row.unpaid_amount > 0) {
return "font-medium text-amber-800 dark:text-amber-300";
}
return "font-medium text-emerald-700";
}
function ownerPartyLabel(row: SettlementBillRow): string | null {
if (row.bill_type === "player") {
return row.player_username ?? row.owner_label ?? null;
}
if (row.bill_type === "agent") {
return row.owner_party_label ?? row.owner_label ?? null;
}
return row.owner_label ?? null;
}
export function SettlementBillsTable({
rows,
loading,
currencyCode,
billTypeFilter = "all",
emptyMessage,
onOpenDetail,
}: SettlementBillsTableProps): React.ReactElement {
const { t } = useTranslation(["settlementCenter", "agents", "common"]);
const agentView = billTypeFilter === "agent";
const playerView = billTypeFilter === "player";
const mixedView = billTypeFilter === "all";
if (loading) {
return