/* ZY console — 共享部件：目的条 + KPI 卡 + 中文标签字典 + 掩码身份 + Hermes 副手面板。各角色工作台复用。

   文案铁律（全站约定，任何新写的 flow/action/卡片都必须遵守）：
   - KitStrip 的 `src` 参数【只能】是中文经营语言来源名（如「采购建议日报（只读）」），
     【绝不】传原始 schema_version / HTTP 路由 / 表名（如 procurement_daily_digest.v1、
     GET /internal/xxx、mz_reviews）。原始技术串只在「系统审计」工作台展示。
   - 任何 previewRows/receiptRows/payload 展示行的 k（标签）必须是中文，禁止出现英文
     schema 字段名或 true/false 字面量；查不到对应中文时用 CN_LABELS/trCN()，不要新造英文键。
   - 老板可见面禁止裸英文枚举（如 needs_improvement、sold_out）；每个枚举值都要有中文翻译。 */
const DSPARTS = window.ZYDesignSystem_d746df;

/* 常见技术字段 → 中文标签／取值 的翻译字典。新增字段时补充这里，不要在各文件里各写各的。 */
const CN_LABELS = {
  would_write: "是否写入",
  write_status: "写入状态",
  readback_status: "回读校验",
  readback_confirmed: "回读校验",
  decision_ref: "审批引用编号",
  reviewer: "审批人",
  source_unavailable: "数据源不可用",
  purchase_order_ref: "采购单号",
  purchase_in_ref: "入库单号",
  procurement_scope: "采购范围",
  supplier_ref: "供应商编号",
  line_count: "款数",
  total_qty: "总件数",
  jst_write_count: "本次写入次数",
  count_verified: "盘点已确认",
  counted_by: "盘点人",
  in_status: "入库状态",
  po_id: "采购单号",
  io_id: "入库单号",
  business_write_performed: "含业务写",
  cash_assessed: "资金维度已启用",
  schema_version: "数据版本",
  // TikTok Shop 7 卡 attention 枚举 → 中文（老板/COO 面必须显示中文，裸英文只留系统审计）
  to_ship: "待发货", to_return: "待退货", rejected_products: "被拒商品", low_stock: "低库存", bad_reviews: "差评",
  ship_within_24h: "24h 内发货", auto_cancel_within_24h: "24h 内自动取消", stockout_timeout: "缺货超时",
  order_cancel: "订单取消", logistics_issue: "物流异常", return_refund_requested: "申请退货退款",
  needs_attention: "需要关注", sold_out: "售罄", needs_improvement: "需改进", product_violations: "商品违规",
  unread_violation_record: "未读违规记录", about_to_expire: "即将到期", cancelling: "取消中",
  respond_within_24h: "24h 内待回复", auto_approved_7d: "7 天自动通过", can_be_appealed: "可申诉",
  disputes_awaiting_response: "纠纷待回复", awaiting_merchant: "待商家处理", awaiting_tiktok_or_customer: "待平台/客户",
  appealed_or_disputed: "申诉/纠纷中", on_sale: "在售", under_review: "审核中", delisted: "已下架", draft: "草稿", deleted: "已删除",
  // TikTok Shop 状态分布 / 客服 / 联盟 剩余枚举（老板面走中文，避免各文件另起本地字典）
  all: "全部", shipped: "已发货", completed: "已完成", pending: "待处理", cancelled: "已取消", delivery_failed: "派送失败", resolved: "已解决",
  urgent: "紧急", expired: "已过期", unreplied: "未回复", unread: "未读", ongoing: "进行中",
};

const CN_VALUES = {
  true: "是", false: "否",
  confirmed: "通过", unknown: "待定", failed: "未通过",
  success: "成功",
};

