import { Hono } from 'hono';
import type { Bindings } from '../types';
import { readAuthStore } from '../lib/portal-auth-store';

export const healthRouter = new Hono<{ Bindings: Bindings }>();

/**
 * 認證儲存狀態（2026-08-14 起：console 帳密住 SESSIONS_KV、portal 帳號住 KBDB，
 * 兩者皆 binding-based，不再需要外部 CF token 才寫得進去——見 console-auth.ts／portal.ts
 * 檔頭「D61 補充」說明）。`legacy_*_present` 只回是否還有 D61 時代留在認證儲存（CF Workers
 * Secrets）裡尚未搬遷的資料，不洩漏任何 email／雜湊內容。
 */
function authStoreStatus(env: Bindings): {
  console: { home: 'sessions-kv'; writable: true; legacy_secrets_present: boolean };
  portal_users: { home: 'kbdb'; writable: true; legacy_secrets_present: boolean };
} {
  const legacy = readAuthStore(env);
  return {
    console: { home: 'sessions-kv', writable: true, legacy_secrets_present: legacy.console !== null },
    portal_users: { home: 'kbdb', writable: true, legacy_secrets_present: legacy.users.length > 0 },
  };
}

// t162（leo 07-31 實撞：「小幫手一直顯示知識庫需要更新…重新更新後並不會消失」）：
// daemon cloudVersionStale() 讀 /health 的 `bundle_version` 判斷是否過舊——
// 但本端點過去只回 {ok:true}，**從沒吐這個欄位** ⇒ daemon 恆讀到空字串
// ⇒ 恆判 stale ⇒ 假警報永遠不消失（安裝器其實一直有注入 ARCRUN_BUNDLE_VERSION var，
// 只是沒有人把它吐出來）。修＝誠實回報本實例的 bundle 版本。
// 未注入（本地 dev／很舊的實例）就省略該欄——daemon 對空字串仍判 stale，
// 那是**正確的**（真的是老實例，該更新）。
// D61（ADR D61 / Leo/arcrun-rag#55）：多吐一個 `auth_store`——「認證住哪、寫不寫得進去」
// 要在實例自己這一側就看得出來，不是等用戶登不進去才發現（#10「寧可明顯失敗」）。
// 只回統計不回內容（帳號數／有沒有 console 帳密／分片數），不洩漏任何 email 或雜湊。
// bundle_version 的既有行為不動（未注入就省略該欄——daemon 對空字串判 stale 是正確的）。
// Arcrun#106（leo 08-12 實撞：更新完設定頁變成「無法讀取目前版本」）：
// `bundle_version` 只在部署時被注入，而**只有安裝器會注入**——CLI 更新那條路重部署
// 等於把這個標籤洗掉（wrangler deploy 整份覆蓋，toml 沒寫的 var 直接消失）。
// 修在 CLI 那側（cli/src/lib/deploy.ts：既有 var 沿用 + 版本標籤每趟重烙）。
// 這裡只多吐一個 `bundle_commit`：版號是「發行頻道的編號」，commit 才是「真的部了哪份碼」——
// 兩個一起看才有辦法查「標籤有沒有跟成品漂掉」。沒注入就省略該欄（同 bundle_version 的既有行為）。
healthRouter.get('/health', (c) => {
  const bundleVersion = c.env.ARCRUN_BUNDLE_VERSION;
  const bundleCommit = c.env.ARCRUN_BUNDLE_COMMIT;
  return c.json({
    ok: true,
    ...(bundleVersion ? { bundle_version: bundleVersion } : {}),
    ...(bundleCommit ? { bundle_commit: bundleCommit } : {}),
    auth_store: authStoreStatus(c.env),
    // arcrun-rag#38/#69/#25（2026-08-11）：安裝器判斷「要不要重推」只比 bundle_version——
    // 但這次要修的洞是「installer 從沒注入過 PORTAL_MAIL_RELAY_BASE」，跟 bundle 內容
    // 版本無關（同一個 cypher 版本，有的實例有這個 var、有的沒有）。純比版本號的話，
    // 已經在最新版的實例（如 leo 自己那台）永遠不會因為「按更新」而重推，這個 var
    // 就永遠補不進去。只回布林（有沒有設，不回值本身）——不洩漏郵差網址。
    mail_relay_configured: Boolean(String(c.env.PORTAL_MAIL_RELAY_BASE ?? '').trim()),
  });
});

healthRouter.get('/', (c) =>
  c.json({
    service: 'arcrun-cypher-executor',
    version: '1.0.0',
    status: 'ok',
  })
);
