"use client";

import Link from "next/link";
import { EquityCanvas } from "@/components/EquityCanvas";
import { useLiveSimulation } from "@/components/useLiveSimulation";

type SleeveKey = "A_SHARE_T1" | "ETF_T0" | "CONVERTIBLE_BOND_T0";

const CONFIG = {
  A_SHARE_T1: {
    title: "A股 T+1 Forward Shadow",
    eyebrow: "A-SHARE / INDEPENDENT ACCOUNT",
    path: "/trading/a-share",
    accountKey: "aShareT1" as const,
    rule: "T+1 · 次日起动态退出",
  },
  ETF_T0: {
    title: "ETF T+0 Forward Shadow",
    eyebrow: "ETF / INDEPENDENT ACCOUNT",
    path: "/trading/etf",
    accountKey: "intradayEtfT0" as const,
    rule: "仅核验T+0基金 · CASH_CONTROL",
  },
  CONVERTIBLE_BOND_T0: {
    title: "可转债 T+0 Forward Shadow",
    eyebrow: "CONVERTIBLE BOND / INDEPENDENT ACCOUNT",
    path: "/trading/convertible-bond",
    accountKey: "convertibleBondT0" as const,
    rule: "T+0 · 强赎/异常/缺数一票否决",
  },
} as const;

