// Statische Texte vom Backend laden + Helper bereitstellen.
//
// Texte werden im Admin unter „Homepage Texte" gepflegt und über die
// öffentliche API geliefert. Hardcoded-Defaults im Code bleiben als
// Fallback — wenn der Server nicht antwortet oder ein Key fehlt, fällt
// der Frontend einfach darauf zurück.
//
// Inline-Hervorhebung via eckige Klammern: „Frauen, die [halten]." rendert
// den Klammer-Teil als bacalisties-Italic in heather-plum.
//
// Verwendung:
//   <h2>{wbText('hero.headline', 'Frauen, die Frauen [halten].')}</h2>

window.WB_TEXTS = window.WB_TEXTS || {};

const ST_CACHE_KEY = 'wb_static_texts_v1';
const ST_CACHE_MAX_AGE_MS = 1000 * 60 * 60 * 24 * 7;

const stReadCache = () => {
  try {
    const raw = typeof localStorage !== 'undefined' ? localStorage.getItem(ST_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 > ST_CACHE_MAX_AGE_MS) return null;
    return p.data;
  } catch { return null; }
};
const stWriteCache = (data) => {
  try {
    if (typeof localStorage !== 'undefined') {
      localStorage.setItem(ST_CACHE_KEY, JSON.stringify({ data, ts: Date.now() }));
    }
  } catch {}
};

// Synchron-Apply VOR React-Mount aus Cache, damit der erste Render nicht
// erst die Default-Fallbacks zeigt.
(() => {
  const cached = stReadCache();
  if (cached && typeof cached === 'object') {
    Object.assign(window.WB_TEXTS, cached);
  }
})();

// Async-Refresh
fetch('https://project-zd7wa.vercel.app/api/public/texts')
  .then((r) => r.ok ? r.json() : null)
  .then((data) => {
    if (!data || !data.texts) return;
    Object.assign(window.WB_TEXTS, data.texts);
    stWriteCache(data.texts);
    window.dispatchEvent(new CustomEvent('wb-texts-updated'));
  })
  .catch(() => {});

// Public helpers — als globale Funktionen ans window gehängt, damit die
// JSX-Dateien sie ohne Import nutzen können (kompatibel zu Babel-Standalone).

// Liefert den aktuellen Text-Wert für `key`. Fällt auf `fallback` zurück,
// wenn Key noch nicht gepflegt oder Backend-Fetch noch nicht durch ist.
window.wbText = (key, fallback) => {
  const v = window.WB_TEXTS[key];
  return (v != null && v !== '') ? v : (fallback ?? '');
};

// Rendert einen Text mit [Klammer]-Hervorhebung als React-Element-Array.
// Zusätzlich werden Zeilenumbrüche (\n im Textarea-Input) als <br>
// gerendert — Admins drücken einfach Enter im Editor.
//
// Optionaler 2. Parameter: CSS-Farbe fuer die Hervorhebung. Default ist
// heather-plum (Markenakzent der Hauptseite). Auf der Bauchschmiede-
// Subseite z.B. uebergeben wir 'var(--terracotta)' damit die Italics
// zur dortigen Sektion-Farbe passen.
window.wbRenderText = (text, emphasisColor) => {
  if (!text) return null;
  const color = emphasisColor || 'var(--heather-plum)';
  const lines = String(text).split('\n');
  const result = [];
  let key = 0;
  for (let li = 0; li < lines.length; li++) {
    if (li > 0) result.push(React.createElement('br', { key: `br-${key++}` }));
    const line = lines[li];
    const open = (line.match(/\[/g) || []).length;
    const close = (line.match(/\]/g) || []).length;
    if (open === 0 || open !== close) {
      if (line) result.push(line);
      continue;
    }
    let i = 0;
    while (i < line.length) {
      const start = line.indexOf('[', i);
      if (start === -1) { result.push(line.slice(i)); break; }
      const end = line.indexOf(']', start + 1);
      if (end === -1) { result.push(line.slice(i)); break; }
      if (start > i) result.push(line.slice(i, start));
      result.push(
        React.createElement(
          'em',
          { key: `em-${key++}`, className: 'bacalisties', style: { color } },
          line.slice(start + 1, end),
        ),
      );
      i = end + 1;
    }
  }
  return result;
};

// Kombiniert: holt den Wert für key, rendert ihn mit Inline-Emphasis.
//   {wbT('hero.headline', 'Default mit [Emphasis].')}
// 3. Parameter: optionale Emphasis-Farbe (siehe wbRenderText).
window.wbT = (key, fallback, emphasisColor) =>
  window.wbRenderText(window.wbText(key, fallback), emphasisColor);
