/* App — KLANT REVIEW MODE
   Tabs voor variant + page · linear scroll · per-page textarea + per-element pins + section-labels
*/

const VARIANTS = [
  { id: 'v1', label: 'V1 · Simpel / clean', color: '#394A58' },
  { id: 'v2', label: 'V2 · Modern vernieuwend', color: '#FF6900' },
  { id: 'v3', label: 'V3 · Creatief + motion', color: '#0a141c' },
];
const PAGES = [
  { id: 'home', label: 'Homepage', subtitle: '/' },
  { id: 'about', label: 'Over ons', subtitle: '/over-ons/' },
  { id: 'pd', label: 'Xinno Private Desktop', subtitle: '/de-online-werkplek/xinno-private-desktop/' },
];
const COMPONENT_MAP = {
  v1: { home: () => <V1Home/>, about: () => <V1About/>, pd: () => <V1PrivateDesktop/> },
  v2: { home: () => <V2Home/>, about: () => <V2About/>, pd: () => <V2PrivateDesktop/> },
  v3: { home: () => <V3Home/>, about: () => <V3About/>, pd: () => <V3PrivateDesktop/> },
};

/* ─────────── INTRO VIDEO (Wistia) ─────────── */
const INTRO_VIDEO_ID = '07ceyx37r2';
const INTRO_ASPECT = 2.1006564551422318;
const INTRO_SEEN_KEY = 'xinno-intro-seen';