const money = (value: number) => `¥${value.toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
const percent = (value: number | null) => value == null ? "—" : `${value >= 0 ? "+" : ""}${(value * 100).toFixed(2)}%`;
const number = (value: number | null, digits = 2) => value == null ? "—" : value.toLocaleString("zh-CN", { maximumFractionDigits: digits });
const stamp = (value: string | null | undefined) => value ? new Date(value).toLocaleString("zh-CN", { timeZone: "Asia/Shanghai", hour12: false }) : "—";

function Empty({ children }: { children: React.ReactNode }) {
  return <p className="trading-empty">{children}</p>;
}

export function TradingDetailPage({ sleeve }: { sleeve: SleeveKey }) {
  const config = CONFIG[sleeve];
  const live = useLiveSimulation();
  const data = live.data;
  const accounts = data.cnIndependentAccounts;
  const account = accounts?.[config.accountKey];
  const forward = data.cnForwardShadow;
  const current = forward?.current[sleeve];
  const panel = forward?.panels[sleeve];
  const history = forward?.history[sleeve] ?? [];
  const scanner = data.cnFullMarketScanner?.sleeves[sleeve];
  const startingCash = account?.startingCash ?? 1_000_000;
  const equity = account?.equity ?? startingCash;
  const drawdown = account && "performance" in account ? account.performance?.drawdown ?? 0 : 0;
  const equityCurve = sleeve === "ETF_T0" && data.cnLiveMirror?.equityCurve?.length
    ? data.cnLiveMirror.equityCurve
    : [{ ts: current?.asOf ?? data.generatedAt, equity, drawdown }];
  const decision = current?.decision ?? (sleeve === "CONVERTIBLE_BOND_T0" ? "DATA_GATED" : "等待下一个交易日");
  const positions = account?.positionRows ?? [];
  const candidates = current?.candidates ?? [];
  const signals = current?.signals ?? [];
  const orders = current?.simulatedOrders ?? [];
  const fills = current?.fills ?? [];
  const noTradeReasons = current?.noTradeReasons ?? [];
  const riskStatus = current?.risk.status ?? "BLOCK";
  const dataStatus = current?.data.status ?? (sleeve === "CONVERTIBLE_BOND_T0" ? "DATA_GATED" : "WAITING");

  return <main className="trading-detail">
    <nav className="trading-breadcrumb"><Link href="/">总览</Link><span>/</span><b>{config.title}</b><Link href="/execution">基础设施状态 →</Link></nav>

    <section className="trading-hero">
      <header>
        <div><span>{config.eyebrow}</span><h1>{config.title}</h1><p>{config.rule} · 真实订单恒为 0 · 账户现金、持仓和熔断均独立</p></div>
        <em className={decision === "DATA_GATED" ? "bad" : "ok"}>{decision}</em>
      </header>
      <div className="trading-hero-grid">
        <article><span>账户状态</span><b>{account?.runtimeStatus ?? "STARTING"}</b><small>{live.connected ? "云端秒级同步" : "页面正在重连"}</small></article>
        <article><span>今日策略决策</span><b>{decision}</b><small>{noTradeReasons[0] ?? "策略正常运行，等待合格信号。"}</small></article>
        <article><span>影子权益</span><b>{money(equity)}</b><small>现金 {money(account?.cash ?? startingCash)}</small></article>
        <article><span>启用以来</span><b className={equity < startingCash ? "negative" : "positive"}>{percent(equity / startingCash - 1)}</b><small>扣除模拟费用与滑点</small></article>
        <article><span>当前回撤</span><b className={drawdown < 0 ? "negative" : "positive"}>{percent(drawdown)}</b><small>独立账户口径</small></article>
        <article><span>真实订单</span><b>0</b><small>公网只读 · Broker LOCKED</small></article>
      </div>
    </section>

    <section className="trading-forward-panel">
      <header><div><span>FORWARD TEST</span><h2>Champion 前向验证</h2></div><strong>{panel?.sampleStatus ?? "INSUFFICIENT_SAMPLE"}</strong></header>
      <div className="forward-metric-grid">
        <article><span>Forward Day</span><b>{panel?.forwardDay ?? 0} / 60</b><small>先20日稳定性，再60日评价</small></article>
        <article><span>Champion Version</span><b>{panel?.championVersion ?? (sleeve === "A_SHARE_T1" ? "ASHARE_CHAMPION_V1" : sleeve === "ETF_T0" ? "ETF_CHAMPION_V1" : "CB_CHAMPION_V1")}</b><small>盘中参数冻结</small></article>
        <article><span>Trading Days / Signals</span><b>{panel?.tradingDays ?? 0} / {panel?.signals ?? 0}</b><small>零成交日也记录</small></article>
        <article><span>Trades / Fill Rate</span><b>{panel?.trades ?? 0} / {percent(panel?.fillRate ?? null)}</b><small>部分成交单独计数</small></article>
        <article><span>Gross / Net P&amp;L</span><b>{money(panel?.grossPnl ?? 0)} / {money(panel?.netPnl ?? 0)}</b><small>现金基准 {money(panel?.benchmarkOrCashPnl ?? 0)}</small></article>
        <article><span>Max Drawdown</span><b>{percent(panel?.maxDrawdown ?? 0)}</b><small>Turnover {percent(panel?.turnover ?? null)}</small></article>
        <article><span>Win Rate / Profit Factor</span><b>{percent(panel?.winRate ?? null)} / {number(panel?.profitFactor ?? null)}</b><small>样本不足不判定成功</small></article>
        <article><span>Slippage / NO TRADE</span><b>{number(panel?.averageSlippageBps ?? null)} bps / {panel?.noTradeDays ?? 0}日</b><small>数据事故 {panel?.dataIncidentDays ?? 0} · 系统事故 {panel?.systemIncidentDays ?? 0}</small></article>
      </div>
    </section>

    <section className="trading-main-grid">
      <article className="trading-card trading-chart">
        <header><div><span>EQUITY & DRAWDOWN</span><h2>权益与回撤曲线</h2></div><small>{stamp(current?.asOf ?? data.generatedAt)}</small></header>
        <EquityCanvas curve={equityCurve} currency="CNY" axisLabel="影子账户权益（CNY）" />
      </article>
      <article className="trading-card">
        <header><div><span>RISK & DATA</span><h2>风险状态与数据完整性</h2></div><strong className={riskStatus === "PASS" ? "positive" : "negative"}>{riskStatus}</strong></header>
        <dl className="trading-definition">
          <div><dt>数据状态</dt><dd>{dataStatus}</dd></div>
          <div><dt>规则版本</dt><dd>{current?.tradingRulesVersion ?? forward?.rules.version ?? "WAITING"}</dd></div>
          <div><dt>费用版本</dt><dd>{current?.feeScheduleVersion ?? forward?.rules.feeVersion ?? "WAITING"}</dd></div>
          <div><dt>风控版本</dt><dd>{current?.riskVersion ?? "cn-three-sleeve-forward-risk-v1"}</dd></div>
          <div><dt>代码指纹</dt><dd>{current?.codeHash ?? "forward-shadow-v1"}</dd></div>
          <div><dt>数据版本</dt><dd>{current?.dataVersion ?? "WAITING"}</dd></div>
        </dl>
        <div className="trading-alert"><b>{current?.data.incidents.length ? "数据事故 / 闸门" : "暂无数据事故"}</b><p>{current?.data.incidents.join("；") || "数据链按当前研究等级正常；缺失字段会失败关闭。"}</p></div>
      </article>
    </section>

    <section className="trading-card">
      <header><div><span>POSITIONS</span><h2>当前持仓</h2></div><small>{positions.length} 个持仓</small></header>
      {positions.length ? <div className="trading-table-wrap"><table><thead><tr><th>标的</th><th>数量</th><th>买入价</th><th>最新价</th><th>市值</th><th>浮盈亏</th><th>策略逻辑</th><th>预计持有 / 退出</th></tr></thead><tbody>{positions.map((position, index) => <tr key={String(position.symbol ?? index)}><td><b>{String(position.symbol ?? "—")}</b><small>{String(position.name ?? "")}</small></td><td>{number(Number(position.qty ?? 0), 0)}</td><td>{number(Number(position.avgCost ?? 0), 3)}</td><td>{number(Number(position.latestPrice ?? 0), 3)}</td><td>{money(Number(position.marketValue ?? 0))}</td><td>{money(Number(position.unrealizedPnl ?? 0))}</td><td>{String(position.strategyLogic ?? "—")}</td><td>{String(position.expectedHolding ?? position.exitLogic ?? "动态")}</td></tr>)}</tbody></table></div> : <Empty>当前为空仓。空仓可能是 Champion 的合法输出，不是程序故障。</Empty>}
    </section>

    <section className="trading-card">
      <header><div><span>TODAY CANDIDATES & SIGNALS</span><h2>今日候选与策略信号</h2></div><small>全量扫描 {scanner?.scannedThisCycle ?? 0} / {scanner?.universeCount ?? 0}</small></header>
      {sleeve === "A_SHARE_T1" && <AShareCandidates candidates={candidates} />}
      {sleeve === "ETF_T0" && <EtfCandidates candidates={candidates} scannerCount={scanner?.universeCount ?? 0} />}
      {sleeve === "CONVERTIBLE_BOND_T0" && <CbCandidates candidates={candidates} />}
      <div className="signal-strip">{signals.length ? signals.slice(0, 12).map((signal) => <div key={signal.symbol}><b>{signal.symbol}</b><span>{signal.signal}</span><em>{number(signal.score)}</em></div>) : <Empty>今日尚无信号；仍会生成并封存 Daily Forward Record。</Empty>}</div>
    </section>

    <section className="trading-order-grid">
      <article className="trading-card"><header><div><span>TARGET ORDERS</span><h2>目标订单</h2></div><small>{current?.targetOrders.length ?? 0}</small></header><OrderList orders={current?.targetOrders ?? []} empty="没有目标订单。" /></article>
      <article className="trading-card"><header><div><span>SIMULATED ORDERS</span><h2>模拟订单</h2></div><small>{orders.length}</small></header><OrderList orders={orders} empty="没有模拟订单；未为了制造成交放宽准入。" /></article>
      <article className="trading-card"><header><div><span>FILLS</span><h2>成交记录</h2></div><small>{fills.length}</small></header>{fills.length ? fills.map((fill) => <div className="trading-list-row" key={fill.id}><b>{fill.symbol} · {fill.side}</b><span>{fill.qty} × {number(fill.price, 3)}</span><em>{fill.status}</em></div>) : <Empty>没有影子成交。</Empty>}</article>
    </section>

    <section className="trading-order-grid">
      <article className="trading-card"><header><div><span>NO FILL / REJECT</span><h2>未成交与拒单原因</h2></div></header>{noTradeReasons.length ? <ul className="trading-reasons">{noTradeReasons.map((reason) => <li key={reason}>{reason}</li>)}</ul> : <Empty>无未成交或拒单原因。</Empty>}</article>
      <article className="trading-card"><header><div><span>CHALLENGERS</span><h2>并行 Challenger</h2></div><small>不得自动晋级</small></header>{current?.challengerRuns.length ? current.challengerRuns.map((item) => <div className="trading-list-row" key={item.version}><b>{item.version}</b><span>{item.decision}</span><em>订单 0</em></div>) : <Empty>等待首个交易日建立并行记录。</Empty>}</article>
      <article className="trading-card"><header><div><span>TRACE</span><h2>完整决策链</h2></div></header><div className="lifecycle-chain">{current?.lifecycle.map((item) => <div key={item.stage}><b>{item.stage}</b><span>{item.status}</span></div>) ?? <Empty>DATA → CANDIDATE → SIGNAL → RISK → DECISION → ORDER → FILL → POSITION → EXIT → PNL</Empty>}</div></article>
    </section>

    <section className="trading-card">
      <header><div><span>DAILY FORWARD HISTORY</span><h2>历史每日记录</h2></div><Link href="/vault/forward">打开 Vault Forward 档案 →</Link></header>
      {history.length ? <div className="trading-table-wrap"><table><thead><tr><th>交易日</th><th>Champion</th><th>决策</th><th>信号</th><th>成交</th><th>净P&amp;L</th><th>回撤</th><th>事故</th><th>封存</th></tr></thead><tbody>{[...history].reverse().map((item) => <tr key={item.tradeDate}><td>{item.tradeDate}</td><td>{item.strategyVersion}</td><td>{item.decision}</td><td>{item.signals}</td><td>{item.trades}</td><td>{money(item.netPnl)}</td><td>{percent(item.drawdown)}</td><td>{item.dataIncident || item.systemIncident ? "有" : "无"}</td><td>{item.immutable ? "IMMUTABLE" : "OPEN"}</td></tr>)}</tbody></table></div> : <Empty>尚无已封存交易日。下一个真实交易日起每天都会保存，包括 0 成交日。</Empty>}
    </section>
  </main>;
}

type Candidate = NonNullable<NonNullable<ReturnType<typeof useLiveSimulation>["data"]["cnForwardShadow"]>["current"][SleeveKey]>["candidates"][number];

function AShareCandidates({ candidates }: { candidates: Candidate[] }) {
  return candidates.length ? <div className="trading-table-wrap"><table><thead><tr><th>排名</th><th>股票</th><th>综合分数</th><th>计划仓位</th><th>买入原因</th><th>买入时间/价</th><th>T+1可卖</th><th>持有天数</th><th>最高浮盈 / 回撤</th><th>MAE / MFE</th><th>动态退出</th></tr></thead><tbody>{candidates.map((item) => <tr key={item.symbol}><td>{item.rank}</td><td><b>{item.symbol}</b><small>{item.name}</small></td><td>{number(item.score)}</td><td>{percent(item.targetWeight)}</td><td>{item.reason}</td><td>未买入</td><td>否 / 不适用</td><td>0</td><td>— / —</td><td>— / —</td><td>DATA_GATED</td></tr>)}</tbody></table></div> : <Empty>候选尚未生成；点时特征、T+1与真实可成交性未通过前不会伪造排名或买入理由。</Empty>;
}

function EtfCandidates({ candidates, scannerCount }: { candidates: Candidate[]; scannerCount: number }) {
  return candidates.length ? <div className="trading-table-wrap"><table><thead><tr><th>排名</th><th>ETF</th><th>全量扫描</th><th>T+0资格</th><th>研究候选</th><th>实时/分钟信号</th><th>VWAP/趋势/波动</th><th>流动性</th><th>价差</th><th>目标仓位</th><th>模拟成交价/滑点</th><th>当日次数</th></tr></thead><tbody>{candidates.map((item) => <tr key={item.symbol}><td>{item.rank}</td><td><b>{item.symbol}</b><small>{item.name}</small></td><td>{scannerCount}</td><td>目录已核验</td><td>{item.signal}</td><td>HOLD / CASH_CONTROL</td><td>待深度镜像</td><td>{number(Number(item.features.liquidityScore ?? 0))}</td><td>{number(item.features.modeledSpreadBps == null ? null : Number(item.features.modeledSpreadBps))} bps</td><td>{percent(item.targetWeight)}</td><td>— / —</td><td>0</td></tr>)}</tbody></table></div> : <Empty>全量ETF扫描尚未形成合格研究候选；NO TRADE 原因会写入日记录。</Empty>;
}

function CbCandidates({ candidates }: { candidates: Candidate[] }) {
  return candidates.length ? <div className="trading-table-wrap"><table><thead><tr><th>排名</th><th>转债代码/名称</th><th>正股</th><th>转债价</th><th>正股价</th><th>转股价/价值</th><th>溢价率</th><th>成交额/流动性</th><th>剩余规模</th><th>强赎</th><th>异常/停牌</th><th>得分/信号</th><th>拦截原因</th></tr></thead><tbody>{candidates.map((item) => <tr key={item.symbol}><td>{item.rank}</td><td><b>{item.symbol}</b><small>{item.name}</small></td><td>—</td><td>{number(Number(item.features.price ?? 0), 3)}</td><td>—</td><td>— / —</td><td>—</td><td>{number(Number(item.features.amount ?? 0), 0)} / {number(Number(item.features.liquidityScore ?? 0))}</td><td>—</td><td>DATA_GATED</td><td>未完整核验</td><td>{number(item.score)} / BLOCK</td><td>可信分钟、强赎、转股溢价率与异常状态未齐</td></tr>)}</tbody></table></div> : <Empty>可转债保持 DATA_GATED；不会用 C 级收盘代理或缺失强赎数据伪造策略结果。</Empty>;
}

function OrderList({ orders, empty }: { orders: Array<{ id: string; symbol: string; side: string; qty: number; targetPrice: number | null; status: string; reason: string | null }>; empty: string }) {
  return orders.length ? orders.map((order) => <div className="trading-list-row" key={order.id}><b>{order.symbol} · {order.side}</b><span>{order.qty} @ {number(order.targetPrice, 3)}</span><em>{order.status}</em></div>) : <Empty>{empty}</Empty>;
}
