/* pierre · Per i Locali — mini-landing B2B.
   Tweaks coerenti con la landing principale. Form via mailto: a info@pierreclubs.it. */

const { useState, useEffect, useRef, useCallback } = React;
const Ic = window.PRIcons;

/* Palette presets (replica esatta della landing principale) */
const PALETTES = {
  'viola·magenta': { violet: '#A65CFF', magenta: '#E45BC8', glow: '#C24DE8', bg: '#09060e', panel: '#160f26' },
  'indaco':        { violet: '#8257FF', magenta: '#7C5CFF', glow: '#8257FF', bg: '#0E0A1F', panel: '#16112E' },
  'ciano·viola':   { violet: '#7C5CFF', magenta: '#36C8E0', glow: '#5A8BFF', bg: '#070912', panel: '#101626' },
};

const EMAIL = 'info@pierreclubs.it';

/* Wordmark coerente con la landing */
function Wordmark({ size = 25 }) {
  return (
    <span className="wordmark" style={{ fontSize: size }} aria-label="pierre">
      p<span className="i-wrap">ı<span className="i-dot" /></span>erre
    </span>
  );
}

/* Reveal on scroll */
function useReveal() {
  useEffect(() => {
    const els = document.querySelectorAll('.reveal');
    if (!('IntersectionObserver' in window)) { els.forEach((e) => e.classList.add('in')); return; }
    const io = new IntersectionObserver((ents) => {
      ents.forEach((e) => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } });
    }, { threshold: 0.16, rootMargin: '0px 0px -8% 0px' });
    els.forEach((e) => io.observe(e));
    return () => io.disconnect();
  }, []);
}

/* ---------- contenuti ---------- */

const FEATS = [
  { ic: 'Pin',      t: 'Tavoli live', d: 'Mappa visiva del locale, stato di ogni tavolo aggiornato in tempo reale.' },
  { ic: 'Qr',       t: 'Check-in QR', d: 'Validazione istantanea all’ingresso, niente liste cartacee.' },
  { ic: 'Sparkle',  t: 'Gestione PR', d: 'Un pannello per ogni promoter, attribuzioni e visibilità totale.' },
  { ic: 'Gauge',    t: 'Analytics & report', d: 'Riempimento, conversioni e revenue di ogni serata.' },
];

/* Loghi placeholder — sostituiscili coi locali partner reali */
const LOGOS = ['Velvet Room', 'Atlas Club', 'Notturno 88', 'Mirage', 'Cassiopea', 'Riverside'];

const FAQ = [
  { q: 'Quanto dura l’onboarding di un locale?',
    a: ['Mediamente 3–7 giorni. Ti aiutiamo a importare anagrafica tavoli, mappare le aree e configurare il check-in QR. La prima serata sulla piattaforma è seguita da remoto dal nostro team.'] },
  { q: 'Quanto costa pierre per un locale?',
    a: ['Un canone fisso mensile per la dashboard più una piccola percentuale sulle transazioni effettuate in app. Il dettaglio te lo presentiamo in demo, calibrato sul tuo volume di tavoli e serate. Non chiediamo setup fee.'] },
  { q: 'Posso usarlo solo come gestionale, senza app utente?',
    a: ['Sì. Puoi adottare la dashboard per gestire tavoli, PR e check-in QR anche senza esporre il locale agli utenti finali. È il modo più semplice per partire e abilitare l’app utente quando preferisci.'] },
  { q: 'Cosa succede ai miei PR? Continueranno a lavorare come prima?',
    a: ['Sì, ma con strumenti migliori. Ogni PR ha il suo pannello dedicato, le sue prenotazioni sono tracciate e attribuite correttamente, e tu hai visibilità completa su attività e performance — senza dover inseguire fogli o messaggi.'] },
  { q: 'I miei dati sono al sicuro? Chi è il titolare?',
    a: ['I dati di clienti e prenotazioni restano del tuo locale, gestiti secondo GDPR. Il dettaglio dei trattamenti è descritto nella Privacy Policy della piattaforma.'] },
  { q: 'Serve un contratto pluriennale?',
    a: ['No. Lavoriamo con contratti flessibili e nessun lock-in pluriennale. Vogliamo che resti perché funziona, non perché ti abbiamo legato le mani.'] },
];

