/* ZY console — 系统审计 · 数据源健康（架构师 / 系统管理员）。
   架构师视图允许出现路由 / 系统 / 同步阈值等技术细节——这是它该在的地方，不进老板默认视图。 */
const DSAUDIT = window.ZYDesignSystem_d746df;

const SRC_TONE = { "已接入": "good", "延迟": "warn", "待真实数据": "neutral", "错误": "danger", "受阻": "danger", "部分接入": "warn", "待接入": "neutral" };

// delivery 是与 status(接入/同步健康) 独立的第二维度：是否真的有一个已注册、可调用的端点。
// 待接入/待后端聚合/建议端点未上线 都是「诚实未建」态，不应读成 warn/danger 的告警色。
const DELIVERY_TONE = {
  "已上线端点": "good",
  "建议端点 · 未上线": "neutral",
  "待后端聚合": "neutral",
  "先 mock": "neutral",
  "先 mock（受控写审计已上线）": "neutral",
  "待接入(无COO)": "neutral",
  "待接入(token 过期)": "danger",
  "已退役": "danger",
};

// 受控写回执审计 — 域(domain) 中文化；审批引用/回读确认/是否回滚 全部走中文标签，
// 原始 decision_ref 字段名本身不作为可见标签出现。
const CWA_DOMAIN_LABEL = {
  "TikTok Shop": "TikTok Shop", "Shopify": "Shopify", "采购": "采购", "仓储": "仓储", "财务": "财务",
};

