const { useState: uS, useEffect: uE } = React;

// ---------- A11y Panel ----------
function A11yPanel({ t }) {
  const [open, setOpen] = uS(false);
  const [textSize, setTextSize] = uS(0); // 0..3
  const [lineH, setLineH] = uS(0);
  const [align, setAlign] = uS(0);
  const [font, setFont] = uS(false);
  const [contrast, setContrast] = uS(0);
  const [gray, setGray] = uS(false);
  const [hideImgs, setHideImgs] = uS(false);
  const [stopMotion, setStopMotion] = uS(false);
  const [links, setLinks] = uS(false);
  const [outline, setOutline] = uS(false);

  uE(() => {
    const body = document.body;
    const html = document.documentElement;
    const sizes = [1, 1.15, 1.3, 1.5];
    const lines = [1.55, 1.7, 1.9, 2.1];
    const aligns = ["initial", "justify", "center", "right"];
    body.style.setProperty("--a11y-font-scale", sizes[textSize]);
    body.style.setProperty("--a11y-line", lines[lineH]);
    // Mobile: zoom on <html> destabilises position:fixed (modal/header) on iOS Safari.
    // Use font-size scale on root + a body class so CSS can opt-in. Desktop uses zoom for visual fidelity.
    const isMobile = window.matchMedia("(max-width: 900px)").matches;
    if (isMobile) {
      html.style.zoom = "";
      html.style.fontSize = sizes[textSize] === 1 ? "" : (sizes[textSize] * 100) + "%";
    } else {
      html.style.fontSize = "";
      html.style.zoom = sizes[textSize];
    }
    body.classList.toggle("a11y-readable", font);
    body.classList.toggle("a11y-contrast", contrast > 0);
    body.classList.toggle("a11y-grayscale", gray);
    body.classList.toggle("a11y-hide-images", hideImgs);
    body.classList.toggle("a11y-stop-motion", stopMotion);
    body.classList.toggle("a11y-links", links);

    // text-align override
    const sheetId = "a11y-align-sheet";
    let s = document.getElementById(sheetId);
    if (!s) { s = document.createElement("style"); s.id = sheetId; document.head.appendChild(s); }
    if (align === 0) s.textContent = "";
    else s.textContent = `.intro-text, .about-text, .bistro-text, .faq-a, .body, p.body { text-align: ${aligns[align]} !important; }`;
  }, [textSize, lineH, align, font, contrast, gray, hideImgs, stopMotion, links]);

  const reset = () => {
    setTextSize(0); setLineH(0); setAlign(0); setFont(false);
    setContrast(0); setGray(false); setHideImgs(false);
    setStopMotion(false); setLinks(false); setOutline(false);
  };

  const LevelPips = ({ value, max = 3 }) => (
    <div className="toggle">
      {Array.from({ length: max }).map((_, i) => (
        <span key={i} className={`pip ${i < value ? "on" : ""}`}/>
      ))}
    </div>
  );
  const BoolPip = ({ on }) => (
    <div className="toggle"><span className={`pip ${on ? "on" : ""}`} style={{ width: 28 }}/></div>
  );

  return (
    <>
      <button
        className="a11y-trigger unstyled"
        onClick={() => setOpen(!open)}
        aria-label={t.a11y.trigger}
        title={t.a11y.trigger}
        aria-expanded={open}
        aria-controls="a11y-panel">
        <Icon.a11y/>
      </button>
      {open && (
        <div id="a11y-panel" className="a11y-panel" role="region" aria-label={t.a11y.title}>
          <div className="a11y-head">
            <div className="t">
              <span className="avatar"><Icon.a11y width="18" height="18"/></span>
              <span>{t.a11y.title}</span>
            </div>
            <button className="unstyled" onClick={() => setOpen(false)} style={{ color: "inherit" }} aria-label={t.a11y.close}>
              <Icon.close width="16" height="16"/>
            </button>
          </div>
          <div className="a11y-body">
            <div className="a11y-section">
              <h5>{t.a11y.sections.text}</h5>
              <button className={`a11y-opt unstyled ${textSize>0?"active":""}`} onClick={() => setTextSize((textSize+1)%4)}>
                <span className="ic"><Icon.textSize width="18" height="18"/></span>
                <span className="lb">{t.a11y.text.size}</span>
                <LevelPips value={textSize}/>
              </button>
              <button className={`a11y-opt unstyled ${lineH>0?"active":""}`} onClick={() => setLineH((lineH+1)%4)}>
                <span className="ic"><Icon.lineH width="18" height="18"/></span>
                <span className="lb">{t.a11y.text.line}</span>
                <LevelPips value={lineH}/>
              </button>
              <button className={`a11y-opt unstyled ${align>0?"active":""}`} onClick={() => setAlign((align+1)%4)}>
                <span className="ic"><Icon.align width="18" height="18"/></span>
                <span className="lb">{t.a11y.text.align}</span>
                <LevelPips value={align}/>
              </button>
              <button className={`a11y-opt unstyled ${font?"active":""}`} onClick={() => setFont(!font)}>
                <span className="ic"><Icon.font width="18" height="18"/></span>
                <span className="lb">{t.a11y.text.font}</span>
                <BoolPip on={font}/>
              </button>
            </div>
            <div className="a11y-section">
              <h5>{t.a11y.sections.visual}</h5>
              <button className={`a11y-opt unstyled ${contrast>0?"active":""}`} onClick={() => setContrast((contrast+1)%2)}>
                <span className="ic"><Icon.contrast width="18" height="18"/></span>
                <span className="lb">{t.a11y.visual.contrast}</span>
                <BoolPip on={contrast>0}/>
              </button>
              <button className={`a11y-opt unstyled ${gray?"active":""}`} onClick={() => setGray(!gray)}>
                <span className="ic"><Icon.gray width="18" height="18"/></span>
                <span className="lb">{t.a11y.visual.grayscale}</span>
                <BoolPip on={gray}/>
              </button>
              <button className={`a11y-opt unstyled ${hideImgs?"active":""}`} onClick={() => setHideImgs(!hideImgs)}>
                <span className="ic"><Icon.image width="18" height="18"/></span>
                <span className="lb">{t.a11y.visual.images}</span>
                <BoolPip on={hideImgs}/>
              </button>
              <button className={`a11y-opt unstyled ${stopMotion?"active":""}`} onClick={() => setStopMotion(!stopMotion)}>
                <span className="ic"><Icon.motion width="18" height="18"/></span>
                <span className="lb">{t.a11y.visual.motion}</span>
                <BoolPip on={stopMotion}/>
              </button>
            </div>
            <div className="a11y-section">
              <h5>{t.a11y.sections.orient}</h5>
              <button className={`a11y-opt unstyled ${links?"active":""}`} onClick={() => setLinks(!links)}>
                <span className="ic"><Icon.link width="18" height="18"/></span>
                <span className="lb">{t.a11y.orient.links}</span>
                <BoolPip on={links}/>
              </button>
              <button className={`a11y-opt unstyled ${outline?"active":""}`} onClick={() => setOutline(!outline)}>
                <span className="ic"><Icon.outline width="18" height="18"/></span>
                <span className="lb">{t.a11y.orient.outline}</span>
                <BoolPip on={outline}/>
              </button>
            </div>
          </div>
          <div className="a11y-foot">
            <button className="unstyled" onClick={() => setOpen(false)}><Icon.eye width="14" height="14"/> {t.a11y.hide}</button>
            <button className="unstyled" onClick={reset}><Icon.reset width="14" height="14"/> {t.a11y.reset}</button>
          </div>
        </div>
      )}
      {outline && <OutlineOverlay onClose={() => setOutline(false)}/>}
    </>
  );
}

