/* Callback section + Footer */

// ─── Validation helpers ────────────────────────────────────────────────────────
function isValidPhone(raw) {
  const p = raw.replace(/[\s\-\.]/g, '');
  return /^(06|07)\d{8}$/.test(p)
      || /^\+212[67]\d{8}$/.test(p)
      || /^00212[67]\d{8}$/.test(p);
}
function isValidEmail(v) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v);
}

// ─── Error label style ─────────────────────────────────────────────────────────
const ErrStyle = {
  display: 'block', color: 'var(--danger)', fontSize: 12,
  fontWeight: 700, marginTop: 4,
};

// ─── CallbackSection ───────────────────────────────────────────────────────────
function CallbackSection({ t, lang, onWA }) {
  const c = t.callbackSection;
  const f = c.form;

  const EMPTY = {
    name: '', phone: '', email: '', city: '',
    activity: '', prefLang: lang === 'ar' ? 'ar' : 'fr',
    msg: '', consent: false,
    _hp: '',          // honeypot
  };

  const [data,    setData]    = React.useState(EMPTY);
  const [errs,    setErrs]    = React.useState({});
  const [status,  setStatus]  = React.useState('idle'); // idle | loading | success | error
  const [errMsg,  setErrMsg]  = React.useState('');
  const [waData,  setWaData]  = React.useState(null);
  const loadTime = React.useRef(Date.now());

  // Sync default lang on language switch
  React.useEffect(() => {
    setData(d => ({ ...d, prefLang: lang === 'ar' ? 'ar' : 'fr' }));
  }, [lang]);

  const upd = (k) => (e) => {
    const v = e.target.type === 'checkbox' ? e.target.checked : e.target.value;
    setData(d => ({ ...d, [k]: v }));
    if (errs[k]) setErrs(er => ({ ...er, [k]: '' }));
  };

  const validate = () => {
    const e = {};
    const isFr = lang === 'fr';
    if (!data.name.trim())
      e.name = isFr ? 'Nom obligatoire' : 'الاسم مطلوب';
    if (!data.phone.trim())
      e.phone = isFr ? 'Téléphone obligatoire' : 'رقم الهاتف مطلوب';
    else if (!isValidPhone(data.phone))
      e.phone = isFr ? 'Format invalide — ex : 06XXXXXXXX ou +2126XXXXXXXX' : 'صيغة غير صحيحة — مثال: 06XXXXXXXX';
    if (data.email && !isValidEmail(data.email))
      e.email = isFr ? 'Email invalide' : 'البريد الإلكتروني غير صحيح';
    if (!data.city.trim())
      e.city = isFr ? 'Ville obligatoire' : 'المدينة مطلوبة';
    if (!data.activity)
      e.activity = isFr ? 'Type de commerce obligatoire' : 'نوع التجارة مطلوب';
    if (!data.consent)
      e.consent = isFr ? 'Veuillez accepter pour continuer' : 'الموافقة مطلوبة للمتابعة';
    return e;
  };

  const submit = async (e) => {
    e.preventDefault();

    // Anti-spam: honeypot
    if (data._hp) return;

    // Anti-spam: minimum delay (3 s)
    if (Date.now() - loadTime.current < 3000) return;

    const validErrs = validate();
    if (Object.keys(validErrs).length > 0) {
      setErrs(validErrs);
      // Scroll to first error
      const first = document.querySelector('.cb-form .fld-err');
      if (first) first.scrollIntoView({ behavior: 'smooth', block: 'center' });
      return;
    }

    setStatus('loading');
    setErrMsg('');

    const leadPayload = {
      full_name:          data.name.trim(),
      phone:              data.phone.replace(/[\s\-\.]/g, ''),
      email:              data.email.trim() || null,
      business_type:      data.activity,
      city:               data.city.trim(),
      message:            data.msg.trim() || null,
      preferred_language: data.prefLang,
      consent_contact:    true,
      _hp:                data._hp,               // honeypot (devrait être vide)
      _t:                 loadTime.current,        // timestamp chargement page → anti-spam serveur
    };

    try {
      const apiUrl = (window.CB3?.apiUrl ?? CB3?.apiUrl ?? '');
      const res = await fetch(apiUrl + '/api/leads', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(leadPayload),
      });

      const json = await res.json().catch(() => ({}));
      if (!res.ok) throw new Error(json.error || `Erreur ${res.status}`);

      setWaData(leadPayload);
      setStatus('success');

    } catch (err) {
      console.error('[CB3] Submit error:', err);
      setStatus('error');
      setErrMsg(f.errorMsg);
    }
  };

  const openWAAfterSubmit = () => {
    if (!waData) return;
    const lines = [
      lang === 'fr'
        ? 'Bonjour, je souhaite être rappelé pour ClickBi3.'
        : 'سلام، بغيت شي حد من ClickBi3 يعاود ليا.',
      `${lang === 'fr' ? 'Nom' : 'الاسم'} : ${waData.full_name}`,
      `${lang === 'fr' ? 'Téléphone' : 'الهاتف'} : ${waData.phone}`,
      `${lang === 'fr' ? 'Type de commerce' : 'نوع التجارة'} : ${waData.business_type}`,
      `${lang === 'fr' ? 'Ville' : 'المدينة'} : ${waData.city}`,
      waData.message ? `${lang === 'fr' ? 'Message' : 'رسالة'} : ${waData.message}` : null,
    ].filter(Boolean).join('\n');

    window.open(
      `https://wa.me/${(window.CB3 || CB3).whatsappPhone || '212662777525'}?text=${encodeURIComponent(lines)}`,
      '_blank'
    );
  };

  const resetForm = () => {
    setData({ ...EMPTY, prefLang: lang === 'ar' ? 'ar' : 'fr' });
    setErrs({});
    setStatus('idle');
    setErrMsg('');
    loadTime.current = Date.now();
  };

  return (
    <section className="callback" id="callback" data-screen-label="14 Être rappelé" style={{ position: 'relative' }}>
      <div className="container">
        <SectMark n="14" label="CALLBACK.SEND" />
        <div className="section-head reveal">
          <span className="eyebrow"><span className="dot"></span>{c.eyebrow}</span>
          <h2 style={{ marginTop: 14 }}>{c.title}</h2>
          <p className="lead">{c.lead}</p>
        </div>

        <div className="cb-grid">
          {/* ── Side info ── */}
          <div className="cb-side reveal">
            <h3>{c.side.title}</h3>
            <ul>
              {c.side.items.map((it, i) => (
                <li key={i}><span className="ic">{I.check()}</span><span>{it}</span></li>
              ))}
            </ul>
            <div style={{ marginTop: 24 }}>
              <div style={{ fontSize: 13, color: '#8AA1AD', fontFamily: 'JetBrains Mono,monospace', textTransform: 'uppercase', letterSpacing: '.08em', fontWeight: 700, marginBottom: 10 }}>
                {c.side.whatsappTitle}
              </div>
              <p style={{ marginBottom: 14, fontSize: 14 }}>{c.side.whatsappSub}</p>
              <div className="cb-quick">
                <a href="#" onClick={(e) => { e.preventDefault(); onWA(); }}>
                  <span className="ic wa">{I.whatsapp()}</span>
                  <span>WhatsApp ClickBi3</span>
                  <span className="num" dir="ltr">06 62 77 75 25</span>
                </a>
                <a href="tel:+212662777525">
                  <span className="ic ph">{I.phone()}</span>
                  <span>{lang === 'fr' ? 'Appel direct' : 'مكالمة مباشرة'}</span>
                  <span className="num" dir="ltr">06 62 77 75 25</span>
                </a>
              </div>
            </div>
          </div>

          {/* ── Form card ── */}
          <div className="cb-form reveal" style={{ transitionDelay: '.1s' }}>

            {status === 'success' ? (
              /* ── Success state ── */
              <div className="cb-success">
                <div className="b">{I.check()}</div>
                <h3>{f.sentTitle}</h3>
                <p>{f.sentSub}</p>
                <button className="btn btn-wa btn-lg btn-block" style={{ marginTop: 20 }} onClick={openWAAfterSubmit}>
                  {I.whatsapp()} {f.waBtnLabel}
                </button>
                <button className="btn btn-secondary" style={{ marginTop: 10 }} onClick={resetForm}>
                  {f.newRequest}
                </button>
              </div>
            ) : (
              /* ── Form state ── */
              <React.Fragment>
                <h3>{f.title}</h3>
                <p className="sub">{f.sub}</p>

                <form onSubmit={submit} noValidate>
                  {/* Honeypot — invisible aux humains, bots le remplissent */}
                  <div style={{ position: 'absolute', left: '-9999px', top: '-9999px', opacity: 0, height: 0, overflow: 'hidden' }} aria-hidden="true" tabIndex="-1">
                    <input name="_website" value={data._hp} onChange={upd('_hp')} autoComplete="off" tabIndex="-1" />
                  </div>

                  <div className="cb-fields">
                    {/* Nom */}
                    <div className={`fld full${errs.name ? ' fld-err' : ''}`}>
                      <label>{f.labels.name}</label>
                      <input value={data.name} onChange={upd('name')} placeholder={f.placeholders.name} autoComplete="name" aria-required="true" />
                      {errs.name && <span style={ErrStyle}>{errs.name}</span>}
                    </div>

                    {/* Téléphone */}
                    <div className={`fld${errs.phone ? ' fld-err' : ''}`}>
                      <label>{f.labels.phone}</label>
                      <input value={data.phone} onChange={upd('phone')} placeholder={f.placeholders.phone} type="tel" dir="ltr" inputMode="tel" autoComplete="tel" aria-required="true" />
                      {errs.phone && <span style={ErrStyle}>{errs.phone}</span>}
                    </div>

                    {/* Email */}
                    <div className={`fld${errs.email ? ' fld-err' : ''}`}>
                      <label>{f.labels.email}</label>
                      <input value={data.email} onChange={upd('email')} placeholder={f.placeholders.email} type="email" dir="ltr" inputMode="email" autoComplete="email" />
                      {errs.email && <span style={ErrStyle}>{errs.email}</span>}
                    </div>

                    {/* Ville */}
                    <div className={`fld${errs.city ? ' fld-err' : ''}`}>
                      <label>{f.labels.city}</label>
                      <input value={data.city} onChange={upd('city')} placeholder={f.placeholders.city} autoComplete="address-level2" aria-required="true" />
                      {errs.city && <span style={ErrStyle}>{errs.city}</span>}
                    </div>

                    {/* Type de commerce */}
                    <div className={`fld full${errs.activity ? ' fld-err' : ''}`}>
                      <label>{f.labels.activity}</label>
                      <select value={data.activity} onChange={upd('activity')} aria-required="true">
                        <option value="">{f.chooseActivity}</option>
                        {f.activities.map((a, i) => <option key={i} value={a}>{a}</option>)}
                      </select>
                      {errs.activity && <span style={ErrStyle}>{errs.activity}</span>}
                    </div>

                    {/* Langue préférée */}
                    <div className="fld full">
                      <label style={{ display: 'block', marginBottom: 8 }}>{f.labels.prefLang}</label>
                      <div style={{ display: 'flex', gap: 16 }}>
                        {[['fr', f.langFr], ['ar', f.langAr]].map(([val, lbl]) => (
                          <label key={val} style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer', fontWeight: 600, fontSize: 14, fontFamily: 'inherit', textTransform: 'none', letterSpacing: 0, color: 'var(--ink-2)' }}>
                            <input
                              type="radio" name="prefLang" value={val}
                              checked={data.prefLang === val}
                              onChange={() => setData(d => ({ ...d, prefLang: val }))}
                              style={{ accentColor: 'var(--teal)', width: 16, height: 16, flex: 'none' }}
                            />
                            {lbl}
                          </label>
                        ))}
                      </div>
                    </div>

                    {/* Message */}
                    <div className="fld full">
                      <label>{f.labels.msg}</label>
                      <textarea value={data.msg} onChange={upd('msg')} placeholder={f.placeholders.msg} rows="3" />
                    </div>

                    {/* Consentement */}
                    <div className={`fld full${errs.consent ? ' fld-err' : ''}`}>
                      <label style={{ display: 'flex', gap: 10, alignItems: 'flex-start', cursor: 'pointer', fontWeight: 500, fontSize: 14, fontFamily: 'inherit', textTransform: 'none', letterSpacing: 0, color: 'var(--ink-3)', lineHeight: 1.45 }}>
                        <input
                          type="checkbox" checked={data.consent} onChange={upd('consent')}
                          style={{ accentColor: 'var(--teal)', width: 17, height: 17, marginTop: 1, flex: 'none' }}
                          aria-required="true"
                        />
                        <span>{f.labels.consent}</span>
                      </label>
                      {errs.consent && <span style={ErrStyle}>{errs.consent}</span>}
                    </div>
                  </div>

                  {/* Error banner */}
                  {status === 'error' && (
                    <div style={{ background: 'var(--danger-bg)', color: 'var(--danger)', padding: '12px 16px', borderRadius: 10, fontSize: 14, marginTop: 14, border: '1px solid #FAD4D7', display: 'flex', alignItems: 'center', gap: 10 }}>
                      <svg width="16" height="16" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="2.5" style={{ flex: 'none' }}><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
                      <span>
                        {errMsg}{' '}
                        <button type="button" onClick={onWA} style={{ color: 'var(--wa)', fontWeight: 800, background: 'none', border: 'none', cursor: 'pointer', padding: 0, font: 'inherit', fontSize: 14 }}>
                          WhatsApp →
                        </button>
                      </span>
                    </div>
                  )}

                  {/* Submit */}
                  <button
                    className="btn btn-primary btn-lg btn-block"
                    type="submit"
                    disabled={status === 'loading'}
                    style={{ marginTop: 20, opacity: status === 'loading' ? 0.8 : 1 }}
                  >
                    {status === 'loading' ? (
                      <React.Fragment>
                        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" style={{ animation: 'spin 0.9s linear infinite', flex: 'none' }}>
                          <path d="M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83"/>
                        </svg>
                        {f.submitting}
                      </React.Fragment>
                    ) : (
                      <React.Fragment>{I.phone()} {f.submit}</React.Fragment>
                    )}
                  </button>

                  <p className="microcopy">{f.microcopy}</p>
                  <p style={{ fontSize: 12, color: 'var(--slate-2)', marginTop: 6, textAlign: 'center', lineHeight: 1.5 }}>{f.privacy}</p>
                </form>
              </React.Fragment>
            )}
          </div>
        </div>
      </div>
    </section>
  );
}