/* trCN(key, val) —— 中文化一个技术字段的标签与取值；查不到就原样返回（不崩，但请尽量补字典）。 */
function trCN(key, val) {
  const k = CN_LABELS[key] || key;
  const v = (val === true || val === false || val === "true" || val === "false")
    ? CN_VALUES[String(val)] : (CN_VALUES[val] ?? val);
  return { k, v };
}

function KitStrip({ icon, title, mode, judge, src, tone = "good", toneLabel = "已接入" }) {
  const { Icon, Pill } = DSPARTS;
  return (
    <div className="card card--pad ovstrip">
      <div className="ovstrip__head">
        <span className="ovstrip__orb"><Icon name={icon} size={20} /></span>
        <div className="ovstrip__id">
          <div className="ovstrip__title">{title}<span className="ovstrip__mode"><span className="ovstrip__dot" />{mode}</span></div>
        </div>
        <div className="ovstrip__src">
          <span className="ovstrip__srclabel">数据源</span>
          <span className="ovstrip__srcval">{src}</span>
          {toneLabel ? <Pill tone={tone} soft>{toneLabel}</Pill> : null}
        </div>
      </div>
      {judge ? <div className="ovstrip__judge">{judge}</div> : null}
    </div>
  );
}

function KitKpi({ label, value, hint, pill, pillTone, icon, iconColor, feat, valTone }) {
  const { Icon, Pill } = DSPARTS;
  return (
    <div className={"kpi" + (feat ? " kpi--feat" : "")}>
      <div className="kpi__top">
        <span className="kpi__label">{label}</span>
        {pill ? <Pill tone={pillTone} soft>{pill}</Pill> : icon ? <Icon name={icon} size={15} style={{ color: iconColor || "var(--fg-3)" }} /> : null}
      </div>
      <div className={"kpi__val num" + (valTone ? " " + valTone : "")} style={valTone === "good" ? { color: "var(--positive)" } : undefined}>{value}</div>
      <div className="kpi__hint">{hint}</div>
    </div>
  );
}

/* 通用状态徽标 —— 传入自己的 enum→{label,tone} 映射，不共享一套"万能"颜色表，
   避免不同域（1688 引流 4 态 / 电商 ROAS 3 态 / 交付状态 5 态）互相污染。 */
function KitEnumBadge({ value, map, fallbackTone = "muted" }) {
  const { Pill } = DSPARTS;
  const m = (map && map[value]) || { label: value ?? "—", tone: fallbackTone };
  return <Pill tone={m.tone} soft>{m.label}</Pill>;
}

/* 多币种安全格式化：null/undefined 一律渲染「—」，绝不显示 0 或 NaN 冒充真实取值。
   currency=null（上游币种解析降级的诚实未知）不走 CNY 缺省也不猜符号——渲「（币种未知）」。 */
function fmtMoney(v, currency = "CNY") {
  if (v === null || v === undefined || Number.isNaN(v)) return "—";
  const sign = v < 0 ? "-" : "";
  const abs = Math.abs(v);
  if (!currency) return sign + abs.toLocaleString("en-US", { maximumFractionDigits: 2 }) + "（币种未知）";
  if (currency === "CNY") return sign + "¥" + abs.toLocaleString("zh-CN", { maximumFractionDigits: 2 });
  if (currency === "USD") return sign + "$" + abs.toLocaleString("en-US", { maximumFractionDigits: 2 });
  if (currency === "MYR") return sign + "RM" + abs.toLocaleString("en-US", { maximumFractionDigits: 2 });
  return sign + currency + " " + abs.toLocaleString("en-US", { maximumFractionDigits: 2 });
}

/* 客户/绑定身份掩码 —— 任何客户可识别信息（姓名/手机号/平台买家号）默认掩码展示。
   name: 展示名（如"陈先生"，本身已是花名，不是掩码对象）；raw: 原始平台号（如 buyer_0091）。 */