function OutlineOverlay({ onClose }) {
  const sections = [
    { id: "top", label: "01 · Start" },
    { id: "intro", label: "02 · Willkommen" },
    { id: "places", label: "03 · Platz & Unterkünfte" },
    { id: "activities", label: "04 · Aktivitäten" },
    { id: "bistro", label: "05 · Seebistro" },
    { id: "about", label: "06 · Über uns" },
    { id: "faq", label: "07 · FAQ" },
  ];
  return (
    <div style={{
      position: "fixed", inset: 0, zIndex: 95,
      background: "rgba(20, 24, 18, 0.9)", backdropFilter: "blur(14px)",
      display: "flex", alignItems: "center", justifyContent: "center",
      padding: 40,
    }} onClick={onClose}>
      <div style={{ color: "var(--paper)", maxWidth: 720, width: "100%" }}>
        <div style={{ fontFamily: "var(--mono)", fontSize: 11, letterSpacing: "0.18em", textTransform: "uppercase", opacity: 0.6, marginBottom: 20 }}>Seitenstruktur</div>
        {sections.map(s => (
          <a href={`#${s.id}`} key={s.id} onClick={onClose} className="unstyled" style={{
            display: "block", padding: "18px 0",
            borderTop: "1px solid rgba(255,255,255,0.18)",
            fontFamily: "var(--serif)", fontSize: 32, fontWeight: 350, letterSpacing: "-0.01em",
            color: "var(--paper)",
          }}>{s.label}</a>
        ))}
      </div>
    </div>
  );
}

// ---------- Tweaks ----------
function TweaksPanel({ variant, setVariant, accent, setAccent, active }) {
  if (!active) return null;
  return (
    <div className="tweaks-panel">
      <h5>Tweaks</h5>
      <div className="tweak-row">
        <label>Variante</label>
        <div className="tweak-opts">
          <button className={variant==="a"?"on":""} onClick={() => setVariant("a")}>A · Editorial</button>
          <button className={variant==="b"?"on":""} onClick={() => setVariant("b")}>B · Waldgrün</button>
        </div>
      </div>
      <div className="tweak-row">
        <label>Akzent­farbe</label>
        <div className="tweak-opts">
          <button className={accent==="moss"?"on":""} onClick={() => setAccent("moss")}>Moos</button>
          <button className={accent==="teal"?"on":""} onClick={() => setAccent("teal")}>See</button>
          <button className={accent==="ocker"?"on":""} onClick={() => setAccent("ocker")}>Ocker</button>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, { A11yPanel, TweaksPanel });
