"use client";
import { useTranslation } from "react-i18next";
import { adminAgentDisplayLabel } from "@/components/admin/admin-agent-columns";
import { AdminNoResourceState, AdminTableNoResourceRow } from "@/components/admin/admin-no-resource-state";
import { AdminStatusBadge } from "@/components/admin/admin-status-badge";
import { AdminLoadingInline, AdminTableLoadingRow } from "@/components/admin/admin-loading-state";
import { DrawStatusBadge } from "@/modules/draws/draw-status-badge";
import { drawStatusLabel, settlementBatchStatusLabel } from "@/modules/draws/draw-display";
import { riskActionTypeLabel } from "@/modules/risk/risk-display";
import { useAdminPlayCodeLabel } from "@/hooks/use-admin-play-type-catalog";
import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
import {
formatPlainMoney,
formatUsagePercent,
optionText,
signedProfitCell,
type ReportResult,
} from "@/modules/reports/reports-utils";
import type { ReportDefinition } from "@/modules/reports/reports-definitions";
type ReportPreviewTableProps = {
report: ReportDefinition;
result: ReportResult | null;
loading: boolean;
error: string | null;
drawNoLabel?: string;
displayCurrency: string;
};
function reportValueLabel(
scope: string,
value: string | null | undefined,
t: (key: string, options?: { defaultValue?: string }) => string,
): string {
if (value == null || value === "") {
return "—";
}
return t(`labels.${scope}.${value}`, { defaultValue: value });
}
export function ReportPreviewTable({
report,
result,
loading,
error,
drawNoLabel = "",
displayCurrency,
}: ReportPreviewTableProps) {
const { t } = useTranslation(["reports", "common"]);
const playCodeLabel = useAdminPlayCodeLabel();
const formatTs = useAdminDateTimeFormatter();
if (!report.connected) {
return ;
}
if (loading) {
return (
);
}
if (error) {
return (
);
}
if (!result || result.key !== report.key || result.rows.length === 0) {
return (
);
}
switch (result.key) {
case "provider_profit":
return (
开注商注项数下注派彩平台毛利
{result.raw.map((item) => {item.provider_name}{item.provider_code}{item.ticket_item_count}{formatPlainMoney(item.total_bet_minor, displayCurrency)}{formatPlainMoney(item.total_payout_minor, displayCurrency)}{formatPlainMoney(item.approx_house_gross_minor, displayCurrency)})}
);
case "draw_profit":
return (
{t("preview.columns.drawProfit.primary")}
{t("preview.columns.drawProfit.secondary")}
{t("preview.columns.drawProfit.metricA")}
{t("preview.columns.drawProfit.metricB")}
{t("preview.columns.drawProfit.metricC")}
{t("preview.columns.drawProfit.status")}
{t("preview.columns.drawProfit.extra")}
{t("preview.columns.drawProfit.time")}
{result.raw.draw_no}
{result.raw.order_count}
{result.raw.ticket_item_count}
{formatPlainMoney(result.raw.total_bet_minor, result.raw.currency_code)}
{formatPlainMoney(result.raw.approx_house_gross_minor, result.raw.currency_code)}
{formatPlainMoney(result.raw.total_payout_minor, result.raw.currency_code)}
—
{result.raw.settlement_batches.length > 0 ? (
{t("preview.sections.settlementBatches")}
) : null}
{result.raw.settlement_batches.map((batch) => (
#{batch.id}
{settlementBatchStatusLabel(batch.status, t)}
{batch.total_ticket_count}
{batch.total_win_count}
—
{formatPlainMoney(batch.total_payout_amount, result.raw.currency_code)}
{formatPlainMoney(batch.total_jackpot_payout_amount, result.raw.currency_code)}
{formatTs(batch.finished_at)}
))}
);
case "daily_profit":
return (
{t("preview.columns.dailyProfit.primary")}
{t("preview.columns.dailyProfit.metricA")}
{t("preview.columns.dailyProfit.metricB")}
{t("preview.columns.dailyProfit.metricC")}
{result.raw.map((item) => (
{item.business_date}
{formatPlainMoney(item.total_bet_minor, displayCurrency)}
{formatPlainMoney(item.total_payout_minor, displayCurrency)}
{formatPlainMoney(item.approx_house_gross_minor, displayCurrency)}
))}
);
case "player_win_loss":
return (
{t("preview.columns.playerWinLoss.primary")}
{t("preview.columns.playerWinLoss.secondary")}
{t("preview.columns.playerWinLoss.metricA")}
{t("preview.columns.playerWinLoss.metricB")}
{t("preview.columns.playerWinLoss.metricC")}
{result.raw.map((item) => (
{item.username}
{adminAgentDisplayLabel(item)}
ID {item.player_id}
{formatPlainMoney(item.total_bet_minor, displayCurrency)}
{formatPlainMoney(item.total_payout_minor, displayCurrency)}
{formatPlainMoney(item.net_win_loss_minor, displayCurrency)}
))}
);
case "play_dimension":
return (
{t("preview.columns.playDimension.primary")}
{t("preview.columns.playDimension.secondary")}
{t("preview.columns.playDimension.metricA")}
{t("preview.columns.playDimension.metricB")}
{t("preview.columns.playDimension.metricC")}
{result.raw.map((item) => (
{playCodeLabel(item.play_code)}
{item.dimension}D
{formatPlainMoney(item.total_bet_minor, displayCurrency)}
{formatPlainMoney(item.total_payout_minor, displayCurrency)}
{formatPlainMoney(item.approx_house_gross_minor, displayCurrency)}
))}
);
case "player_transfer":
return (
{t("preview.columns.playerTransfer.primary")}
{t("preview.columns.playerTransfer.secondary")}
{t("preview.columns.playerTransfer.metricA")}
{t("preview.columns.playerTransfer.metricB")}
{t("preview.columns.playerTransfer.metricC")}
{t("preview.columns.playerTransfer.status")}
{t("preview.columns.playerTransfer.time")}
{result.raw.map((item) => (
{item.transfer_no}
{optionText(item.username, item.nickname) || item.player_id}
{reportValueLabel("transferDirection", item.direction, t)}
{reportValueLabel("transferStatus", item.status, t)}
{item.currency_code} {item.amount}
{item.external_ref_no || "—"}
{formatTs(item.created_at)}
))}
);
case "hot_number_risk":
return (
{t("preview.columns.hotNumberRisk.primary")}
{t("preview.columns.hotNumberRisk.secondary")}
{t("preview.columns.hotNumberRisk.metricA")}
{t("preview.columns.hotNumberRisk.metricB")}
{t("preview.columns.hotNumberRisk.metricC")}
{t("preview.columns.hotNumberRisk.status")}
{t("preview.columns.hotNumberRisk.extra")}
{result.raw.pool.normalized_number}
{result.raw.draw_no}
{formatPlainMoney(result.raw.pool.total_cap_amount, result.raw.currency_code)}
{formatPlainMoney(result.raw.pool.locked_amount, result.raw.currency_code)}
{formatPlainMoney(result.raw.pool.remaining_amount, result.raw.currency_code)}
{result.raw.pool.is_sold_out ? t("yes") : t("no")}
{formatUsagePercent(result.raw.pool.usage_ratio)}
{result.raw.logs.items.length > 0 ? (
{t("preview.sections.lockLogs")}
{t("preview.columns.hotNumberRisk.secondary")}
{t("preview.columns.hotNumberRisk.metricA")}
{t("preview.columns.hotNumberRisk.metricB")}
{t("preview.columns.hotNumberRisk.metricC")}
{t("preview.columns.hotNumberRisk.time")}
{result.raw.logs.items.map((item) => (
#{item.id}
{riskActionTypeLabel(item.action_type, t)}
{formatPlainMoney(item.amount, result.raw.currency_code)}
{playCodeLabel(item.play_code)}
{item.ticket_no || "—"}
{formatTs(item.created_at)}
))}
) : null}
);
case "sold_out_number":
return (
{t("preview.columns.soldOut.primary")}
{t("preview.columns.soldOut.secondary")}
{t("preview.columns.soldOut.metricA")}
{t("preview.columns.soldOut.metricB")}
{t("preview.columns.soldOut.metricC")}
{t("preview.columns.soldOut.status")}
{t("preview.columns.soldOut.extra")}
{result.raw.map((item) => (
{item.normalized_number}
{drawNoLabel}
{formatPlainMoney(item.total_cap_amount, displayCurrency)}
{formatPlainMoney(item.locked_amount, displayCurrency)}
{formatPlainMoney(item.remaining_amount, displayCurrency)}
{item.is_sold_out ? t("yes") : t("no")}
{formatUsagePercent(item.usage_ratio)}
))}
);
case "admin_audit":
return (
{t("preview.columns.adminAudit.primary")}
{t("preview.columns.adminAudit.secondary")}
{t("preview.columns.adminAudit.metricA")}
{t("preview.columns.adminAudit.metricB")}
{t("preview.columns.adminAudit.metricC")}
{t("preview.columns.adminAudit.status")}
{t("preview.columns.adminAudit.time")}
{result.raw.map((item) => (
#{item.id}
{reportValueLabel("operatorType", item.operator_type, t)}
{item.operator_id}
{item.module_label || item.module_code}
{item.action_label || item.action_code}
{item.target_label || item.target_type || "—"}
{formatTs(item.created_at)}
))}
);
default:
return ;
}
}