"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 ( {error}
); } 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 ; } }