// src/tema.jsx — tema de la app (#1456). Oscuro por omisión; «claro» es de alto contraste.
// Guarda en localStorage (piixi.tema, piixi.maqueta.gris, piixi.maqueta.boton) y pone los
// atributos data-* en <html>; tokens-claro.css hace el resto. Todo acceso en try/catch.
(function () {
  const K = { tema: 'piixi.tema', gris: 'piixi.maqueta.gris', boton: 'piixi.maqueta.boton' };
  const leer = (k) => { try { return localStorage.getItem(k); } catch (e) { return null; } };
  const escribir = (k, v) => { try { localStorage.setItem(k, v); } catch (e) { /* sin almacenamiento: vale en esta sesión */ } };
  const oyentes = new Set();
  let estado = {
    tema: leer(K.tema) === 'claro' ? 'claro' : 'oscuro',
    gris: leer(K.gris) === 'medio' ? 'medio' : 'claro',
    boton: leer(K.boton) === 'piixi' ? 'piixi' : 'oscuro',
  };
  const aplicar = () => {
    const h = document.documentElement;
    if (estado.tema === 'claro') h.dataset.theme = 'claro'; else delete h.dataset.theme;
    if (estado.gris === 'medio') h.dataset.gris = 'medio'; else delete h.dataset.gris;
    if (estado.boton === 'piixi') h.dataset.boton = 'piixi'; else delete h.dataset.boton;
  };
  aplicar();
  const PiixiTema = {
    get: () => estado,
    set(parcial) {
      estado = { ...estado, ...parcial };
      Object.keys(K).forEach((c) => { if (parcial[c] !== undefined) escribir(K[c], estado[c]); });
      aplicar();
      oyentes.forEach((f) => { try { f(estado); } catch (e) { /* un oyente roto no frena a los demás */ } });
    },
    subscribe(f) { oyentes.add(f); return () => oyentes.delete(f); },
  };
  window.PiixiTema = PiixiTema;
  // Hook: re-renderiza al cambiar el tema.
  window.usePiixiTema = function usePiixiTema() {
    const [e, setE] = React.useState(PiixiTema.get());
    React.useEffect(() => PiixiTema.subscribe(setE), []);
    return e;
  };
})();
