// manual-manager.jsx — Manual Manager de Cont (pagina protejata cu parola)
// Conținutul manualului trăiește în Edge Function `manual-access`; parola și HTML-ul
// nu sunt niciodată livrate ca fișiere statice.

const { useState: useStateMM, useEffect: useEffectMM, useRef: useRefMM, useMemo: useMemoMM } = React;

const MANUAL_PDF_FILES = {
  ro: 'beneficii-2026.pdf',
  tiktok: 'sfaturi-tiktok.pdf',
};

function resolveManualHtml(html, assets) {
  if (!html) return '';
  return html.replace(/\{\{IMG:([^}]+)\}\}/g, (_, name) => {
    const url = assets && assets[name];
    return url ? url : '';
  });
}

function ManualManagerPage({ onNav }) {
  const [password, setPassword] = useStateMM('');
  const [loading, setLoading] = useStateMM(false);
  const [error, setError] = useStateMM('');
  const [payload, setPayload] = useStateMM(null); // { html, assets }
  const [lang, setLang] = useStateMM('ro');
  const passRef = useRefMM(null);
  const contentRef = useRefMM(null);

  useEffectMM(() => {
    if (!payload && passRef.current) passRef.current.focus();
  }, [payload]);

  const resolvedHtml = useMemoMM(() => {
    if (!payload) return '';
    return resolveManualHtml(payload.html, payload.assets);
  }, [payload]);

  const submit = async (e) => {
    if (e && e.preventDefault) e.preventDefault();
    if (!password || loading) return;
    setError('');
    setLoading(true);
    try {
      if (!window.sb || !window.sb.functions) {
        throw new Error('Serviciul nu este disponibil momentan. Reîncarcă pagina și încearcă din nou.');
      }
      const { data, error: fnErr } = await window.sb.functions.invoke('manual-access', {
        body: { password },
      });
      if (fnErr) {
        // Supabase pune status-ul în fnErr.context (Response). Încercăm să citim mesajul.
        let msg = 'Parolă incorectă';
        try {
          const ctx = fnErr.context;
          if (ctx && typeof ctx.json === 'function') {
            const body = await ctx.json();
            if (body && body.error) msg = body.error;
          } else if (fnErr.message) {
            msg = fnErr.message;
          }
        } catch (_) { /* fallback la mesajul default */ }
        setError(msg);
        setPassword('');
        return;
      }
      if (!data || !data.html) {
        setError('Răspuns neașteptat de la server. Încearcă din nou.');
        return;
      }
      setPassword('');
      setPayload(data);
    } catch (err) {
      setError(err && err.message ? err.message : 'A apărut o eroare. Încearcă din nou.');
    } finally {
      setLoading(false);
    }
  };

  const openPdf = (key) => {
    if (!payload || !payload.assets) return;
    const name = MANUAL_PDF_FILES[key];
    const url = payload.assets[name];
    if (!url) return;
    window.open(url, '_blank', 'noopener,noreferrer');
  };

  // Smooth-scroll pentru linkurile din cuprinsul embedat.
  useEffectMM(() => {
    if (!payload || !contentRef.current) return;
    const node = contentRef.current;
    const onClick = (e) => {
      const anchor = e.target.closest && e.target.closest('a[href^="#"]');
      if (!anchor) return;
      const href = anchor.getAttribute('href');
      if (!href || href.length < 2) return;
      const targetId = href.slice(1);
      const target = node.querySelector('#' + CSS.escape(targetId));
      if (target) {
        e.preventDefault();
        target.scrollIntoView({ behavior: 'smooth', block: 'start' });
      }
    };
    node.addEventListener('click', onClick);
    return () => node.removeEventListener('click', onClick);
  }, [payload, resolvedHtml]);

  if (!payload) {
    return (
      <div className="page" style={{ minHeight: '100vh', position: 'relative', overflow: 'hidden', display: 'flex', alignItems: 'center', justifyContent: 'center', paddingTop: 120, paddingBottom: 80 }}>
        <ManualStyles />
        <Mesh />
        <div className="container" style={{ position: 'relative', zIndex: 2, maxWidth: 520 }}>
          <div className="card-glass" style={{ padding: 'clamp(28px, 4vw, 44px)' }}>
            <div className="pill" style={{ marginBottom: 20 }}>
              <span className="dot" />
              <span className="mono" style={{ fontSize: 11, letterSpacing: '0.06em' }}>ACCES RESTRICȚIONAT</span>
            </div>
            <h1 className="display" style={{ fontSize: 'clamp(28px, 4vw, 40px)', margin: '0 0 12px' }}>Manual Manager de Cont</h1>
            <p style={{ color: 'var(--txt-2)', fontSize: 15, lineHeight: 1.55, margin: '0 0 24px' }}>
              Introdu parola pentru a accesa manualul intern.
            </p>
            <form onSubmit={submit}>
              <label style={{ display: 'block', fontSize: 12, color: 'var(--txt-2)', marginBottom: 8, letterSpacing: '0.02em' }}>Parolă</label>
              <input
                ref={passRef}
                type="password"
                className="input"
                value={password}
                onChange={(e) => { setPassword(e.target.value); if (error) setError(''); }}
                placeholder="••••••••"
                autoComplete="current-password"
                disabled={loading}
              />
              {error && (
                <div style={{ marginTop: 12, fontSize: 13, color: 'var(--error)', display: 'flex', alignItems: 'center', gap: 8 }}>
                  <span aria-hidden="true">⚠</span>
                  <span>{error}</span>
                </div>
              )}
              <div style={{ marginTop: 24, display: 'flex', gap: 12, alignItems: 'center' }}>
                <button type="submit" className="btn btn-primary btn-lg" disabled={loading || !password}>
                  {loading ? 'Se verifică…' : 'Intră în manual →'}
                </button>
                {onNav && (
                  <button type="button" className="btn btn-ghost" onClick={() => onNav('home')} disabled={loading}>
                    ← Acasă
                  </button>
                )}
              </div>
            </form>
          </div>
        </div>
      </div>
    );
  }

  return (
    <div className="page manual-page" data-lang={lang}>
      <ManualStyles />
      <div className="manual-shell">
        <div className="manual-topbar">
          <div className="manual-topbar-left">
            {onNav && (
              <button className="btn btn-glass btn-sm" onClick={() => onNav('home')}>← Acasă</button>
            )}
          </div>
          <div className="manual-topbar-right">
            <div className="manual-lang" role="group" aria-label="Language">
              <button
                type="button"
                className={'manual-lang-btn' + (lang === 'ro' ? ' is-active' : '')}
                onClick={() => setLang('ro')}
                aria-pressed={lang === 'ro'}
              >RO</button>
              <button
                type="button"
                className={'manual-lang-btn' + (lang === 'en' ? ' is-active' : '')}
                onClick={() => setLang('en')}
                aria-pressed={lang === 'en'}
              >EN</button>
            </div>
          </div>
        </div>

        <div
          ref={contentRef}
          className="manual"
          dangerouslySetInnerHTML={{ __html: resolvedHtml }}
        />

        <div className="manual-pdf-bar">
          <div className="manual-pdf-title">
            <span className="ro">Materiale PDF</span>
            <span className="en">PDF materials</span>
          </div>
          <div className="manual-pdf-buttons">
            <button className="btn btn-primary" onClick={() => openPdf('ro')}>
              <span aria-hidden="true">↓</span>
              <span className="ro">Beneficii 4U Agency</span>
              <span className="en">4U Agency Benefits</span>
            </button>
            <button className="btn btn-glass" onClick={() => openPdf('tiktok')}>
              <span aria-hidden="true">↓</span>
              <span className="ro">Sfaturi &amp; Informații TikTok</span>
              <span className="en">TikTok Tips &amp; Info</span>
            </button>
          </div>
        </div>
      </div>
    </div>
  );
}