function IntroVideoModal({ open, onClose }) {
  React.useEffect(() => {
    if (!open) return;
    const onKey = (e) => { if (e.key === 'Escape') onClose(); };
    document.addEventListener('keydown', onKey);
    const prevOverflow = document.body.style.overflow;
    document.body.style.overflow = 'hidden';
    return () => { document.removeEventListener('keydown', onKey); document.body.style.overflow = prevOverflow; };
  }, [open]);

  if (!open) return null;
  return (
    <div
      onClick={onClose}
      data-pin-ui
      style={{ position: 'fixed', inset: 0, background: 'rgba(20,28,38,0.65)', backdropFilter: 'blur(8px)', zIndex: 9998, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 32, cursor: 'zoom-out' }}
    >
      <div
        onClick={e => e.stopPropagation()}
        style={{ width: '100%', maxWidth: 1240, position: 'relative', cursor: 'default', aspectRatio: String(INTRO_ASPECT), borderRadius: 16, overflow: 'hidden', boxShadow: '0 30px 80px rgba(0,0,0,0.5)', background: '#000' }}
        dangerouslySetInnerHTML={{ __html: `<wistia-player media-id="${INTRO_VIDEO_ID}" seo="false" aspect="${INTRO_ASPECT}" style="width:100%;height:100%;display:block;"></wistia-player>` }}
      />
      <button
        onClick={onClose}
        aria-label="Sluit intro"
        style={{ position: 'fixed', top: 24, right: 24, width: 44, height: 44, borderRadius: '50%', background: 'rgba(255,255,255,0.1)', border: '1px solid rgba(255,255,255,0.25)', color: '#fff', fontSize: 22, cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center' }}
      >×</button>
    </div>
  );
}

/* ─────────── helpers ─────────── */
function describeEl(el) {
  const section = el.closest('section,nav,header,footer');
  const sectionTag = section?.tagName?.toLowerCase() || 'main';
  const sectionLabel = section?.getAttribute('data-section-label') || section?.id || sectionTag;
  const tag = el.tagName.toLowerCase();
  const text = (el.innerText || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 80);
  return { section: sectionLabel, tag, text };
}

function loadPins(variant, page) {
  try { return JSON.parse(localStorage.getItem(`pins-${variant}-${page}`) || '[]'); }
  catch { return []; }
}

/* ─────────── PIN OVERLAY (click-to-pin per element) ─────────── */
function PinOverlay({ variant, page, active }) {
  const [pins, setPins] = React.useState([]);
  const [activeId, setActiveId] = React.useState(null);
  const key = `pins-${variant}-${page}`;

  React.useEffect(() => {
    setPins(loadPins(variant, page));
    setActiveId(null);
  }, [key]);

  React.useEffect(() => {
    if (!active) return;
    document.body.style.cursor = 'crosshair';
    const handler = (e) => {
      if (e.target.closest('[data-pin-ui]')) return;
      if (!e.target.closest('main')) return;
      e.preventDefault();
      e.stopPropagation();
      const info = describeEl(e.target);
      const newPin = { id: Date.now() + Math.random(), x: e.pageX, y: e.pageY, ...info, comment: '', ts: new Date().toISOString() };
      setPins(prev => {
        const next = [...prev, newPin];
        localStorage.setItem(key, JSON.stringify(next));
        return next;
      });
      setActiveId(newPin.id);
    };
    window.addEventListener('click', handler, true);
    return () => { window.removeEventListener('click', handler, true); document.body.style.cursor = ''; };
  }, [active, key]);

  const update = (id, patch) => setPins(prev => {
    const next = prev.map(p => p.id === id ? { ...p, ...patch } : p);
    localStorage.setItem(key, JSON.stringify(next));
    return next;
  });
  const remove = (id) => {
    setPins(prev => {
      const next = prev.filter(p => p.id !== id);
      localStorage.setItem(key, JSON.stringify(next));
      return next;
    });
    setActiveId(null);
  };

  return (
    <div data-pin-ui style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', pointerEvents: 'none', zIndex: 80 }}>
      {pins.map((p, i) => (
        <div key={p.id} style={{ position: 'absolute', top: p.y, left: p.x, transform: 'translate(-50%, -50%)', pointerEvents: 'auto' }}>
          {activeId === p.id ? (
            <div style={{ background: '#fff', border: '1px solid #FF6900', borderRadius: 8, boxShadow: '0 8px 24px rgba(0,0,0,0.18)', padding: 12, width: 300, transform: 'translate(20px, -50%)' }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8, fontFamily: "'JetBrains Mono', monospace", fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: '#7B8896' }}>
                <span>PIN #{i + 1} · {p.section} · &lt;{p.tag}&gt;</span>
                <button onClick={() => remove(p.id)} title="Verwijder" style={{ background: 'transparent', border: 0, color: '#FF6900', cursor: 'pointer', fontSize: 16, lineHeight: 1, padding: 0 }}>×</button>
              </div>
              {p.text && (
                <div style={{ fontSize: 11, color: '#394A58', marginBottom: 10, padding: '6px 8px', background: '#fafaf7', borderRadius: 4, fontStyle: 'italic', maxHeight: 60, overflow: 'hidden' }}>
                  "{p.text}"
                </div>
              )}
              <textarea
                autoFocus
                value={p.comment}
                onChange={e => update(p.id, { comment: e.target.value })}
                placeholder="Wat moet anders met dit element?"
                style={{ width: '100%', boxSizing: 'border-box', minHeight: 70, padding: 8, border: '1px solid #DEE1E7', borderRadius: 4, fontFamily: 'Inter', fontSize: 13, resize: 'vertical', outline: 'none' }}
              />
              <div style={{ marginTop: 8, textAlign: 'right' }}>
                <button onClick={() => setActiveId(null)} style={{ background: '#394A58', color: '#fff', border: 0, borderRadius: 4, padding: '6px 14px', fontSize: 12, cursor: 'pointer', fontFamily: 'Inter', fontWeight: 600 }}>Klaar</button>
              </div>
            </div>
          ) : (
            <button
              onClick={() => setActiveId(p.id)}
              title={p.comment || 'Klik om te bewerken'}
              style={{ width: 30, height: 30, borderRadius: '50%', background: p.comment ? '#FF6900' : '#fff', color: p.comment ? '#fff' : '#FF6900', border: '2px solid #FF6900', boxShadow: '0 2px 8px rgba(255,105,0,0.45)', cursor: 'pointer', fontWeight: 700, fontSize: 13, fontFamily: 'Inter', display: 'flex', alignItems: 'center', justifyContent: 'center' }}
            >{i + 1}</button>
          )}
        </div>
      ))}
    </div>
  );
}

/* ─────────── LABEL OVERLAY (L01, L02... per section) ─────────── */
function LabelOverlay({ variant, page, on }) {
  const [labels, setLabels] = React.useState([]);

  React.useEffect(() => {
    if (!on) { setLabels([]); return; }
    const compute = () => {
      const main = document.querySelector('main');
      if (!main) return;
      const sections = main.querySelectorAll('section, nav, header, footer');
      const items = Array.from(sections).map((el, i) => {
        const rect = el.getBoundingClientRect();
        return { id: i, code: `L${String(i + 1).padStart(2, '0')}`, top: rect.top + window.scrollY, left: rect.left + window.scrollX };
      });
      setLabels(items);
    };
    const t1 = setTimeout(compute, 60);
    const t2 = setTimeout(compute, 400);
    window.addEventListener('resize', compute);
    const ro = new ResizeObserver(compute);
    const main = document.querySelector('main');
    if (main) ro.observe(main);
    return () => { clearTimeout(t1); clearTimeout(t2); window.removeEventListener('resize', compute); ro.disconnect(); };
  }, [on, variant, page]);

  if (!on) return null;
  return (
    <div data-pin-ui style={{ position: 'absolute', top: 0, left: 0, width: '100%', pointerEvents: 'none', zIndex: 70 }}>
      {labels.map(l => (
        <div key={l.id} style={{ position: 'absolute', top: l.top + 8, left: l.left + 8, background: '#0a141c', color: '#FF6900', padding: '5px 10px', fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: '0.14em', borderRadius: 4, fontWeight: 700, boxShadow: '0 4px 12px rgba(0,0,0,0.25)' }}>
          {l.code}
        </div>
      ))}
    </div>
  );
}

/* ─────────── PAGE-LEVEL FEEDBACK PANEL (textarea + export) ─────────── */
function FeedbackPanel({ variant, page }) {
  const [open, setOpen] = React.useState(false);
  const [text, setText] = React.useState('');
  const key = `feedback-${variant}-${page}`;

  React.useEffect(() => { setText(localStorage.getItem(key) || ''); }, [key]);

  const save = (val) => { setText(val); localStorage.setItem(key, val); };

  const exportAll = () => {
    const stamp = new Date().toLocaleString('nl-NL');
    let out = `XINNO FEEDBACK · ${stamp}\n\n`;
    let any = false;
    for (const v of VARIANTS) {
      for (const p of PAGES) {
        const txt = localStorage.getItem(`feedback-${v.id}-${p.id}`) || '';
        const pins = loadPins(v.id, p.id);
        if (!txt.trim() && pins.length === 0) continue;
        any = true;
        out += `═══ ${v.label} — ${p.label} ═══\n`;
        if (txt.trim()) out += `\n[Pagina-feedback]\n${txt.trim()}\n`;
        if (pins.length) {
          out += `\n[Pin-feedback · ${pins.length} pin${pins.length > 1 ? 's' : ''}]\n`;
          pins.forEach((pin, i) => {
            out += `  #${i + 1} · ${pin.section} · <${pin.tag}>`;
            if (pin.text) out += ` · "${pin.text}"`;
            out += `\n      → ${pin.comment.trim() || '(geen comment)'}\n`;
          });
        }
        out += `\n`;
      }
    }
    if (!any) { alert('Geen feedback ingevuld nog'); return; }
    const blob = new Blob([out], { type: 'text/plain' });
    const a = document.createElement('a');
    a.href = URL.createObjectURL(blob);
    a.download = `xinno-feedback-${Date.now()}.txt`;
    a.click();
  };

  if (!open) {
    return (
      <button onClick={() => setOpen(true)} data-pin-ui style={{ position: 'fixed', right: 24, bottom: 24, zIndex: 999, background: '#FF6900', color: '#fff', border: 0, borderRadius: 999, padding: '14px 22px', fontFamily: 'Inter, sans-serif', fontWeight: 600, fontSize: 14, boxShadow: '0 6px 24px rgba(255,105,0,0.45)', cursor: 'pointer' }}>
        💬 Feedback op deze pagina
      </button>
    );
  }

  return (
    <div data-pin-ui style={{ position: 'fixed', right: 24, bottom: 24, zIndex: 999, width: 380, background: '#fff', borderRadius: 12, boxShadow: '0 12px 48px rgba(0,0,0,0.18)', border: '1px solid #DEE1E7', overflow: 'hidden' }}>
      <div style={{ background: '#394A58', color: '#fff', padding: '12px 16px', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
        <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: '0.16em', textTransform: 'uppercase' }}>
          FEEDBACK · {VARIANTS.find(v => v.id === variant)?.label.split('·')[0].trim()} · {PAGES.find(p => p.id === page)?.label}
        </div>
        <button onClick={() => setOpen(false)} style={{ background: 'transparent', border: 0, color: '#fff', fontSize: 18, cursor: 'pointer', padding: 0, lineHeight: 1 }}>×</button>
      </div>
      <textarea
        value={text}
        onChange={e => save(e.target.value)}
        placeholder="Algemene pagina-feedback. Voor element-specifiek: gebruik PIN-modus in de toolbar."
        style={{ width: '100%', minHeight: 180, padding: 16, border: 0, outline: 'none', fontFamily: "'Inter', sans-serif", fontSize: 14, lineHeight: 1.55, resize: 'vertical', boxSizing: 'border-box' }}
      />
      <div style={{ padding: '12px 16px', borderTop: '1px solid #DEE1E7', display: 'flex', justifyContent: 'space-between', alignItems: 'center', background: '#fafaf7' }}>
        <span style={{ fontSize: 12, color: '#7B8896' }}>{text.length > 0 ? '✓ Opgeslagen lokaal' : 'Typ je feedback'}</span>
        <button onClick={exportAll} style={{ background: '#FF6900', color: '#fff', border: 0, borderRadius: 6, padding: '8px 14px', fontSize: 12, fontWeight: 600, cursor: 'pointer', fontFamily: 'Inter' }}>
          📥 Download alle feedback
        </button>
      </div>
    </div>
  );
}

/* ─────────── REVIEW APP ─────────── */
function ReviewApp() {
  const [variant, setVariant] = React.useState('v1');
  const [page, setPage] = React.useState('home');
  const [pinMode, setPinMode] = React.useState(false);
  const [labelsOn, setLabelsOn] = React.useState(false);
  const [introOpen, setIntroOpen] = React.useState(false);

  React.useEffect(() => { window.location.hash = `${variant}-${page}`; }, [variant, page]);
  React.useEffect(() => {
    const h = window.location.hash.replace('#', '');
    const [v, p] = h.split('-');
    if (VARIANTS.find(x => x.id === v)) setVariant(v);
    if (PAGES.find(x => x.id === p)) setPage(p);
    // Auto-open intro video on first visit
    if (!localStorage.getItem(INTRO_SEEN_KEY)) {
      const t = setTimeout(() => setIntroOpen(true), 350);
      return () => clearTimeout(t);
    }
  }, []);

  const closeIntro = () => {
    localStorage.setItem(INTRO_SEEN_KEY, '1');
    setIntroOpen(false);
  };

  const Component = COMPONENT_MAP[variant][page];

  const toggleBtn = (on, onClick, label, dotColor) => (
    <button
      onClick={onClick}
      data-pin-ui
      style={{
        display: 'inline-flex', alignItems: 'center', gap: 8,
        background: on ? '#0a141c' : '#fff', color: on ? '#fff' : '#394A58',
        border: '1px solid ' + (on ? '#0a141c' : '#DEE1E7'),
        borderRadius: 6, padding: '7px 12px', fontSize: 12, fontWeight: 600,
        cursor: 'pointer', fontFamily: 'Inter',
      }}
    >
      <span style={{ width: 8, height: 8, borderRadius: '50%', background: on ? dotColor : '#DEE1E7' }} />
      {label}
    </button>
  );

  return (
    <div>
      {/* TOP REVIEW BAR */}
      <header data-pin-ui style={{
        position: 'sticky', top: 0, zIndex: 100,
        background: 'rgba(255,255,255,0.95)', backdropFilter: 'blur(8px)',
        borderBottom: '1px solid #DEE1E7', padding: '12px 24px',
        display: 'flex', alignItems: 'center', gap: 16, fontFamily: 'Inter, sans-serif',
        flexWrap: 'wrap',
      }}>
        <div style={{ fontFamily: "'JetBrains Mono', monospace", fontSize: 11, color: '#7B8896', letterSpacing: '0.18em', textTransform: 'uppercase' }}>
          XINNO REVIEW
        </div>

        {/* Variant switcher */}
        <div style={{ display: 'flex', gap: 4, background: '#EFF1F4', borderRadius: 8, padding: 4 }}>
          {VARIANTS.map(v => (
            <button key={v.id} onClick={() => setVariant(v.id)} style={{ background: variant === v.id ? '#fff' : 'transparent', color: variant === v.id ? '#0a0a0a' : '#7B8896', border: 0, padding: '7px 12px', borderRadius: 6, fontSize: 12, fontWeight: variant === v.id ? 600 : 500, cursor: 'pointer', fontFamily: 'Inter', boxShadow: variant === v.id ? '0 1px 3px rgba(0,0,0,0.08)' : 'none' }}>
              {v.label}
            </button>
          ))}
        </div>

        {/* Page switcher */}
        <div style={{ display: 'flex', gap: 4, background: '#EFF1F4', borderRadius: 8, padding: 4 }}>
          {PAGES.map(p => (
            <button key={p.id} onClick={() => setPage(p.id)} style={{ background: page === p.id ? '#fff' : 'transparent', color: page === p.id ? '#0a0a0a' : '#7B8896', border: 0, padding: '7px 12px', borderRadius: 6, fontSize: 12, fontWeight: page === p.id ? 600 : 500, cursor: 'pointer', fontFamily: 'Inter', boxShadow: page === p.id ? '0 1px 3px rgba(0,0,0,0.08)' : 'none' }}>
              {p.label}
            </button>
          ))}
        </div>

        {/* Review tools */}
        <div style={{ display: 'flex', gap: 8, marginLeft: 'auto', alignItems: 'center' }}>
          <button
            onClick={() => setIntroOpen(true)}
            data-pin-ui
            title="Bekijk de intro-video opnieuw"
            style={{ display: 'inline-flex', alignItems: 'center', gap: 8, background: '#FF6900', color: '#fff', border: '1px solid #FF6900', borderRadius: 6, padding: '7px 12px', fontSize: 12, fontWeight: 600, cursor: 'pointer', fontFamily: 'Inter' }}
          >
            <span style={{ width: 16, height: 16, borderRadius: '50%', background: 'rgba(255,255,255,0.22)', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: 9, paddingLeft: 1.5 }}>▶</span>
            Bekijk intro
          </button>
          {toggleBtn(pinMode, () => setPinMode(v => !v), pinMode ? 'Pin-modus AAN' : 'Pin-modus', '#FF6900')}
          {toggleBtn(labelsOn, () => setLabelsOn(v => !v), labelsOn ? 'Labels AAN' : 'Labels', '#FF6900')}
        </div>
      </header>

      <IntroVideoModal open={introOpen} onClose={closeIntro} />

      {pinMode && (
        <div data-pin-ui style={{ position: 'sticky', top: 56, zIndex: 95, background: '#FFF4EC', borderBottom: '1px solid #FFD9B8', padding: '8px 24px', fontSize: 12, color: '#7A3A00', fontFamily: 'Inter' }}>
          📍 <strong>Pin-modus actief</strong> — klik op een element om een pin + comment te plaatsen. Klik op een bestaande pin om te bewerken.
        </div>
      )}

      {/* ACTIVE PAGE — full bleed, normal scroll */}
      <main style={{ position: 'relative' }}>
        <Component key={`${variant}-${page}`} />
        <LabelOverlay variant={variant} page={page} on={labelsOn} />
        <PinOverlay variant={variant} page={page} active={pinMode} />
      </main>

      {/* FEEDBACK PANEL (page-level textarea + export) */}
      <FeedbackPanel variant={variant} page={page} />
    </div>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<ReviewApp />);