/* ---------- Form ---------- */

const RUOLI = ['Titolare', 'Manager', 'PR', 'Altro'];
const SOFTWARE = ['Excel / fogli', 'Altro software gestionale', 'Niente, gestione informale (chat, agenda)', 'Preferisco non dirlo'];
const FONTI = ['Instagram', 'Passaparola', 'Stampa / web', 'Altro evento o locale', 'Altro'];

function Form() {
  const [f, setF] = useState({
    nome: '', locale: '', ruolo: '', citta: '', email: '', telefono: '',
    tavoli: '', software: '', fonte: '', messaggio: '',
  });
  const [status, setStatus] = useState('idle'); // idle | sending | error
  const [error, setError] = useState('');
  const cardRef = useRef(null);
  const set = (k) => (e) => setF((p) => ({ ...p, [k]: e.target.value }));

  const submit = async (e) => {
    e.preventDefault();
    if (status === 'sending') return;
    setStatus('sending');
    setError('');

    const [first, ...rest] = f.nome.trim().split(/\s+/);
    const payload = {
      email: f.email.trim(),
      // Brevo defaults that always exist; the rest of the lead is sent
      // along and ends up in the server logs.
      attributes: { FIRSTNAME: first || '', LASTNAME: rest.join(' ') },
      nome: f.nome, locale: f.locale, ruolo: f.ruolo, citta: f.citta,
      telefono: f.telefono, tavoli: f.tavoli, software: f.software,
      fonte: f.fonte, messaggio: f.messaggio,
    };

    try {
      const res = await fetch('/api/waitlist', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload),
      });
      const data = await res.json().catch(() => ({}));
      if (!res.ok) throw new Error(data.error || 'Invio non riuscito.');
      setStatus('idle');
      if (cardRef.current) cardRef.current.classList.add('sent');
    } catch (err) {
      setStatus('error');
      setError(err.message || 'Invio non riuscito. Riprova o scrivici via email.');
    }
  };

  return (
    <div ref={cardRef} className="form-card">
      <div className="form-content">
        <form className="form-grid" onSubmit={submit} noValidate>
          <div className="field-row">
            <label>Nome e cognome<span className="req">*</span></label>
            <input type="text" required value={f.nome} onChange={set('nome')} placeholder="Es. Marco Bianchi" autoComplete="name" />
          </div>
          <div className="field-row">
            <label>Nome del locale<span className="req">*</span></label>
            <input type="text" required value={f.locale} onChange={set('locale')} placeholder="Es. Velvet Room" autoComplete="organization" />
          </div>

          <div className="field-row">
            <label>Ruolo<span className="req">*</span></label>
            <select required value={f.ruolo} onChange={set('ruolo')}>
              <option value="" disabled>Scegli…</option>
              {RUOLI.map((r) => <option key={r} value={r}>{r}</option>)}
            </select>
          </div>
          <div className="field-row">
            <label>Città<span className="req">*</span></label>
            <input type="text" required value={f.citta} onChange={set('citta')} placeholder="Es. Milano" autoComplete="address-level2" />
          </div>

          <div className="field-row">
            <label>Email<span className="req">*</span></label>
            <input type="email" required value={f.email} onChange={set('email')} placeholder="tu@locale.it" autoComplete="email" />
          </div>
          <div className="field-row">
            <label>Telefono</label>
            <input type="tel" value={f.telefono} onChange={set('telefono')} placeholder="+39 …" autoComplete="tel" />
          </div>

          <div className="field-row">
            <label>N. tavoli</label>
            <input type="number" min="0" value={f.tavoli} onChange={set('tavoli')} placeholder="Es. 24" />
          </div>
          <div className="field-row">
            <label>Software gestionale attuale</label>
            <select value={f.software} onChange={set('software')}>
              <option value="">Scegli…</option>
              {SOFTWARE.map((s) => <option key={s} value={s}>{s}</option>)}
            </select>
          </div>

          <div className="field-row span2">
            <label>Come ci hai conosciuto?</label>
            <select value={f.fonte} onChange={set('fonte')}>
              <option value="">Scegli…</option>
              {FONTI.map((s) => <option key={s} value={s}>{s}</option>)}
            </select>
          </div>

          <div className="field-row span2">
            <label>Messaggio</label>
            <textarea value={f.messaggio} onChange={set('messaggio')}
              placeholder="Raccontaci brevemente il tuo locale: serate tipo, quando vorresti partire, cosa ti serve per primo." />
          </div>

          <div className="form-actions span2" style={{ gridColumn: 'span 2' }}>
            <p className="gdpr">Inviando il modulo accetti che i dati siano usati per ricontattarti, secondo la nostra <a href="privacy-policy.html">Privacy Policy</a>.</p>
            <button type="submit" className="btn btn-primary" disabled={status === 'sending'}>
              {status === 'sending' ? 'Invio…' : <>Invia richiesta <Ic.ArrowRight size={17} /></>}
            </button>
          </div>
          {status === 'error' && (
            <p className="form-error span2" role="alert" style={{ gridColumn: 'span 2' }}>
              {error} Puoi anche scriverci a <a href={`mailto:${EMAIL}`}>{EMAIL}</a>.
            </p>
          )}
        </form>
      </div>

      <div className="form-success" aria-live="polite">
        <div className="check"><Ic.Check size={28} /></div>
        <h3>Richiesta inviata.</h3>
        <p>Grazie! Abbiamo ricevuto la tua richiesta e ti ricontattiamo a breve.
          Per qualsiasi cosa puoi scriverci direttamente.</p>
        <a className="mailto" href={`mailto:${EMAIL}`}>{EMAIL}</a>
      </div>
    </div>
  );
}