// ─── Footer ───────────────────────────────────────────────────────────────────
function Footer({ t, lang }) {
  const f = t.footer;
  return (
    <footer className="footer">
      <div className="container">
        <div className="ftop">
          <div>
            <div className="brand-foot">
              <img src="assets/logo-full.png" alt="ClickBi3" />
            </div>
            <p style={{ marginTop: 14, maxWidth: 380, fontSize: 14, lineHeight: 1.6 }}>{f.tag}</p>
            <p style={{ marginTop: 10, fontSize: 13, color: '#7B919C' }}>ARSYS · {f.city}</p>
          </div>
          <div>
            <h5>{f.nav}</h5>
            <a href="#home">{t.nav.home}</a>
            <a href="#problems">{t.nav.problems}</a>
            <a href="#features">{t.nav.features}</a>
            <a href="#hardware">{t.nav.hardware}</a>
            <a href="#impact">{t.nav.impact}</a>
            <a href="#callback">{t.nav.callback}</a>
          </div>
          <div>
            <h5>{f.contact}</h5>
            <div className="contact-row"><span className="ic">{I.phone()}</span><span className="num" dir="ltr">06 62 77 75 25</span></div>
            <div className="contact-row"><span className="ic">{I.whatsapp()}</span><span className="num" dir="ltr">06 62 77 75 25</span></div>
            <div className="contact-row"><span className="ic">{I.mapPin()}</span>{f.city}</div>
          </div>
          <div>
            <h5>{f.company}</h5>
            <a href="#">ARSYS</a>
            <a href="#">{f.legal}</a>
            <a href="#">{f.cookies}</a>
          </div>
        </div>
        <hr />
        <div className="footer-barcode" aria-hidden="true">
          {Array.from({ length: 64 }).map((_, i) => {
            const widths = [2, 1, 3, 1, 2, 1, 1, 2, 3, 1, 2, 2, 1, 3, 1, 1, 2, 1, 3, 2, 1, 1, 2, 3, 1, 2, 1, 3, 1, 2, 2, 1];
            const w = widths[i % widths.length];
            const h = 14 + ((i * 7) % 14);
            return <span key={i} style={{ width: w + 'px', height: h + 'px' }}></span>;
          })}
        </div>
        <div className="fbot" style={{ marginTop: 14 }}>
          <div>{f.copy}</div>
          <div dir="ltr">v2.0 · Made in Maroc</div>
        </div>
      </div>
    </footer>
  );
}

window.CallbackSection = CallbackSection;
window.Footer = Footer;
