/* TDCC 大戶持股分級
 *
 * window.TDCC = {
 *   getHistory(symbol, weeks=20) → Promise<{ weeks: [{ date, levels }] }>
 *   refresh() → Promise (POST /tdcc/refresh，立即觸發 worker 抓最新一週)
 *   getStatus() → Promise<{ weeks, meta }>
 *   isEnabled() → bool（worker URL 已設定）
 *
 *   helpers：
 *     levelStockMin(level)   級距 N 對應股數下界（例：15 → 1,000,001 股）
 *     ratioAtOrAbove(levels, level)  累加 ≥ level 的占比%
 *
 * Level 對應（17 級距）：
 *   1 = 1-999, 2 = 1k-5k, ..., 14 = 800k-1M, 15 = 1M 以上, 16 = 差異調整, 17 = 合計
 */

const LEVEL_LBOUND_SHARES = [
  1, 1000, 5001, 10001, 15001, 20001, 30001, 40001, 50001,
  100001, 200001, 400001, 600001, 800001, 1000001,
  // 16 = 差異, 17 = 合計（兩者皆無 LBOUND 意義）
  null, null,
];

function levelStockMin(level) {
  return LEVEL_LBOUND_SHARES[level - 1] ?? null;
}

/* 「≥ X 張」對應的起始級距（1 張 = 1000 股）
 *  100 張 → 100,000 股 → 級距 10 起算
 *  400 張 → 400,000 股 → 級距 12 起算
 *  1000 張 → 1,000,000 股 → 級距 15 起算 */
const LOT_TO_LEVEL = {
  100:  10,
  200:  11,
  400:  12,
  600:  13,
  800:  14,
  1000: 15,
};

function startLevelForLots(lots) {
  return LOT_TO_LEVEL[lots] ?? 15;
}

/* 累加從 startLevel 到 15 的占比% (排除 16=差異, 17=合計) */
function ratioAtOrAbove(levels, startLevel) {
  if (!Array.isArray(levels)) return null;
  let sum = 0;
  let anyValid = false;
  for (let i = startLevel - 1; i <= 14; i++) {
    const row = levels[i];
    if (row && Number.isFinite(row[2])) { sum += row[2]; anyValid = true; }
  }
  return anyValid ? sum : null;
}

function workerBase() {
  return (window.Intraday && window.Intraday.getWorkerUrl()) || "";
}
function authHeader() {
  const auth = window.Intraday && window.Intraday.getAuth();
  return auth ? { "X-Auth": auth } : {};
}

async function getHistory(symbol, weeks = 20) {
  /* TDCC 只有台股 — 美股直接回空 */
  if (!symbol.endsWith(".TW")) return { weeks: [] };
  const base = workerBase();
  if (!base) throw new Error("尚未設定 Worker URL");
  const id = symbol.replace(/\.TW$/, "");
  const url = `${base.replace(/\/$/, "")}/tdcc?stock=${encodeURIComponent(id)}&weeks=${weeks}`;
  const res = await fetch(url, { headers: authHeader() });
  const text = await res.text();
  let json;
  try { json = JSON.parse(text); } catch (e) { throw new Error(`Worker 回傳非 JSON：${text.slice(0,80)}`); }
  if (!res.ok || json.error) throw new Error(json.error || `HTTP ${res.status}`);
  return json;
}

async function refresh() {
  const base = workerBase();
  if (!base) throw new Error("尚未設定 Worker URL");
  const url = `${base.replace(/\/$/, "")}/tdcc/refresh`;
  const res = await fetch(url, { method: "POST", headers: authHeader() });
  const text = await res.text();
  let json;
  try { json = JSON.parse(text); } catch (e) { throw new Error(`Worker 回傳非 JSON：${text.slice(0,80)}`); }
  if (!res.ok || json.error) throw new Error(json.error || `HTTP ${res.status}`);
  return json;
}

async function getStatus() {
  const base = workerBase();
  if (!base) throw new Error("尚未設定 Worker URL");
  const url = `${base.replace(/\/$/, "")}/tdcc/status`;
  const res = await fetch(url, { headers: authHeader() });
  const text = await res.text();
  let json;
  try { json = JSON.parse(text); } catch (e) { throw new Error(`Worker 回傳非 JSON：${text.slice(0,80)}`); }
  if (!res.ok || json.error) throw new Error(json.error || `HTTP ${res.status}`);
  return json;
}

function isEnabled() { return !!workerBase(); }

window.TDCC = {
  getHistory, refresh, getStatus, isEnabled,
  levelStockMin, startLevelForLots, ratioAtOrAbove,
  LOT_OPTIONS: [100, 200, 400, 600, 800, 1000],
};
