/* global React, LEVER_LIB */
/* ============================================================
   Scenario store — governed scenario objects (frontend/local only)
   No backend engine, no real approval execution, no export unlock.
   Lifecycle: Draft → REVIEW_PENDING → APPROVED_INTERNAL → Archived
   ============================================================ */
const { useState: useScenState, useEffect: useScenEffect } = React;

const SCEN_KEY = "tos_scenarios";
const SNAPSHOT = "Q2-2026 · Jun 30";

// default levers map for a family (key → value), seeded from LEVER_LIB severe band
function seedLevers(keys) {
  const m = {};
  LEVER_LIB.forEach(g => g.levers.forEach(l => {
    const key = g.type + "|" + l.name;
    if (keys.includes(key)) m[key] = l.bands[2]; // severe band default
  }));
  return m;
}

const SEED = [
  { id: "s1", name: "NBE adverse · deposit run", family: "Liquidity", severity: "Severe", owner: "dawit", checker: "sara",
    state: "APPROVED_INTERNAL", version: 3, snapshot: SNAPSHOT, lastRun: "Jun 30, 14:20", lastResult: "1 breach",
    levers: { "Liquidity / Behavioral|Retail deposit run-off": 18, "Liquidity / Behavioral|SME deposit run-off": 30, "Liquidity / Behavioral|Inflow realisation": 60, "Market / FX|HQLA Level 2A haircut": 35 } },
  { id: "s2", name: "Wholesale funding non-rollover", family: "Liquidity", severity: "Severe", owner: "dawit", checker: "",
    state: "REVIEW_PENDING", version: 1, snapshot: SNAPSHOT, lastRun: "Jun 29", lastResult: "1 breach",
    levers: { "Liquidity / Behavioral|Inflow realisation": 60, "Liquidity / Behavioral|Undrawn commitment draw-down": 40, "Liquidity / Behavioral|Retail deposit run-off": 14 } },
  { id: "s3", name: "FX depreciation 25%", family: "Market", severity: "Moderate", owner: "abel", checker: "hana",
    state: "APPROVED_INTERNAL", version: 2, snapshot: SNAPSHOT, lastRun: "Jun 30, 09:10", lastResult: "1 breach",
    levers: { "Market / FX|FX depreciation — USD": 25, "Market / FX|Gold / commodity shock": 20, "Market / FX|HQLA Level 2A haircut": 28 } },
  { id: "s4", name: "Combined macro downturn", family: "Combined", severity: "Severe", owner: "hana", checker: "",
    state: "REVIEW_PENDING", version: 1, snapshot: SNAPSHOT, lastRun: "Jun 28", lastResult: "2 breaches",
    levers: { "Market / FX|FX depreciation — USD": 25, "Liquidity / Behavioral|Retail deposit run-off": 18, "Credit|Rating migration (downgrade)": 3, "Capital|Cross-holding write-down": 145, "Liquidity / Behavioral|Inflow realisation": 60, "Credit|NPL surge": 35, "Operational|Loss-event severity": 3 } },
  { id: "s5", name: "HQLA eligibility tightening", family: "Liquidity", severity: "Mild", owner: "sara", checker: "",
    state: "DRAFT", version: 1, snapshot: SNAPSHOT, lastRun: "—", lastResult: "—",
    levers: { "Market / FX|HQLA Level 2A haircut": 20, "Liquidity / Behavioral|Retail deposit run-off": 10 } },
];

function loadScen() {
  try { const v = JSON.parse(localStorage.getItem(SCEN_KEY)); if (Array.isArray(v) && v.length) return v; } catch (e) {}
  return SEED;
}
function persist(arr) { localStorage.setItem(SCEN_KEY, JSON.stringify(arr)); window.dispatchEvent(new Event("tos-scenarios")); }

function useScenarios() {
  const [arr, setArr] = useScenState(loadScen);
  useScenEffect(() => {
    const h = () => setArr(loadScen());
    window.addEventListener("tos-scenarios", h); window.addEventListener("storage", h);
    return () => { window.removeEventListener("tos-scenarios", h); window.removeEventListener("storage", h); };
  }, []);
  return arr;
}

const ScenStore = {
  list: loadScen,
  get: (id) => loadScen().find(s => s.id === id),
  save(obj) {
    const arr = loadScen();
    const i = arr.findIndex(s => s.id === obj.id);
    if (i >= 0) { obj.version = (arr[i].version || 1) + (obj._bumpVersion ? 1 : 0); delete obj._bumpVersion; arr[i] = obj; }
    else { obj.id = "s" + Date.now().toString().slice(-6); obj.version = 1; arr.unshift(obj); }
    persist(arr); return obj;
  },
  setState(id, state, extra) {
    const arr = loadScen(); const s = arr.find(x => x.id === id);
    if (s) { s.state = state; if (extra) Object.assign(s, extra); persist(arr); }
  },
  recordRun(id, result) {
    const arr = loadScen(); const s = arr.find(x => x.id === id);
    if (s) { s.lastRun = "just now"; s.lastResult = result; persist(arr); }
    // append to run history
    let runs = []; try { runs = JSON.parse(localStorage.getItem("tos_runs") || "[]"); } catch (e) {}
    runs.unshift({ id: "R-" + Date.now().toString().slice(-4), scenario: s ? s.name : id, snapshot: SNAPSHOT, by: s ? s.owner : "dawit", when: "just now", result, state: s ? s.state : "DRAFT", version: s ? s.version : 1 });
    localStorage.setItem("tos_runs", JSON.stringify(runs)); window.dispatchEvent(new Event("tos-runs"));
  },
};

Object.assign(window, { useScenarios, ScenStore, seedLevers, SNAPSHOT });
