/* ui.jsx — zdieľané prvky: ikony, ŠPZ tabuľka, hlavička s menu profilu, vzhľad (téma).
   Vystavuje window.Icon, window.Spz, window.Hlavicka, window.normalizujSpz, window.bezpecneUloz/Nacitaj.
*/
(function () {
  "use strict";

  const { useState, useEffect, useRef } = React;

  // Čiarové ikony 24×24 (rovnaký štýl ako v návrhu z Claude Design).
  const IKONY = {
    auto: <><path d="M3 16v-3l2.2-5.2A2 2 0 0 1 7 6.5h10a2 2 0 0 1 1.8 1.3L21 13v3a1 1 0 0 1-1 1h-1M5 17H4a1 1 0 0 1-1-1M9 17h6" /><circle cx="7" cy="17" r="2" /><circle cx="17" cy="17" r="2" /></>,
    zavriet: <path d="M6 6l12 12M18 6L6 18" />,
    fajka: <path d="M5 12l5 5 9-10" />,
    hladat: <><circle cx="11" cy="11" r="7" /><path d="M20 20l-4-4" /></>,
    telefon: <path d="M5 4h4l2 5-2.5 1.5a11 11 0 0 0 5 5L15 13l5 2v4a1 1 0 0 1-1 1A16 16 0 0 1 4 5a1 1 0 0 1 1-1z" />,
    stit: <path d="M12 3l8 3v6c0 5-3.5 8-8 9-4.5-1-8-4-8-9V6z" />,
    spat: <path d="M15 5l-7 7 7 7" />,
    dalej: <path d="M9 5l7 7-7 7" />,
    fotak: <><path d="M4 8h3l2-3h6l2 3h3v11H4z" /><circle cx="12" cy="13" r="3.5" /></>,
    hodiny: <><circle cx="12" cy="12" r="9" /><path d="M12 7v5l3 2" /></>,
    info: <><circle cx="12" cy="12" r="9" /><path d="M12 11v5M12 7.5v.5" /></>,
    vykricnik: <><circle cx="12" cy="12" r="9" /><path d="M12 7v6M12 16.5v.5" /></>,
    odhlasit: <path d="M15 4h3a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-3M10 16l-4-4 4-4M6 12h10" />,
    znova: <path d="M20 11a8 8 0 1 0-2.3 5.7M20 5v6h-6" />,
  };

  function Icon({ name, size = 20, style }) {
    return (
      <svg className="ik" viewBox="0 0 24 24" aria-hidden="true" style={{ width: size, height: size, ...style }}>
        {IKONY[name]}
      </svg>
    );
  }

  // ŠPZ ako tabuľka (modrý pás s SK). Text ŠPZ je pre čítačky čitateľný, pás je dekorácia.
  function Spz({ spz, velka, zvyraznit }) {
    let obsah = spz;
    if (zvyraznit) {
      const i = spz.indexOf(zvyraznit);
      if (i >= 0) obsah = <>{spz.slice(0, i)}<mark>{spz.slice(i, i + zvyraznit.length)}</mark>{spz.slice(i + zvyraznit.length)}</>;
    }
    return (
      <span className={"spz" + (velka ? " spz-velka" : "")}>
        <span className="spz-pas" aria-hidden="true">SK</span>
        <span className="spz-text">{obsah}</span>
      </span>
    );
  }

  // „bt 123-ab“ → „BT123AB“. Rovnaká funkcia je v backende (functions/api/_lib/vozidla.js).
  const normalizujSpz = (t) => String(t || "").toUpperCase().replace(/[^A-Z0-9]/g, "");

  // localStorage môže byť v súkromnom okne nedostupný: appka musí fungovať aj bez neho.
  function bezpecneNacitaj(kluc, predvolene) {
    try { const v = localStorage.getItem(kluc); return v === null ? predvolene : JSON.parse(v); } catch (_) { return predvolene; }
  }
  function bezpecneUloz(kluc, hodnota) {
    try { if (hodnota === null) localStorage.removeItem(kluc); else localStorage.setItem(kluc, JSON.stringify(hodnota)); } catch (_) {}
  }

  // Vzhľad: "system" | "svetly" | "tmavy". Skript v <head> index.html ho nastaví ešte pred vykreslením.
  function nastavTemu(tema) {
    bezpecneUloz("fa_tema", tema);
    if (tema === "svetly") document.documentElement.setAttribute("data-theme", "light");
    else if (tema === "tmavy") document.documentElement.setAttribute("data-theme", "dark");
    else document.documentElement.removeAttribute("data-theme");
  }

  const inicialy = (meno) => String(meno || "?").split(/\s+/).filter(Boolean).slice(0, 2).map((s) => s[0]).join("").toUpperCase();

  const NAZVY_ROL = { it: "IT", spravca: "Správca vozového parku", veduci: "Vedúci", zamestnanec: "Zamestnanec" };

  function ProfilMenu({ ja, onZavriet, onOdhlasit }) {
    const [tema, setTema] = useState(() => bezpecneNacitaj("fa_tema", "system"));
    const panel = useRef(null);
    useEffect(() => {
      const esc = (e) => { if (e.key === "Escape") onZavriet(); };
      document.addEventListener("keydown", esc);
      if (panel.current) panel.current.focus();
      return () => document.removeEventListener("keydown", esc);
    }, []);
    const zmen = (t) => { setTema(t); nastavTemu(t); };
    return (
      <div className="prekryv" onClick={onZavriet}>
        <div className="profil-panel" role="dialog" aria-modal="true" aria-labelledby="profil-meno" tabIndex={-1} ref={panel} onClick={(e) => e.stopPropagation()}>
          <div className="profil-hlava">
            <span className="avatar avatar-velky" aria-hidden="true">{inicialy(ja.meno)}</span>
            <div className="stlpec">
              <strong id="profil-meno">{ja.meno}</strong>
              <span className="tlmene">{ja.email}</span>
              <span className="tlmene">{NAZVY_ROL[ja.rola] || ""}</span>
            </div>
          </div>
          <fieldset className="tema">
            <legend>Vzhľad</legend>
            {[["system", "Systém"], ["svetly", "Svetlý"], ["tmavy", "Tmavý"]].map(([k, n]) => (
              <label key={k} className={"tema-volba" + (tema === k ? " vybrana" : "")}>
                <input type="radio" name="tema" value={k} checked={tema === k} onChange={() => zmen(k)} />
                {n}
              </label>
            ))}
          </fieldset>
          <button type="button" className="btn btn-obrys btn-plna" onClick={onOdhlasit}>
            <Icon name="odhlasit" />Odhlásiť sa
          </button>
          <button type="button" className="btn btn-text btn-plna" onClick={onZavriet}>Zavrieť</button>
        </div>
      </div>
    );
  }

  function Hlavicka({ ja, onOdhlasit }) {
    const [menu, setMenu] = useState(false);
    return (
      <header className="hlavicka">
        <div className="hlavicka-znacka">
          <span className="logo-ikona" aria-hidden="true"><Icon name="auto" /></span>
          <span className="hlavicka-nazov">Firemné autá</span>
        </div>
        <button type="button" className="avatar" aria-label="Profil, vzhľad a odhlásenie" aria-haspopup="dialog" onClick={() => setMenu(true)}>
          {inicialy(ja.meno)}
        </button>
        {menu && <ProfilMenu ja={ja} onZavriet={() => setMenu(false)} onOdhlasit={onOdhlasit} />}
      </header>
    );
  }

  Object.assign(window, { Icon, Spz, Hlavicka, normalizujSpz, bezpecneNacitaj, bezpecneUloz });
})();