function KitMaskedIdentity({ label, name, raw, confidence, lowConfidence }) {
  const tail = raw ? String(raw).replace(/^\D+/, "").slice(-4) : null;
  return (
    <span className="masked-id">
      {lowConfidence
        ? <span className="masked-id__unknown">未知客户 · 待人工核对</span>
        : <span>{label ? label + "：" : ""}{name}{tail ? <span className="masked-id__tail"> · 尾号 {tail}</span> : null}</span>}
      {confidence != null && <span className="masked-id__conf num"> · 置信 {Math.round(confidence * 100)}%</span>}
    </span>
  );
}

/* Hermes 副手 · COO 记忆 —— 学习状态摘要 + 每条 attention 的教 Hermes 入口 + 可恢复的抑制抽屉。
   数据源约定：调用方传入符合 hermes-feedback-ui-contract.md 的 summary 对象：
   { learned_total, suppressed_this_round, resolved_history_count, pending_candidates, pending_candidates_cumulative,
     suppressed_items: [{ area, key, reason, suppressed_at }] }
   onTeach(item, kind, note) — kind ∈ 'normal'|'resolved'|'note'；onRestore(suppressedItem)。 */
function KitHermesAssistantPanel({ summary, attentionItems, onTeach, onRestore }) {
  const { Icon } = DSPARTS;
  const [open, setOpen] = React.useState(false);
  const [taught, setTaught] = React.useState({});
  const s = summary || {};
  const teach = (item, kind) => {
    if (onTeach) onTeach(item, kind, "");
    setTaught(t => ({ ...t, [item.key || item.sku_id || item.name]: true }));
  };
  return (
    <div className="card card--pad hermespanel">
      <div className="hermespanel__head">
        <span className="hermespanel__orb"><Icon name="Sparkles" size={16} /></span>
        <div className="hermespanel__t">Hermes 副手 · COO 记忆</div>
        <span className="hermespanel__chip">Hermes 已学会 {s.learned_total ?? 0} 条</span>
      </div>
      <div className="hermespanel__stats">
        <span>本轮抑制 {s.suppressed_this_round ?? 0} 项</span>
        <span>历史处理 {s.resolved_history_count ?? 0} 条</span>
        <span>待审记忆候选 {s.pending_candidates ?? 0}{s.pending_candidates_cumulative ? `（累计 ${s.pending_candidates_cumulative}）` : ""}</span>
      </div>
      {(attentionItems || []).map((item, i) => (
        <div className="hermespanel__row" key={i}>
          <div className="hermespanel__rowmain">
            <span className="hermespanel__area">{item.areaLabel || item.area}</span>
            {item.recommended_action_from_history && <div className="hermespanel__note">历史处理：{item.recommended_action_from_history}</div>}
            {item.knowledge_note && <div className="hermespanel__note">记一笔：{item.knowledge_note}</div>}
          </div>
          {taught[item.key || item.sku_id || item.name]
            ? <span className="hermespanel__done">已反馈 ✓ 明日生效</span>
            : <button className="btn btn--ghost btn--sm" onClick={() => teach(item, "normal")}>教 Hermes</button>}
        </div>
      ))}
      {(s.suppressed_items || []).length > 0 && (
        <div className="hermespanel__suppressed">
          <button className="hermespanel__toggle" onClick={() => setOpen(o => !o)}>
            <Icon name={open ? "ChevronDown" : "ChevronRight"} size={13} />
            已被学习抑制 {s.suppressed_items.length} 项（每行含抑制原因 · 可恢复）
          </button>
          {open && s.suppressed_items.map((it, i) => (
            <div className="hermespanel__suprow" key={i}>
              <span>{it.area}{it.key ? " · " + it.key : ""} — {it.reason}</span>
              <button className="btn btn--ghost btn--sm" onClick={() => onRestore && onRestore(it)}>恢复 / 不再抑制</button>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

Object.assign(window, { KitStrip, KitKpi, KitEnumBadge, KitMaskedIdentity, KitHermesAssistantPanel, CN_LABELS, trCN, fmtMoney });
