// Shared course data — Single Source of Truth ist das Backend
// (/api/public/kursplan). Diese Datei initialisiert die globalen
// window.WB_*-Arrays leer, lädt synchron einen localStorage-Cache und
// startet im Hintergrund einen Refetch. Beim erfolgreichen Refetch
// dispatcht sie ein 'wb-courses-updated'-Event, auf das Seiten-Komponenten
// (z.B. all-courses.jsx) hören können, um sich neu zu rendern.

window.WB_CATEGORIES = [];
window.WB_COURSES = [];
window.WB_LEADERS = [];

// localStorage-Cache (stale-while-revalidate) — gleicher Key/Shape wie
// kursplan.jsx ihn verwendet, damit Cache geteilt werden kann.
// v4: Events-Fenster von 6 auf 12 Monate erweitert — alte Caches haben
// nur halb so viele Daten, also ungueltig.
// v6: desc = Kurzbeschreibung, longDesc = Langtext der Kursart.
const CD_CACHE_KEY = 'wb_kursplan_cache_v6';
const CD_CACHE_MAX_AGE_MS = 1000 * 60 * 60 * 24 * 30; // 30 Tage

const cdReadCache = () => {
  try {
    const raw = typeof localStorage !== 'undefined' ? localStorage.getItem(CD_CACHE_KEY) : null;
    if (!raw) return null;
    const p = JSON.parse(raw);
    if (!p || !p.ts || !p.data) return null;
    if (Date.now() - p.ts > CD_CACHE_MAX_AGE_MS) return null;
    return p.data;
  } catch { return null; }
};
const cdWriteCache = (data) => {
  try {
    if (typeof localStorage !== 'undefined') {
      localStorage.setItem(CD_CACHE_KEY, JSON.stringify({ data, ts: Date.now() }));
    }
  } catch { /* QuotaExceeded — ignorieren */ }
};

const cdApplyData = (data) => {
  if (!data || !Array.isArray(data.categories) || !Array.isArray(data.courses)) return false;
  window.WB_CATEGORIES.length = 0; window.WB_CATEGORIES.push(...data.categories);
  window.WB_COURSES.length = 0;    window.WB_COURSES.push(...data.courses);
  window.WB_LEADERS.length = 0;    window.WB_LEADERS.push(...(data.leaders ?? []));
  // Events (mit Date-Reparse) — kursplan.jsx erwartet diese Struktur.
  if (Array.isArray(data.events)) {
    window.WB_KURSPLAN_EVENTS = data.events.map((e) => ({
      ...e,
      date: typeof e.date === 'string' ? new Date(e.date + 'T00:00:00') : new Date(e.date),
    }));
  }
  return true;
};

// Synchroner Cache-Apply VOR React-Mount — erster Render zeigt sofort den
// zuletzt bekannten Stand, statt einer leeren Seite.
(() => { const c = cdReadCache(); if (c) cdApplyData(c); })();

// Async-Refetch, dann Cache aktualisieren + Event dispatchen.
fetch('https://project-zd7wa.vercel.app/api/public/kursplan')
  .then((r) => r.ok ? r.json() : null)
  .then((data) => {
    if (!cdApplyData(data)) return;
    cdWriteCache(data);
    window.dispatchEvent(new CustomEvent('wb-courses-updated'));
  })
  .catch(() => { /* Cache bleibt, kein Hardcoded-Fallback */ });