/* ---------- App ---------- */

function App() {
  useReveal();
  const [scrolled, setScrolled] = useState(false);

  const [t, setTweak] = useTweaks({
    palette: 'indaco',
    font: 'Schibsted Grotesk',
    glow: 1,
    grain: true,
  });

  useEffect(() => {
    const p = PALETTES[t.palette] || PALETTES['viola·magenta'];
    const root = document.documentElement.style;
    root.setProperty('--violet', p.violet);
    root.setProperty('--magenta', p.magenta);
    root.setProperty('--grad-a', p.violet);
    root.setProperty('--grad-b', p.magenta);
    root.setProperty('--glow', p.glow);
    root.setProperty('--bg', p.bg);
    root.setProperty('--panel-2', p.panel);
    root.setProperty('--glow-k', String(t.glow));
    root.setProperty('--font-display', `'${t.font}', system-ui, sans-serif`);
    root.setProperty('--font-body', `'${t.font}', system-ui, sans-serif`);
    document.body.classList.toggle('no-grain', !t.grain);
    document.body.style.background = p.bg;
  }, [t]);

  useEffect(() => {
    const fam = t.font.replace(/ /g, '+');
    const id = 'twk-font';
    let l = document.getElementById(id);
    if (!l) { l = document.createElement('link'); l.id = id; l.rel = 'stylesheet'; document.head.appendChild(l); }
    l.href = `https://fonts.googleapis.com/css2?family=${fam}:wght@400;500;600;700;800;900&display=swap`;
  }, [t.font]);

  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 16);
    onScroll();
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);

  const jumpForm = useCallback(() => {
    const el = document.getElementById('contatti');
    if (!el) return;
    const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    const y = el.getBoundingClientRect().top + window.scrollY - 80;
    window.scrollTo({ top: y, behavior: reduce ? 'auto' : 'smooth' });
  }, []);

  return (
    <>
      <nav className={'topnav' + (scrolled ? ' scrolled' : '')}>
        <div className="wrap nav-inner">
          <a href="index.html" aria-label="pierre — torna alla home"><Wordmark /></a>
          <div className="nav-links">
            <a href="#valore">Valore</a>
            <a href="#faq">FAQ</a>
            <a href="#contatti">Contatti</a>
          </div>
          <div className="nav-cta">
            <a className="back-home" href="index.html">Vedi sito utenti <Ic.ArrowRight size={14} /></a>
            <button className="btn btn-primary" onClick={jumpForm}>Richiedi una demo</button>
          </div>
        </div>
      </nav>

      {/* HERO */}
      <header className="hero">
        <div className="wrap hero-center">
          <div className="hero-copy reveal in">
            <span className="eyebrow bright"><Ic.Shield size={14} />Per i locali</span>
            <h1>Il tuo locale,<br /><span className="grad-text">gestito senza caos</span>.</h1>
            <p className="lede">pierre Dashboard sostituisce Excel, WhatsApp e la gestione informale dei PR.
              Tavoli in tempo reale, check-in QR, attribuzioni pulite, analytics — in un unico posto.</p>
            <div className="hero-actions">
              <button className="btn btn-primary" onClick={jumpForm}>Richiedi una demo <Ic.ArrowRight size={17} /></button>
              <a className="btn btn-outline" href={`mailto:${EMAIL}?subject=${encodeURIComponent('Informazioni pierre per il mio locale')}`}>
                <Ic.Mail size={17} />Scrivici direttamente
              </a>
            </div>
          </div>
        </div>
      </header>

      {/* VALORE / FEATURES */}
      <section id="valore" className="sec">
        <div className="wrap">
          <div className="sec-head center reveal">
            <span className="eyebrow"><span className="dot" />Quattro cose, fatte bene</span>
            <h2>Tutto quello che ti serve,<br />niente di ciò che non ti serve.</h2>
            <p className="lede">pierre non sostituisce una persona del tuo staff. Sostituisce gli strumenti scollegati con cui oggi inseguono tavoli, PR e ingressi.</p>
          </div>
          <div className="feats">
            {FEATS.map((f, i) => {
              const I = Ic[f.ic];
              return (
                <div className="feat reveal" key={i} style={{ transitionDelay: (i * 60) + 'ms' }}>
                  <div className="f-ic"><I size={20} /></div>
                  <h3>{f.t}</h3>
                  <p>{f.d}</p>
                </div>
              );
            })}
          </div>
        </div>
      </section>

      {/* SHOWCASE — la dashboard reale */}
      <section className="sec showcase">
        <div className="wrap">
          <div className="show-row">
            <div className="show-media reveal">
              <div className="show-frame">
                <div className="hcard-bar">
                  <div className="dots"><i /><i /><i /></div>
                  <span className="hcard-url">dashboard.pierre.app</span>
                </div>
                <img src="assets/dash-overview.jpeg" alt="Dashboard pierre — panoramica del locale" />
              </div>
            </div>
            <div className="show-copy reveal">
              <span className="eyebrow"><span className="dot" />La tua serata, in un colpo d’occhio</span>
              <h2>Tutto quello che ti serve sapere, senza aprire dieci schede.</h2>
              <p className="lede">Prenotazioni attive, incassato, prossimo evento e accesso diretto allo scanner QR.
                La dashboard apre dove serve davvero allo staff: cosa sta succedendo, ora.</p>
            </div>
          </div>

          <div className="show-row flip">
            <div className="show-media reveal">
              <div className="show-frame">
                <div className="hcard-bar">
                  <div className="dots"><i /><i /><i /></div>
                  <span className="hcard-url">dashboard.pierre.app/disposizioni</span>
                </div>
                <img src="assets/dash-disposizioni.jpeg" alt="Disposizioni con Tour 360° configurato" />
              </div>
            </div>
            <div className="show-copy reveal">
              <span className="eyebrow"><span className="dot" />Disposizioni × Tour 360°</span>
              <h2>Una mappa per ogni serata. Un tour 360° che la racconta.</h2>
              <p className="lede">Ogni disposizione è una configurazione di aree e tavoli — con il tour 360°
                collegato che l’utente esplora dall’app. Cambi serata, cambi mappa, cambi prezzi.
                Lo staff vede una cosa sola; l’utente vede esattamente quella.</p>
            </div>
          </div>
        </div>
      </section>

      {/* LOGOS */}
      <section className="logos-wrap">
        <div className="wrap">
          <p className="logos-title">Locali che stiamo onboardando</p>
          <div className="logos reveal">
            {LOGOS.map((n) => (
              <div className="logo" key={n}><i />{n}</div>
            ))}
          </div>
        </div>
      </section>

      {/* FAQ */}
      <section id="faq" className="sec">
        <div className="wrap">
          <div className="sec-head reveal">
            <span className="eyebrow"><span className="dot" />FAQ</span>
            <h2>Le domande che ci fate più spesso.</h2>
            <p className="lede">Tutto il resto, vediamolo insieme in demo — bastano 30 minuti per capire se siamo lo strumento giusto per il tuo locale.</p>
          </div>
          <div className="faq-grid">
            {FAQ.map((it, i) => (
              <details className="faq reveal" key={i}>
                <summary>
                  <span>{it.q}</span>
                  <span className="q-ic"><Ic.Plus size={16} /></span>
                </summary>
                <div className="q-body">
                  {it.a.map((p, j) => <p key={j}>{p}</p>)}
                </div>
              </details>
            ))}
          </div>
        </div>
      </section>

      {/* FORM */}
      <section id="contatti" className="sec">
        <div className="wrap">
          <div className="sec-head reveal">
            <span className="eyebrow"><span className="dot" />Contatti</span>
            <h2>Mostraci il tuo locale.<br /><span className="grad-text">Ti rispondiamo entro 24h.</span></h2>
            <p className="lede">Compila il modulo: aprirà la tua mail con tutto già pronto, basta inviare. Oppure scrivici direttamente.</p>
          </div>
          <div className="form-wrap">
            <aside className="form-side reveal">
              <div className="promise-card">
                <div className="row">
                  <div className="ic"><Ic.Bolt size={16} /></div>
                  <div><b>30 minuti, no slide</b><small>Demo live sul tuo caso reale: serata tipo, mappa tavoli, PR.</small></div>
                </div>
                <div className="row">
                  <div className="ic"><Ic.Shield size={16} /></div>
                  <div><b>Nessun vincolo</b><small>Nessun lock-in pluriennale. Resti perché funziona.</small></div>
                </div>
                <div className="row">
                  <div className="ic"><Ic.Calendar size={16} /></div>
                  <div><b>Onboarding in pochi giorni</b><small>Importazione tavoli, PR e check-in QR seguita dal nostro team.</small></div>
                </div>
              </div>
              <p className="alt-cta">
                Preferisci la mail diretta? Scrivici a <a href={`mailto:${EMAIL}`}>{EMAIL}</a>.
              </p>
            </aside>
            <Form />
          </div>
        </div>
      </section>

      {/* FOOTER */}
      <footer className="bottom">
        <div className="wrap foot-inner">
          <div>
            <Wordmark size={26} />
            <div className="foot-claim">Immergiti nella serata prima di viverla.</div>
          </div>
          <nav className="foot-links" aria-label="Footer">
            <a href="index.html">Home</a>
            <a href={`mailto:${EMAIL}`}>Contatti</a>
            <a href="privacy-policy.html">Privacy</a>
            <a href="termini-e-condizioni.html">Termini</a>
          </nav>
        </div>
        <div className="wrap"><div className="foot-copy">© {new Date().getFullYear()} pierre — la nightlife, finalmente digitale.</div></div>
      </footer>

      <TweaksPanel title="Tweaks">
        <TweakSection label="Atmosfera" />
        <TweakColor
          label="Palette"
          value={t.palette}
          options={Object.keys(PALETTES).map((k) => {
            const p = PALETTES[k];
            return [p.violet, p.magenta, p.bg];
          })}
          onChange={(arr) => {
            const key = Object.keys(PALETTES).find((k) => PALETTES[k].violet === arr[0]) || 'viola·magenta';
            setTweak('palette', key);
          }}
        />
        <TweakSlider label="Intensità glow" value={t.glow} min={0} max={1.6} step={0.1}
          onChange={(v) => setTweak('glow', v)} />
        <TweakToggle label="Grain" value={t.grain} onChange={(v) => setTweak('grain', v)} />
        <TweakSection label="Tipografia" />
        <TweakRadio label="Carattere" value={t.font}
          options={['Schibsted Grotesk', 'Space Grotesk', 'Manrope']}
          onChange={(v) => setTweak('font', v)} />
      </TweaksPanel>
    </>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App />);
