/* ============================================================
   CARD CATALOG — dunne accessor-laag over window.CATALOG_DATA
   (gegenereerd door scripts/build-catalog.mjs, geladen via
   src/catalog-data.jsx). Levert list-data-views + helpers voor
   de fleet builder; schip/squadron-entries dragen echte stats.
   ============================================================ */

const CATALOG = {
  ships: (window.CATALOG_DATA ? window.CATALOG_DATA.ships : []),
  squadrons: (window.CATALOG_DATA ? window.CATALOG_DATA.squadrons : []),
  upgrades: (window.CATALOG_DATA ? window.CATALOG_DATA.upgrades : []),
};

const SLOT_LABEL = {
  commander: "Commander", officer: "Officer", "support-team": "Support Team",
  "fleet-command": "Fleet Command", "fleet-support": "Fleet Support",
  "weapons-team": "Weapons Team", "offensive-retrofit": "Offensive Retrofit",
  "defensive-retrofit": "Defensive Retrofit", "experimental-retrofit": "Experimental Retrofit",
  ordnance: "Ordnance", "ion-cannons": "Ion Cannons", turbolasers: "Turbolasers",
  "super-weapon": "Super Weapon", leader: "Leader", title: "Title",
};

const factionMatch = (cardFac, shipFac) =>
  cardFac === "neutral" || cardFac === shipFac ||
  (Array.isArray(cardFac) && cardFac.includes(shipFac));

function shipsForFaction(f) { return CATALOG.ships.filter((s) => s.faction === f); }
function squadronsForFaction(f) { return CATALOG.squadrons.filter((q) => factionMatch(q.faction, f)); }
function upgradesForSlot(slot, faction) { return CATALOG.upgrades.filter((u) => u.slot === slot && factionMatch(u.faction, faction)); }

function upgradeEligible(card, ship, fleetShips) {
  if (!factionMatch(card.faction, ship.faction)) return { ok: false, reason: "andere factie" };
  if (card.slot === "commander") {
    const cmdElsewhere = (fleetShips || []).some((s) => s.id !== ship.id && (s.upgrades || []).some((u) => u.slot === "commander"));
    if (cmdElsewhere) return { ok: false, reason: "al een commander in de vloot" };
  }
  if (card.unique) {
    const taken = (fleetShips || []).some((s) => (s.upgrades || []).some((u) => u.id === card.id && s.id !== ship.id));
    if (taken) return { ok: false, reason: "uniek — al gekozen" };
  }
  return { ok: true };
}

function statsForCatalogShip(entry) {
  const s = (entry && entry.stats) || {};
  return {
    maxHull: s.hull, hull: s.hull,
    maxShields: s.shields ? { ...s.shields } : undefined,
    shields: s.shields ? { ...s.shields } : undefined,
    command: s.command, engineering: s.engineering, squadronValue: s.squadron,
    speed: s.speed, attackDice: s.attackDice, defenseTokens: s.defenseTokens,
    antiSquadron: s.antiSquadron || null,
    statsMissing: false,
  };
}

function statsForCatalogSquadron(entry) {
  const s = (entry && entry.stats) || {};
  return {
    maxHull: s.hull, speed: s.speed,
    antiSquad: s.antiSquad, antiShip: s.antiShip,
    defenseTokens: s.defenseTokens, keywords: entry && entry.keywords,
  };
}

Object.assign(window, {
  CATALOG, SLOT_LABEL, shipsForFaction, squadronsForFaction, upgradesForSlot,
  upgradeEligible, factionMatch, statsForCatalogShip, statsForCatalogSquadron,
});