function KitAudit() {
  const { Card, SectionHead, Pill, Icon } = DSAUDIT;
  const K = window.KIT;
  const rows = K.sources;
  const ok = rows.filter(r => r.delivery === "已上线端点").length;
  const lag = rows.filter(r => r.status === "延迟").length;
  const pending = rows.filter(r => r.status !== "已接入" && r.delivery !== "已上线端点").length;
  const writes = rows.reduce((s, r) => s + r.writes, 0);
  const cwaRows = K.controlledWriteAudit || [];
  const tpl = "1.4fr 1.3fr 0.8fr 1.1fr 0.7fr 0.7fr 0.7fr 0.8fr";
  const cwaTpl = "1fr 1.4fr 1.2fr 0.8fr 0.8fr 1fr";

  return (
    <div className="view viewfade">
      <Card className="ovstrip">
        <div className="ovstrip__head">
          <span className="ovstrip__orb"><Icon name="ShieldCheck" size={20} /></span>
          <div className="ovstrip__id">
            <div className="ovstrip__title">数据源健康<span className="ovstrip__mode"><span className="ovstrip__dot" />架构师 / 系统管理员</span></div>
            <div className="ovstrip__judge">各只读接口状态、生成时间、同步阈值与 no-write 证明 · 技术证据默认只在本视图展开</div>
          </div>
          <div className="ovstrip__src">
            <span className="ovstrip__srclabel">数据源</span>
            <span className="ovstrip__srcval">source_health</span>
            <Pill tone="good" soft>只读</Pill>
          </div>
        </div>
      </Card>

      <div className="kpigrid">
        <Card className="kpi" hover><div className="kpi__top"><span className="kpi__label">数据源</span><Icon name="Plug" size={15} style={{ color: "var(--fg-3)" }} /></div>
          <div className="kpi__val num">{rows.length}</div><div className="kpi__hint">只读读模型接口</div></Card>
        <Card className="kpi" hover><div className="kpi__top"><span className="kpi__label">已上线端点</span><Pill tone="good" soft>正常</Pill></div>
          <div className="kpi__val num ovstat--good" style={{ color: "var(--positive)" }}>{ok}</div><div className="kpi__hint">返回真实数据</div></Card>
        <Card className="kpi" hover><div className="kpi__top"><span className="kpi__label">延迟 / 未上线</span><Pill tone="warn" soft>关注</Pill></div>
          <div className={"kpi__val num" + ((lag + pending) ? " ovstat--warn" : "")}>{lag + pending}</div><div className="kpi__hint">超阈值、待后端聚合或待接入</div></Card>
        <Card className="kpi kpi--feat" hover><div className="kpi__top"><span className="kpi__label">读模型写入</span><Pill tone="good" soft>no-write</Pill></div>
          <div className="kpi__val num" style={{ color: "var(--positive)" }}>{writes}</div><div className="kpi__hint">读模型路由 · 恒为 0</div></Card>
        <Card className="kpi" hover><div className="kpi__top"><span className="kpi__label">受控写回执</span><Pill tone="accent" soft>本窗</Pill></div>
          <div className="kpi__val num">{cwaRows.length}</div><div className="kpi__hint">跨 COO 受控写 · 均含审批引用 + 回读确认</div></Card>
      </div>

      <Card>
        <div className="cabound" style={{ marginBottom: 16 }}>
          <div className="cabound__cap"><Icon name="ShieldCheck" size={13} />no-write 证明</div>
          <div className="cabound__li"><Icon name="Check" size={13} />所有读模型为 GET-only / 只读路由，写计数器恒为 0</div>
          <div className="cabound__li"><Icon name="Check" size={13} />客户原文、token、原始 payload 在运行边界被剥离</div>
          <div className="cabound__li"><Icon name="Check" size={13} />任何业务写入都经预检 → 审批包 → 执行单 → 回执/回读四闸门</div>
        </div>
        <SectionHead title="数据源明细" icon="Plug" sub="路由 / 系统 / 接入状态 / 交付状态 / 生成时间 / 同步阈值 / 写入 / 脱敏自检——架构师审计视图"
          right={<Pill tone="neutral">{ok}/{rows.length} 已上线端点</Pill>} />
        <div className="dtscroll">
          <div className="dt" style={{ minWidth: 1080 }}>
            <div className="dt__head" style={{ gridTemplateColumns: tpl }}>
              <span>数据源 · 路由</span><span>系统</span><span>状态</span><span>交付状态</span><span>生成</span><span>同步</span><span>写入</span><span>脱敏自检</span>
            </div>
            {rows.map((r, i) => (
              <div className="dt__row" style={{ gridTemplateColumns: tpl }} key={i}>
                <span className="dt__name"><b>{r.name}</b><span className="dt__sub num">{r.route}</span></span>
                <span className="dt__sub2">{r.system}</span>
                <span><Pill tone={SRC_TONE[r.status]} soft>{r.status}</Pill></span>
                <span><Pill tone={DELIVERY_TONE[r.delivery] || "neutral"} soft>{r.delivery || "—"}</Pill></span>
                <span className="dt__sub2 num">{r.at}</span>
                <span className={"dt__sub2" + (r.status === "延迟" ? " ovstat--warn" : "")}>{r.sync}</span>
                <span className="num" style={{ color: "var(--positive)" }}>{r.writes}</span>
                <span>
                  {r.redaction_clean === true
                    ? <Pill tone="good" soft>已核验</Pill>
                    : r.redaction_clean === false
                      ? <Pill tone="warn" soft>待核验</Pill>
                      : <Pill tone="neutral" soft>不适用</Pill>}
                </span>
              </div>
            ))}
          </div>
        </div>
      </Card>

      <Card>
        <div className="cabound" style={{ marginBottom: 16 }}>
          <div className="cabound__cap"><Icon name="ShieldCheck" size={13} />受控写回执审计 · 只读审计,非动作</div>
          <div className="cabound__li"><Icon name="Check" size={13} />每笔真实业务写入都必须在此留下一条回执，域 / 审批引用 / 执行者 / 回读确认 / 是否回滚 五项齐全</div>
          <div className="cabound__li"><Icon name="Check" size={13} />本表不展示原始 payload、客户信息或密钥——只展示回执元数据</div>
        </div>
        <SectionHead title="受控写回执审计" icon="ClipboardCheck" sub="域 / 审批引用 / 执行者 / 回读确认 / 是否回滚——跨 COO 受控写统一审计"
          right={<Pill tone="accent">{cwaRows.length} 笔 · 本窗</Pill>} />
        <div className="dtscroll">
          <div className="dt" style={{ minWidth: 760 }}>
            <div className="dt__head" style={{ gridTemplateColumns: cwaTpl }}>
              <span>域</span><span>审批引用</span><span>执行者</span><span>回读确认</span><span>是否回滚</span><span>时间</span>
            </div>
            {cwaRows.length === 0 ? (
              <div className="dt__row" style={{ gridTemplateColumns: "1fr" }}>
                <span className="dt__sub2">本窗期无受控写</span>
              </div>
            ) : cwaRows.map((w, i) => (
              <div className="dt__row" style={{ gridTemplateColumns: cwaTpl }} key={i}>
                <span className="dt__item" style={{ fontWeight: 600 }}>{CWA_DOMAIN_LABEL[w.domain] || w.domain}</span>
                <span className="dt__sub num">{w.decision_ref}</span>
                <span className="dt__sub2">{w.executor}</span>
                <span><Pill tone={w.readback_confirmed ? "good" : "warn"} soft>{w.readback_confirmed ? "是" : "否"}</Pill></span>
                <span><Pill tone={w.rolled_back ? "danger" : "neutral"} soft>{w.rolled_back ? "是" : "否"}</Pill></span>
                <span className="dt__sub2 num">{w.at}</span>
              </div>
            ))}
          </div>
        </div>
      </Card>
    </div>
  );
}

Object.assign(window, { KitAudit });
