/* Smoke UI minimal — ouvre http://localhost:8077/?smoke=1 et lis la console.
   Visite chaque page (et les sous-vues principales), capte les erreurs console
   fraîches et l'absence de contenu. Aucun framework : c'est volontairement le
   smoke le moins cher possible (AUDIT 2026-06-12 §B.4). N'est jamais actif sans
   le paramètre ?smoke=1. */

(function () {
  if (!/[?&]smoke=1/.test(window.location.search)) return;

  const ROUTES = [
    ["today", {}],
    ["apprendre", { tab: "exercices" }],
    ["apprendre", { tab: "vocab" }],
    ["apprendre", { tab: "structures" }],
    ["apprendre", { tab: "hangeul" }],
    ["apprendre", { tab: "audio" }],
    ["cartes", {}],
    ["atelier", {}],
    ["dialogues", {}],
    ["produire", {}],
    ["pilotage", {}],
    ["pilotage", { view: "liste" }],
    ["pilotage", { view: "sino" }],
    ["pilotage", { view: "phrases" }],
    ["pilotage", { view: "erreurs" }],
  ];
  const WAIT_MS = 900;

  function routeLabel([route, params]) {
    const extra = Object.entries(params).map(([k, v]) => `${k}=${v}`).join(",");
    return extra ? `${route}(${extra})` : route;
  }

  function run() {
    if (typeof window.__goRoute !== "function") {
      console.error("SMOKE: window.__goRoute indisponible — app non montée ?");
      return;
    }
    const results = [];
    const errors = [];
    const origError = console.error;
    console.error = function () { errors.push(String(arguments[0]).slice(0, 160)); origError.apply(console, arguments); };

    let i = 0;
    const visit = () => {
      if (i >= ROUTES.length) {
        console.error = origError;
        const failed = results.filter(r => !r.ok);
        window.__SMOKE_RESULT = { ok: failed.length === 0, results };
        console.table(results);
        if (failed.length === 0) console.log(`SMOKE OK — ${results.length} vues, zéro erreur.`);
        else console.warn(`SMOKE FAIL — ${failed.length}/${results.length} vue(s) en erreur.`, failed);
        document.title = failed.length === 0 ? "SMOKE OK" : `SMOKE FAIL (${failed.length})`;
        window.__goRoute("today");
        return;
      }
      const target = ROUTES[i];
      const before = errors.length;
      window.__goRoute(target[0], target[1]);
      setTimeout(() => {
        const main = document.querySelector("main");
        const text = main ? main.textContent : "";
        const fresh = errors.slice(before);
        results.push({
          vue: routeLabel(target),
          ok: !!main && text.length > 60 && fresh.length === 0,
          chars: text.length,
          erreurs: fresh.join(" | ").slice(0, 80),
        });
        i += 1;
        visit();
      }, WAIT_MS);
    };
    visit();
  }

  // Laisse l'app monter et les premières banques se charger. Babel exécute ce
  // script APRÈS l'événement load : ne pas compter dessus s'il est déjà passé.
  if (document.readyState === "complete") setTimeout(run, 1800);
  else window.addEventListener("load", () => setTimeout(run, 1800));
})();
