/* ============================================================
   KAARTEFFECTEN — LOKALE IMPORT (alleen in de browser)
   De officiële kaartteksten worden NIET met de app meegeleverd.
   De gebruiker laadt zelf een bestand (bron waarvoor die
   gemachtigd is); het blijft in localStorage van deze browser
   en wordt nergens naartoe gestuurd of in de repo bewaard.
   ============================================================ */
const EFFECTS_KEY = "armada_effects_v1";

// dataset-slot → app-slot (cards.jsx gebruikt de "-retrofit"/meervoud-vorm)
const EFF_SLOT_MAP = {
  "offensive-retro": "offensive-retrofit",
  "defensive-retro": "defensive-retrofit",
  "experimental-retro": "experimental-retrofit",
  "weapons-team-offensive-retro": "offensive-retrofit",
  "ion-cannon": "ion-cannons",
  "turbolaser": "turbolasers",
};
const normEffSlot = (s) => EFF_SLOT_MAP[s] || s || "";
const effKey = (name, slot) => (name || "").trim().toLowerCase() + "|" + normEffSlot(slot);

// live index — leeg tot er iets geladen is
let EFFECTS = { loaded: false, meta: null, upgrades: {}, upgradeByName: {}, squadrons: {}, counts: {} };

function buildEffectsIndex(data) {
  const up = {}, upByName = {}, sq = {};
  let nUp = 0, nSq = 0;
  (data.upgrades || []).forEach((u) => {
    const txt = (u.ability || "").trim();
    if (!u.name || !txt) return;
    up[effKey(u.name, u.upgrade_type)] = txt;
    upByName[(u.name || "").trim().toLowerCase()] = txt; // fallback (laatste wint)
    nUp++;
  });
  (data.squadrons || []).forEach((q) => {
    const txt = (q.ability_text || "").trim();
    if (!txt) return;
    [q.ace_name, q.name].forEach((n) => { if (n) sq[(n || "").trim().toLowerCase()] = txt; });
    nSq++;
  });
  return {
    loaded: true,
    meta: data.metadata || null,
    upgrades: up, upgradeByName: upByName, squadrons: sq,
    counts: { upgrades: nUp, squadrons: nSq,
              ships: (data.ships || []).length, objectives: (data.objectives || []).length,
              damage: (data.damage_deck || []).length },
  };
}

// leest ruwe JSON-tekst, valideert, bewaart in localStorage, vult EFFECTS
function importEffectsFromJSON(text) {
  let data;
  try { data = JSON.parse(text); }
  catch (e) { throw new Error("Geen geldige JSON — controleer of je het hele bestand hebt geplakt."); }
  if (!data || (!Array.isArray(data.upgrades) && !Array.isArray(data.squadrons)))
    throw new Error("Dit ziet er niet uit als de kaartendataset (verwacht een 'upgrades'- of 'squadrons'-lijst).");
  const idx = buildEffectsIndex(data);
  if (!idx.counts.upgrades && !idx.counts.squadrons)
    throw new Error("Geen effect-teksten gevonden in het bestand.");
  try { localStorage.setItem(EFFECTS_KEY, text); } catch (e) { throw new Error("Kon niet opslaan (bestand te groot voor deze browser?)."); }
  EFFECTS = idx;
  return idx.counts;
}

function clearEffects() {
  try { localStorage.removeItem(EFFECTS_KEY); } catch (e) {}
  EFFECTS = { loaded: false, meta: null, upgrades: {}, upgradeByName: {}, squadrons: {}, counts: {} };
}

function loadEffects() {
  try {
    const raw = localStorage.getItem(EFFECTS_KEY);
    if (raw) EFFECTS = buildEffectsIndex(JSON.parse(raw));
  } catch (e) {}
  return EFFECTS;
}

// gebakken fallback-index uit CATALOG_DATA (geldt als er geen browser-import is)
let BAKED = { upgrades: {}, upgradeByName: {}, squadrons: {} };
function buildBaked() {
  const up = {}, upByName = {}, sq = {};
  const data = (typeof window !== "undefined" && window.CATALOG_DATA) || {};
  (data.upgrades || []).forEach((u) => {
    if (!u.title || !u.ability) return;
    up[(u.title || "").trim().toLowerCase() + "|" + normEffSlot(u.slot)] = u.ability;
    upByName[(u.title || "").trim().toLowerCase()] = u.ability;
  });
  (data.squadrons || []).forEach((q) => {
    if (q.title && q.ability_text) sq[(q.title || "").trim().toLowerCase()] = q.ability_text;
  });
  BAKED = { upgrades: up, upgradeByName: upByName, squadrons: sq };
}

// opzoeken vanuit de UI
function upgradeEffect(name, slot) {
  if (EFFECTS.loaded) {
    const hit = EFFECTS.upgrades[effKey(name, slot)] || EFFECTS.upgradeByName[(name || "").trim().toLowerCase()];
    if (hit) return hit;
  }
  return BAKED.upgrades[effKey(name, slot)] || BAKED.upgradeByName[(name || "").trim().toLowerCase()] || null;
}
function squadronEffect(name) {
  if (!name) return null;
  const key = (name || "").trim().toLowerCase();
  if (EFFECTS.loaded && EFFECTS.squadrons[key]) return EFFECTS.squadrons[key];
  return BAKED.squadrons[key] || null;
}
function effectsLoaded() { return EFFECTS.loaded || Object.keys(BAKED.upgrades).length > 0; }
function effectsCounts() { return EFFECTS.counts || {}; }

buildBaked();
loadEffects();
Object.assign(window, { importEffectsFromJSON, clearEffects, upgradeEffect, squadronEffect, effectsLoaded, effectsCounts });
