"use client";

import Link from "next/link";
import { useRouter } from "next/navigation";
import { EquityCanvas } from "@/components/EquityCanvas";
import { useExecutionStatus } from "@/components/useExecutionStatus";
import { useLiveSimulation } from "@/components/useLiveSimulation";
import { useMinuteWarehouse } from "@/components/useMinuteWarehouse";
import etfRegime from "@/research/results/etf-intraday-regime-challenger-v2.json";

const money = (value: number) => `¥${value.toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
const percent = (value: number) => `${value >= 0 ? "+" : ""}${(value * 100).toFixed(2)}%`;
const stamp = (value: string | null | undefined) => value && value !== "1970-01-01T00:00:00.000Z"
  ? new Date(value).toLocaleString("zh-CN", { hour12: false, timeZone: "Asia/Shanghai" })
  : "等待云端状态";

function phaseLabel(phase: string) {
  const labels: Record<string, string> = {
    PRE_OPEN: "盘前准备", OPENING_AUCTION: "开盘集合竞价", CONTINUOUS_AM: "上午连续竞价",
    LUNCH_BREAK: "午间休市", CONTINUOUS_PM: "下午连续竞价", EXIT_ONLY: "退出优先",
    FLATTEN_ONLY: "日内清仓", MARKET_CLOSED: "休市", NON_TRADING_DAY: "非交易日", STARTING: "连接中",
  };
  return labels[phase] ?? phase;
}

function SleeveCard({ href, eyebrow, title, status, equity, startingCash, positions, trades, policy, note, tone = "normal" }: {
  href: string;
  eyebrow: string; title: string; status: string; equity: number; startingCash: number; positions: number; trades: number;
  policy: string; note: string; tone?: "normal" | "hold";
}) {
  const value = startingCash ? equity / startingCash - 1 : 0;
  return <Link href={href} className={`ops-sleeve ${tone}`} aria-label={`打开${title}交易详情`}>
    <header><div><span>{eyebrow}</span><h3>{title}</h3></div><em>{status}</em></header>
    <div className="ops-sleeve-return"><b className={value < 0 ? "negative" : "positive"}>{percent(value)}</b><small>启用以来影子收益</small></div>
    <dl><div><dt>独立权益</dt><dd>{money(equity)}</dd></div><div><dt>持仓 / 成交</dt><dd>{positions} / {trades}</dd></div><div><dt>当前策略</dt><dd>{policy}</dd></div></dl>
    <p>{note}</p><strong className="ops-sleeve-link">打开详情 →</strong>
  </Link>;
}

export function OperationsOverview() {
  const router = useRouter();
  const live = useLiveSimulation();
  const execution = useExecutionStatus();
  const warehouse = useMinuteWarehouse();
  const data = live.data;
  const status = execution.data;
  const mirror = data.cnLiveMirror;
  const accounts = data.cnIndependentAccounts;
  const strategy = data.cnPortfolioStrategy;
  const scanner = data.cnEtfScanner;
  const fullMarketScanner = data.cnFullMarketScanner;
  const session = mirror?.session ?? status.automatedExecution.session;
  const aShare = accounts?.aShareT1;
  const etf = accounts?.intradayEtfT0;
  const convertible = accounts?.convertibleBondT0;
  const combinedEquity = accounts?.combinedReadOnly.equity ?? 3_000_000;
  const combinedCash = accounts?.combinedReadOnly.cash ?? 3_000_000;
  const combinedMarketValue = accounts?.combinedReadOnly.marketValue ?? 0;
  const startingCash = (aShare?.startingCash ?? 1_000_000) + (etf?.startingCash ?? 1_000_000) + (convertible?.startingCash ?? 1_000_000);
  const totalReturn = combinedEquity / startingCash - 1;
  const drawdown = Math.min(aShare ? 0 : 0, etf?.performance.drawdown ?? mirror?.account.drawdown ?? 0, convertible?.performance.drawdown ?? 0);
  const todayReturn = ((aShare?.equity ?? 1_000_000) + (etf?.equity ?? 1_000_000) + (convertible?.equity ?? 1_000_000)) / startingCash - 1;
  const combinedCurve = mirror?.equityCurve?.length
    ? mirror.equityCurve.map((point) => ({ ...point, equity: point.equity + 2_000_000 }))
    : [{ ts: data.generatedAt, equity: combinedEquity, drawdown }];
  const phase = phaseLabel(session.phase);
  const isTrading = session.strategyEvaluationEnabled;
  const marketHealthy = mirror?.marketDataStatus !== "error" && !mirror?.marketDataError;
  const decision = !isTrading
    ? "自动等待"
    : mirror?.account.killed || mirror?.account.daily_halt
      ? "风险熔断"
      : (mirror?.openOrders.length ?? 0) > 0
        ? "影子委托执行中"
        : "不交易 / 无合格信号";
  const recentTrades = mirror?.trades.slice(-5).reverse() ?? [];
  const recentOrders = mirror?.openOrders.slice(-5).reverse() ?? [];
  const exposure = combinedEquity ? combinedMarketValue / combinedEquity : 0;
  const latestError = mirror?.marketDataError ?? execution.error ?? live.error;
  const aShareReturn = aShare ? aShare.equity / aShare.startingCash - 1 : 0;
  const etfReturn = etf ? etf.equity / etf.startingCash - 1 : 0;
  const convertibleReturn = convertible ? convertible.equity / convertible.startingCash - 1 : 0;
  const minute = warehouse.data;
  return <div className="ops-overview">
    <section className="ops-command" aria-labelledby="ops-title">
      <div className="ops-status-rail">
        <div><span>MARKET</span><b>{phase}</b><small>{session.isTradingDay ? "交易日" : "休市日"}</small></div>
        <div><span>AUTO ENGINE</span><b className={isTrading ? "positive" : "hold"}>{isTrading ? "正常执行" : "自动等待"}</b><small>云端调度 · 盘中参数冻结</small></div>
        <div><span>DATA</span><b className={marketHealthy ? "positive" : "negative"}>{marketHealthy ? "正常" : "故障"}</b><small>{live.connected ? "秒级页面同步" : "正在重连"}</small></div>
        <div><span>BROKER</span><b className="hold">SHADOW / LOCKED</b><small>真实订单 0</small></div>
      </div>
      <div className="ops-command-main">
        <div className="ops-command-copy"><span className="kicker">SEEKINGQUANT / OPERATING SYSTEM</span><h1 id="ops-title">实盘策略运行总览</h1><p>先回答最重要的五件事：系统是否正常、现在是否交易、持有什么、盈亏多少、风险是否异常。</p></div>
        <div className="ops-decision"><span>今日自动交易决策</span><b>{decision}</b><small>ETF：{etfRegime.selectedPolicy} · A股：T+1后动态退出 · 转债：数据闸门</small></div>
      </div>
      <div className="ops-kpis">
        <article><span>影子总权益</span><b>{money(combinedEquity)}</b><small>三账户只读合计</small></article>
        <article><span>今日收益</span><b className={todayReturn < 0 ? "negative" : "positive"}>{percent(todayReturn)}</b><small>不是实际资金收益</small></article>
        <article><span>启用以来</span><b className={totalReturn < 0 ? "negative" : "positive"}>{percent(totalReturn)}</b><small>扣除模拟费用与摩擦</small></article>
        <article><span>当前回撤</span><b className={drawdown < 0 ? "negative" : "positive"}>{percent(drawdown)}</b><small>组合只读口径</small></article>
        <article><span>现金 / 敞口</span><b>{percent(combinedCash / Math.max(1, combinedEquity))} / {percent(exposure)}</b><small>账户互不借用现金</small></article>
      </div>
      <div className="ops-30s" aria-label="三十秒决策摘要">
        <article><span>01 · 系统</span><b className={marketHealthy ? "positive" : "negative"}>{marketHealthy ? "正常" : "需处理"}</b><small>{phase} · 云端调度</small></article>
        <article><span>02 · 当前动作</span><b>{decision}</b><small>空仓也可能是策略输出</small></article>
        <article><span>03 · 个股收益</span><b className={aShareReturn < 0 ? "negative" : "positive"}>{percent(aShareReturn)}</b><small>T+1动态退出 · 非真实资金</small></article>
        <article><span>04 · ETF收益</span><b className={etfReturn < 0 ? "negative" : "positive"}>{percent(etfReturn)}</b><small>{etfRegime.selectedPolicy} · 非真实资金</small></article>
        <article><span>05 · 转债收益</span><b className={convertibleReturn < 0 ? "negative" : "positive"}>{percent(convertibleReturn)}</b><small>数据闸门 · 非真实资金</small></article>
        <article><span>06 · 全市场测试</span><b className={fullMarketScanner?.status === "error" ? "negative" : "positive"}>{fullMarketScanner?.status === "scanning" ? "盘中扫描" : "8月10日自动唤醒"}</b><small>{fullMarketScanner?.totalUniverse ?? 6062}只进入资格扫描 · 真单0</small></article>
      </div>
    </section>

    <section className="ops-primary-grid">
      <article className="ops-chart-card">
        <header><div><span>ACCOUNT EQUITY VS BASELINE</span><h2>组合权益与回撤</h2></div><strong>{stamp(data.generatedAt)}</strong></header>
        <EquityCanvas curve={combinedCurve} currency="CNY" axisLabel="影子账户权益（CNY）" />
        <footer><span>基准资金 {money(startingCash)}</span><span>最大可见回撤 {percent(drawdown)}</span><span>点击曲线查看北京时间与权益</span></footer>
      </article>
      <aside className="ops-risk-card">
        <header><span>RISK & EXCEPTIONS</span><h2>风险与异常</h2></header>
        <dl>
          <div><dt>日亏闸门</dt><dd>{percent(-(strategy?.riskLimits.dailyLossLimit ?? .004))}</dd></div>
          <div><dt>硬回撤</dt><dd>{percent(-(strategy?.riskLimits.hardDrawdown ?? .04))}</dd></div>
          <div><dt>总敞口上限</dt><dd>{percent(strategy?.riskLimits.maxPortfolioGrossWeight ?? .4)}</dd></div>
          <div><dt>行情新鲜度</dt><dd>{mirror?.marketDataFreshnessSeconds == null ? "—" : `${mirror.marketDataFreshnessSeconds.toFixed(1)} 秒`}</dd></div>
          <div><dt>ETF扫描覆盖</dt><dd>{scanner?.coverageCount ?? 0} / {scanner?.universeCount ?? 227}</dd></div>
          <div><dt>全市场本轮评估</dt><dd>{fullMarketScanner?.totalScannedThisCycle ?? 0} / {fullMarketScanner?.totalUniverse ?? 6062}</dd></div>
          <div><dt>真实订单</dt><dd>0</dd></div>
        </dl>
        <div className={latestError ? "ops-alert bad" : "ops-alert"}><b>{latestError ? "需要处理" : "暂无运行异常"}</b><p>{latestError ?? "策略正常等待或执行；没有把正常空仓误报为程序故障。"}</p></div>
        <Link href="/execution#historical-validation">查看验证与风险证据 →</Link>
      </aside>
    </section>

    <section className="ops-sleeves" aria-label="三类资产独立策略">
      <header><div><span>THREE INDEPENDENT SLEEVES</span><h2>A股、ETF、可转债分账运行</h2></div><small>不共享现金 · 不交叉保证金 · 不传播熔断</small></header>
      <div>
        <SleeveCard href="/trading/a-share" eyebrow="A-SHARE / T+1" title="个股动态短线" status={aShare?.runtimeStatus ?? "DATA GATED"} equity={aShare?.equity ?? 1_000_000} startingCash={aShare?.startingCash ?? 1_000_000} positions={aShare?.positions ?? 0} trades={aShare?.trades ?? 0} policy="次日起可卖 · 强势延长 · 回撤保护" note={aShare?.blocker ?? "点时数据闸门拦截选股与委托。"} tone="hold" />
        <SleeveCard href="/trading/etf" eyebrow="ETF / T+0" title="ETF 日内策略" status={etf?.runtimeStatus ?? "STARTING"} equity={etf?.equity ?? 1_000_000} startingCash={etf?.startingCash ?? 1_000_000} positions={etf?.positions ?? 0} trades={etf?.trades ?? 0} policy={`${etfRegime.selectedPolicy} · 227只预筛选 / ${strategy?.sleeves.intradayEtf.activeCount ?? 3}只深度镜像`} note={strategy?.sleeves.intradayEtf.blocker ?? "只在信号、成本和风险同时通过时才生成影子委托。"} />
        <SleeveCard href="/trading/convertible-bond" eyebrow="CONVERTIBLE BOND / T+0" title="可转债日内策略" status={convertible?.runtimeStatus ?? "DATA GATED"} equity={convertible?.equity ?? 1_000_000} startingCash={convertible?.startingCash ?? 1_000_000} positions={convertible?.positions ?? 0} trades={convertible?.trades ?? 0} policy="价差 + 流动性 + 转股溢价 + 强赎闸门" note={convertible?.blocker ?? strategy?.sleeves.convertibleBond.blocker ?? "等待可信转债分钟与强赎数据。"} tone="hold" />
      </div>
    </section>

    <section className="ops-flow-grid">
      <article className="ops-position-entry" role="link" tabIndex={0} aria-label="打开全部当前持仓" onClick={(event) => { if (!(event.target as HTMLElement).closest("a")) router.push("/positions"); }} onKeyDown={(event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); router.push("/positions"); } }}><header><div><span>POSITIONS</span><h2>当前持仓</h2></div><Link href="/positions">查看全部 →</Link></header>{mirror?.positions.filter((item) => item.qty !== 0).length ? mirror.positions.filter((item) => item.qty !== 0).map((item) => <Link className="ops-row" href={`/positions/${item.symbol}`} key={item.symbol}><b>{item.symbol} · {item.name}</b><span>{item.qty} 份</span><em className={item.unrealized_pnl < 0 ? "negative" : "positive"}>{money(item.unrealized_pnl)}</em></Link>) : <Link className="ops-empty ops-empty-link" href="/positions">当前三个影子账户均为空仓。点击查看持仓页与字段说明 →</Link>}</article>
      <article><header><span>OPEN ORDERS</span><h2>待成交委托</h2></header>{recentOrders.length ? recentOrders.map((item) => <div className="ops-row" key={item.id}><b>{item.symbol} · {item.side}</b><span>{item.filledQty}/{item.requestedQty}</span><em>{item.status}</em></div>) : <p className="ops-empty">没有待成交影子委托。</p>}</article>
      <article><header><span>TODAY TRADES</span><h2>最近影子成交</h2></header>{recentTrades.length ? recentTrades.map((item) => <div className="ops-row" key={item.id}><b>{item.symbol} · {item.side}</b><span>{item.qty} × {item.price.toFixed(3)}</span><em>{stamp(item.ts)}</em></div>) : <p className="ops-empty">8月7日无新增成交；正常空仓，不是程序掉线。</p>}</article>
    </section>

    <section className="ops-footer-actions">
      <div><b>系统结论</b><span>空仓可能是策略输出。只有出现行情陈旧、调度器停止或风控异常时，才应视为故障。</span></div>
      <Link className="button primary" href="/execution">打开完整实盘策略</Link>
      <Link className="button" href="/vault">查看成果档案</Link>
    </section>
  </div>;
}
