/* ============================================================
   AFTERWAVE — APP ROUTER (contract). Mounts #root.
   Loads reports via API.getReport with skeleton/error/failed
   states; workspace obvious + switchable; RTL via artifact.lang.
   ============================================================ */
(function () {
  "use strict";
  const { useState, useEffect } = React;
  const API = window.API, UI = window.UIX, DASH = window.DASH, RPT = window.RPT, RUN = window.RUN, MISC = window.MISC;
  const h = React.createElement;
  const LS = "aw_contract_v1";
  const load = () => { try { return JSON.parse(localStorage.getItem(LS)) || {}; } catch (e) { return {}; } };
  const save = (s) => { try { localStorage.setItem(LS, JSON.stringify(s)); } catch (e) {} };

  /* report loader with states */
  function ReportView({ id, onBack, onCompare }) {
    const [state, setState] = useState({ k: "loading" });
    const fetchIt = React.useCallback(() => {
      setState({ k: "loading" });
      API.getReport(id, { simulateDelay: 480 }).then((rep) => {
        if (rep.status === "failed") setState({ k: "failed", rep });
        else setState({ k: "ok", rep });
      }).catch((err) => setState({ k: "error", err }));
    }, [id]);
    useEffect(fetchIt, [fetchIt]);
    const decide = (rid, d) => { API.patchDecision(rid, d); setState((s) => s.k === "ok" ? { k: "ok", rep: Object.assign({}, s.rep, { decision: s.rep.decision === d ? null : d }) } : s); };
    if (state.k === "loading") return h(MISC.ReportSkeleton, null);
    if (state.k === "error") return h(MISC.ErrorState, { error: state.err, onRetry: fetchIt, onBack });
    if (state.k === "failed") return h(MISC.FailedRun, { report: state.rep, onRetry: () => { window.__rerun && window.__rerun(state.rep.run_id); }, onBack });
    return h(RPT.Report, { report: state.rep, decision: state.rep.decision, onDecide: decide, onBack, onCompare });
  }

  function App() {
    const init = load();
    const [booting, setBooting] = useState(true);
    const [auth, setAuth] = useState(false);
    const [route, setRoute] = useState(init.route && init.route !== "running" ? init.route : "dash");
    const [reportId, setReportId] = useState(init.reportId || API.DEFAULT_REPORT);
    const [running, setRunning] = useState(null);
    const [hasLive, setHasLive] = useState(!!init.hasLive);
    const [workspace, setWorkspace] = useState(null);
    const [wsName, setWsName] = useState("");

    const loadAccount = React.useCallback(() => window.AWAuth.getAccount().then((acc) => { if (acc) { setWorkspace(acc); setWsName(acc.name); } return acc; }), []);
    useEffect(() => { window.AWAuth.getAccount().then((acc) => { if (acc) { setWorkspace(acc); setWsName(acc.name); setAuth(true); } setBooting(false); }); }, []);
    useEffect(() => { save({ route: route === "running" ? "dash" : route, reportId, hasLive }); }, [route, reportId, hasLive]);
    window.__rerun = (id) => { setRunning({ runId: id, fail: false }); setHasLive(true); setRoute("running"); };

    if (booting) return h("div", { style: { minHeight: "100vh", display: "grid", placeItems: "center", color: "var(--ink-3)", fontSize: 13 } }, "Loading…");
    if (!auth) return h(MISC.Login, { onLogin: () => { loadAccount(); setAuth(true); setRoute("dash"); } });

    const openReport = (id, alt) => { if (alt === "history") { setRoute("history"); return; } if (!id) return; setReportId(id); setRoute("report"); };
    const startRun = () => { setRunning({ runId: API.DEFAULT_REPORT, fail: false }); setHasLive(true); setRoute("running"); };
    const goLive = () => { if (!running) setRunning({ runId: API.DEFAULT_REPORT, fail: false }); setHasLive(true); setRoute("running"); };
    const switchWs = () => { setRoute("dash"); };

    const nav = (r) => { if (r === "logout") { window.AWAuth.signOut().then(() => { setAuth(false); setWorkspace(null); }); return; } if (r === "new") { setRoute("new"); return; } if (r === "live") { goLive(); return; } setRoute(r); };

    let body, navRoute = route;
    if (route === "dash") body = h(DASH.Dashboard, { onOpen: openReport, onNew: () => setRoute("new"), workspace });
    else if (route === "new") body = h(RUN.NewSimulation, { onRun: startRun, onCancel: () => setRoute("dash") });
    else if (route === "running") { navRoute = "live"; body = h(RUN.Running, { runId: running.runId, failMode: running.fail, onComplete: () => openReport(running.runId), onCancel: () => setRoute("dash") }); }
    else if (route === "report") { navRoute = "dash"; body = h(ReportView, { id: reportId, onBack: () => setRoute("dash"), onCompare: (id) => { setReportId(id); setRoute("compare"); } }); }
    else if (route === "compare") { navRoute = "history"; body = h(MISC.Compare, { initialA: reportId, onOpen: openReport }); }
    else if (route === "history") body = h(MISC.History, { onOpen: openReport, onNew: () => setRoute("new") });
    else if (route === "settings") body = h(MISC.Settings, { workspace });
    else body = h(DASH.Dashboard, { onOpen: openReport, onNew: () => setRoute("new"), workspace });

    return h(UI.Shell, { route: navRoute, onNav: nav, live: hasLive, usage: workspace ? workspace.usage.used : 0, limit: workspace ? workspace.usage.limit : 10, ws: wsName, role: workspace ? workspace.role : "owner", onWorkspace: switchWs }, body);
  }

  ReactDOM.createRoot(document.getElementById("root")).render(h(App));
})();