function ManualStyles() {
  return (
    <style dangerouslySetInnerHTML={{ __html: `
      .manual-page { min-height: 100vh; padding: 96px 0 80px; position: relative; z-index: 2; }
      .manual-shell { max-width: 960px; margin: 0 auto; padding: 0 clamp(16px, 3vw, 32px); }

      .manual-topbar { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 32px; }
      .manual-lang { display: inline-flex; background: rgba(255,255,255,0.04); border: .5px solid rgba(255,255,255,0.10); border-radius: 999px; padding: 4px; backdrop-filter: blur(20px); }
      .manual-lang-btn { background: transparent; color: var(--txt-2); border: 0; padding: 6px 16px; font: 600 12px/1 'Geist', sans-serif; letter-spacing: 0.06em; border-radius: 999px; transition: background .18s, color .18s; cursor: pointer; }
      .manual-lang-btn:hover { color: var(--txt-0); }
      .manual-lang-btn.is-active { background: var(--accent-1); color: #0A0A0F; box-shadow: 0 0 0 2px rgba(82,242,15,0.18); }

      /* Language visibility — controlata din React prin data-lang pe wrapper */
      .manual-page[data-lang="ro"] .en,
      .manual-page[data-lang="ro"] .fig-en { display: none !important; }
      .manual-page[data-lang="en"] .ro,
      .manual-page[data-lang="en"] .fig-ro { display: none !important; }

      /* Hero */
      .manual .manual-hero { background: linear-gradient(135deg, rgba(82,242,15,0.10), rgba(255,215,0,0.06)); border: .5px solid rgba(82,242,15,0.20); border-radius: var(--r-lg); padding: clamp(32px, 5vw, 56px); text-align: center; margin-bottom: 32px; backdrop-filter: blur(20px); }
      .manual .manual-hero h1 { font-family: 'Geist', sans-serif; font-weight: 700; font-size: clamp(28px, 5vw, 48px); letter-spacing: -0.02em; line-height: 1.05; margin: 0 0 16px; background: linear-gradient(135deg, var(--accent-1), var(--accent-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
      .manual .manual-hero-sub { color: var(--txt-2); font-size: clamp(15px, 1.6vw, 18px); margin: 0; }

      /* TOC */
      .manual .manual-toc { background: rgba(20,20,26,0.55); border: .5px solid rgba(255,255,255,0.07); border-radius: var(--r-lg); padding: 24px 28px; margin-bottom: 40px; backdrop-filter: blur(20px); }
      .manual .manual-toc-head { font-family: 'Geist', sans-serif; font-weight: 600; text-transform: uppercase; letter-spacing: 0.14em; font-size: 12px; color: var(--accent-1); margin-bottom: 14px; }
      .manual .manual-toc ol { margin: 0; padding: 0; list-style: none; counter-reset: mtoc; display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 4px 20px; }
      .manual .manual-toc li { counter-increment: mtoc; }
      .manual .manual-toc a { display: block; padding: 8px 10px; color: var(--txt-1); text-decoration: none; border-radius: 6px; font-size: 14px; transition: background .18s, color .18s; }
      .manual .manual-toc a:hover { background: rgba(82,242,15,0.08); color: var(--accent-1); }
      .manual .manual-toc a::before { content: counter(mtoc, decimal-leading-zero) "."; color: var(--txt-3); margin-right: 8px; font-family: 'JetBrains Mono', monospace; font-size: 12px; }

      /* Sections */
      .manual .manual-section { background: rgba(20,20,26,0.45); border: .5px solid rgba(255,255,255,0.06); border-radius: var(--r-lg); padding: clamp(24px, 4vw, 40px); margin-bottom: 24px; backdrop-filter: blur(16px); scroll-margin-top: 24px; }
      .manual .manual-section h2 { font-family: 'Geist', sans-serif; font-weight: 700; font-size: clamp(22px, 3vw, 30px); letter-spacing: -0.02em; margin: 0 0 20px; color: var(--txt-0); position: relative; padding-left: 18px; }
      .manual .manual-section h2::before { content: ''; position: absolute; left: 0; top: 6px; bottom: 6px; width: 4px; border-radius: 2px; background: linear-gradient(180deg, var(--accent-1), var(--accent-2)); }
      .manual .manual-section h3 { font-family: 'Geist', sans-serif; font-weight: 600; font-size: 17px; margin: 24px 0 12px; color: var(--txt-0); }
      .manual .manual-section p { font-size: 15px; line-height: 1.65; color: var(--txt-1); margin: 0 0 14px; }
      .manual .manual-section ul,
      .manual .manual-section ol { font-size: 15px; line-height: 1.65; color: var(--txt-1); margin: 0 0 14px; padding-left: 22px; }
      .manual .manual-section ul li,
      .manual .manual-section ol li { margin-bottom: 8px; }
      .manual .manual-section ul { list-style: none; padding-left: 0; }
      .manual .manual-section ul > li { position: relative; padding-left: 22px; }
      .manual .manual-section ul > li::before { content: ''; position: absolute; left: 4px; top: 10px; width: 6px; height: 6px; border-radius: 2px; background: var(--accent-1); box-shadow: 0 0 8px rgba(82,242,15,0.5); }
      .manual .manual-section ul ul,
      .manual .manual-section ul ol,
      .manual .manual-section ol ul,
      .manual .manual-section ol ol { margin-top: 8px; }
      .manual .manual-section strong { color: var(--txt-0); font-weight: 600; }

      /* Alert */
      .manual .manual-alert { background: rgba(239, 68, 68, 0.08); border: .5px solid rgba(239, 68, 68, 0.4); border-left: 3px solid var(--error); color: var(--txt-1); padding: 14px 18px; border-radius: var(--r-sm); margin: 18px 0; font-size: 14px; line-height: 1.55; }
      .manual .manual-alert strong { color: var(--error); margin-right: 6px; }

      /* Figures */
      .manual .manual-figure { margin: 20px 0; text-align: center; }
      .manual .manual-figure img { max-width: 100%; height: auto; border-radius: var(--r-md); border: .5px solid rgba(255,255,255,0.08); box-shadow: 0 20px 60px rgba(0,0,0,0.35); }
      .manual .manual-figure figcaption { margin-top: 10px; font-size: 12px; color: var(--txt-3); font-family: 'JetBrains Mono', monospace; letter-spacing: 0.04em; }

      /* Outro */
      .manual .manual-outro { text-align: center; padding: 40px 24px; margin-top: 32px; border-top: .5px solid rgba(255,255,255,0.06); }
      .manual .manual-outro h3 { font-family: 'Geist', sans-serif; font-weight: 700; font-size: clamp(22px, 3vw, 30px); margin: 0 0 12px; background: linear-gradient(135deg, var(--accent-1), var(--accent-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
      .manual .manual-outro-copy { color: var(--txt-3); font-size: 13px; margin: 0; }

      /* PDF bar */
      .manual-pdf-bar { margin-top: 32px; padding: 24px; background: rgba(255,215,0,0.06); border: .5px solid rgba(255,215,0,0.22); border-radius: var(--r-lg); backdrop-filter: blur(20px); display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 16px; }
      .manual-pdf-title { font-family: 'Geist', sans-serif; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; font-size: 12px; color: var(--accent-2); }
      .manual-pdf-buttons { display: flex; gap: 12px; flex-wrap: wrap; }

      @media (max-width: 640px) {
        .manual-page { padding-top: 72px; }
        .manual .manual-toc ol { grid-template-columns: 1fr; }
        .manual-pdf-bar { flex-direction: column; align-items: stretch; text-align: center; }
        .manual-pdf-buttons { justify-content: center; }
      }
    ` }} />
  );
}

window.ManualManagerPage = ManualManagerPage;
