// ─────────────────────────────────────────────────────────
//  Booking — Calendar + slot picker + contact + multi-channel notify
//  Wired for: WhatsApp · Web3Forms email · Cal.com fallback
// ─────────────────────────────────────────────────────────

const { useState: useStateBK, useMemo: useMemoBK, useEffect: useEffectBK, useRef: useRefBK } = React;

/* ═══════════════════════════════════════════════════════════
   ▼▼▼  EDIT THESE TO MANAGE YOUR BOOKINGS  ▼▼▼
   ═══════════════════════════════════════════════════════════ */

// Your WhatsApp number (international format, no +, no spaces)
const ROHIT_WHATSAPP = '919186057407';
const ROHIT_EMAIL    = 'rohit@webbrandify.com';

// Web3Forms access key — sign up free at web3forms.com → paste your key here
// Until you paste a real key, the email path is skipped silently.
const WEB3FORMS_KEY = 'b70c0c04-3ef8-495f-9ef6-ef27e5696b7c';

// Cal.com · 15 min walkthrough (live availability)
const CALCOM_URL = 'https://cal.com/webbrandify/15min?overlayCalendar=true';
const CALCOM_IFRAME = 'https://cal.com/webbrandify/15min/embed';

function CalIframeEmbed() {
  const hostRef = useRefBK(null);
  const [useFallback, setUseFallback] = useStateBK(false);

  useEffectBK(() => {
    if (useFallback || !hostRef.current) return;

    const el = hostRef.current;
    el.innerHTML = '';

    if (!window.Cal) {
      (function (C, A, L) {
        const p = (a, ar) => { a.q.push(ar); };
        const d = C.document;
        C.Cal = C.Cal || function () {
          const cal = C.Cal;
          const ar = arguments;
          if (!cal.loaded) {
            cal.ns = {};
            cal.q = cal.q || [];
            d.head.appendChild(d.createElement('script')).src = A;
            cal.loaded = true;
          }
          if (ar[0] === L) {
            const api = function () { p(api, arguments); };
            const namespace = ar[1];
            api.q = api.q || [];
            if (typeof namespace === 'string') cal.ns[namespace] = api;
            else p(api, ar);
            return;
          }
          p(cal, ar);
        };
      })(window, 'https://app.cal.com/embed/embed.js', 'init');
    }

    try {
      window.Cal('init', { origin: 'https://cal.com' });
      window.Cal('inline', {
        elementOrSelector: el,
        calLink: 'webbrandify/15min',
        config: { layout: 'month_view', theme: 'dark' },
      });
    } catch {
      setUseFallback(true);
      return;
    }

    const t = setTimeout(() => {
      const frame = el.querySelector('iframe');
      if (!frame || frame.offsetHeight < 120) setUseFallback(true);
    }, 12000);

    return () => clearTimeout(t);
  }, [useFallback]);

  if (useFallback) {
    return (
      <div className="cal-embed-fallback-panel">
        <p>Cal.com works best in a new tab on some browsers.</p>
        <a
          href={CALCOM_URL}
          target="_blank"
          rel="noopener"
          className="book-confirm magnetic-trigger"
          style={{ textDecoration: 'none' }}
        >
          Open Cal.com calendar ↗
        </a>
        <iframe
          src={CALCOM_IFRAME}
          className="cal-embed-iframe cal-embed-iframe--secondary"
          title="Cal.com booking (fallback)"
          height="600"
          loading="lazy"
        />
      </div>
    );
  }

  return (
    <div className="cal-embed-wrap">
      <div ref={hostRef} className="cal-embed-host" aria-label="Cal.com booking calendar" />
      <a
        href={CALCOM_URL}
        target="_blank"
        rel="noopener"
        className="cal-open-external magnetic-trigger"
      >
        Prefer full page? Open Cal.com ↗
      </a>
    </div>
  );
}

// Available time slots per weekday (0 = Sun, 1 = Mon, ..., 6 = Sat)
// Empty array = day off
const WEEKLY_SCHEDULE = {
  0: [],                                                  // Sun · closed
  1: ['09:30', '11:00', '14:30', '16:00', '17:30'],       // Mon
  2: ['09:30', '11:00', '14:30', '16:00'],                // Tue
  3: ['11:00', '14:30', '16:00', '17:30'],                // Wed
  4: ['09:30', '14:30', '16:00'],                         // Thu
  5: ['09:30', '11:00', '14:30'],                         // Fri
  6: [],                                                  // Sat · closed
};

// Specific dates you want fully blocked (vacations, etc.) — ISO format
const BLOCKED_DATES = [
  // '2026-05-30',
  // '2026-06-15',
];

/* ═══════════════════════════════════════════════════════════
   ▲▲▲  EDIT THESE  ▲▲▲
   ═══════════════════════════════════════════════════════════ */

function isoDate(d) {
  return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`;
}

function availabilityFor(date, bookings) {
  if (BLOCKED_DATES.includes(isoDate(date))) return [];
  const slots = WEEKLY_SCHEDULE[date.getDay()] || [];
  // remove slots already booked locally
  const bookedToday = bookings.filter(b => b.date === isoDate(date)).map(b => b.slot);
  return slots.filter(s => !bookedToday.includes(s));
}

function Booking() {
  const today = new Date();
  const [viewMonth, setViewMonth] = useStateBK(new Date(today.getFullYear(), today.getMonth(), 1));
  const [step, setStep] = useStateBK('pick');        // cal | pick | contact | sent
  const [bookMode, setBookMode] = useStateBK('whatsapp'); // cal | whatsapp — separate from wizard step
  const [selectedDate, setSelectedDate] = useStateBK(null);
  const [selectedSlot, setSelectedSlot] = useStateBK(null);
  const [contact, setContact] = useStateBK({ name:'', email:'', phone:'', note:'' });
  const [confirmation, setConfirmation] = useStateBK(null);
  const [bookings, setBookings] = useStateBK([]);
  const [submitting, setSubmitting] = useStateBK(false);

  // Load previous bookings from localStorage (acts as your "calendar")
  useEffectBK(() => {
    try {
      const saved = JSON.parse(localStorage.getItem('wb_bookings') || '[]');
      setBookings(saved);
    } catch {}
  }, []);

  const grid = useMemoBK(() => {
    const year = viewMonth.getFullYear();
    const month = viewMonth.getMonth();
    const first = new Date(year, month, 1);
    const lastDay = new Date(year, month + 1, 0).getDate();
    const startOffset = (first.getDay() + 6) % 7; // Monday-first
    const days = [];
    for (let i = 0; i < startOffset; i++) days.push(null);
    for (let d = 1; d <= lastDay; d++) days.push(new Date(year, month, d));
    while (days.length % 7 !== 0) days.push(null);
    return days;
  }, [viewMonth]);

  const monthLabel = viewMonth.toLocaleString('en-US', { month: 'long', year: 'numeric' });
  const dayHeaders = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];

  const slots = selectedDate ? availabilityFor(selectedDate, bookings) : [];

  const slotsThisMonth = grid
    .filter(d => d && d >= today)
    .reduce((sum, d) => sum + availabilityFor(d, bookings).length, 0);

  const isPast = (d) => d < new Date(today.getFullYear(), today.getMonth(), today.getDate());

  const proceedToContact = () => {
    if (selectedDate && selectedSlot) setStep('contact');
  };

  const submitBooking = () => {
    if (!contact.name || !/@/.test(contact.email) || contact.phone.length < 6) return;
    setSubmitting(true);

    const dateStr = selectedDate.toLocaleString('en-US', {weekday:'long', month:'long', day:'numeric', year:'numeric'});
    const ref = 'WB-' + Math.floor(Math.random() * 9000 + 1000);

    const summary = `🗓 New booking · ${ref}

Date: ${dateStr}
Time: ${selectedSlot} IST · 15-min walkthrough
Name: ${contact.name}
Email: ${contact.email}
Phone: ${contact.phone}
${contact.note ? 'Note: ' + contact.note : ''}

Routed from: rohit-sharma portfolio`;

    const whatsappUrl = `https://wa.me/${ROHIT_WHATSAPP}?text=${encodeURIComponent(summary)}`;
    const emailUrl    = `mailto:${ROHIT_EMAIL}?subject=${encodeURIComponent(`Booking ${ref} · ${dateStr} ${selectedSlot}`)}&body=${encodeURIComponent(summary)}`;

    // 1️⃣ Open WhatsApp FIRST — synchronously, while still inside the user gesture.
    //     Browsers block popups opened after `await`, so this MUST come before any async.
    //     Skip auto-open inside an iframe (e.g. dev preview) since WhatsApp blocks
    //     iframe embedding (ERR_BLOCKED_BY_RESPONSE) — visitor still has manual button.
    const inIframe = (() => {
      try { return window.self !== window.top; } catch { return true; }
    })();
    let opened = null;
    if (!inIframe) {
      try { opened = window.open(whatsappUrl, '_blank', 'noopener,noreferrer'); } catch {}
    }

    // 2️⃣ Save locally (sync)
    const newBooking = {
      ref, name:contact.name, email:contact.email, phone:contact.phone,
      note:contact.note,
      date: isoDate(selectedDate), slot: selectedSlot,
      ts: Date.now(),
    };
    const updated = [...bookings, newBooking];
    try { localStorage.setItem('wb_bookings', JSON.stringify(updated)); } catch {}
    setBookings(updated);

    // 3️⃣ Fire-and-forget Web3Forms — runs in background, doesn't block UI
    if (WEB3FORMS_KEY) {
      fetch('https://api.web3forms.com/submit', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          access_key: WEB3FORMS_KEY,
          subject: `New booking · ${ref} · ${dateStr} ${selectedSlot}`,
          from_name: contact.name,
          email: contact.email,
          phone: contact.phone,
          message: summary,
        }),
      }).catch(() => {});
    }

    setSubmitting(false);
    setConfirmation({ ref, dateStr, slot:selectedSlot, summary, whatsappUrl, emailUrl, popupBlocked: !opened, inIframe });
    setStep('sent');
  };

  const reset = () => {
    setBookMode('whatsapp');
    setStep('pick');
    setSelectedDate(null);
    setSelectedSlot(null);
    setContact({name:'', email:'', phone:'', note:''});
    setConfirmation(null);
  };

  const showCal = bookMode === 'cal' && step !== 'sent';
  const showWhatsapp = bookMode === 'whatsapp' && step !== 'sent';

  return (
    <section className="section section-booking shell" data-screen-label="Booking" id="booking">
      <div>
        <div className="kicker">§05 · Booking · By invitation</div>
        <h2 style={{
          fontFamily:'var(--serif)', fontWeight:400,
          fontSize:'clamp(40px, 5vw, 76px)', lineHeight:1.0,
          letterSpacing:'-0.02em', margin:'18px 0 0', maxWidth:'20ch',
          textWrap:'balance',
        }}>
          Two slots a week.<br/>
          <span style={{fontStyle:'italic', color:'var(--accent)'}}>Pick yours.</span>
        </h2>
      </div>

      <div className="book-grid">
        <div className="book-meta">
          <span className="kicker">Live calendar · Asia/Kolkata</span>
          <h4>15-min studio walkthrough — direct with Rohit.</h4>
          <p>
            No discovery questionnaires, no sales floor. We review your site, identify
            the three highest-leverage rebuilds, and either book the next call or
            refer you out.
          </p>

          <div className="book-queue">
            <div className="q">
              In queue
              <span className="v">{47 + bookings.length}</span>
            </div>
            <div className="q">
              Open this month
              <span className="v">{slotsThisMonth}</span>
            </div>
            <div className="q">
              Avg response
              <span className="v">14h</span>
            </div>
          </div>

          <div style={{
            marginTop:20, paddingTop:16, borderTop:'1px solid var(--line)',
            fontFamily:'var(--mono)', fontSize:11, letterSpacing:'0.14em',
            textTransform:'uppercase', color:'var(--muted)',
          }}>
            <a
              href={CALCOM_URL}
              target="_blank" rel="noopener"
              className="magnetic-trigger"
              style={{color:'var(--accent)'}}
            >Open Cal.com in new tab ↗</a>
          </div>
        </div>

        <div className="book-cal">
          <div className="book-mode-tabs" role="tablist" aria-label="Booking method">
            <button
              type="button"
              role="tab"
              aria-selected={bookMode === 'cal'}
              className={`book-mode-tab magnetic-trigger ${bookMode === 'cal' ? 'active' : ''}`}
              onClick={() => { setBookMode('cal'); setStep('cal'); }}
            >Cal.com calendar</button>
            <button
              type="button"
              role="tab"
              aria-selected={bookMode === 'whatsapp'}
              className={`book-mode-tab magnetic-trigger ${bookMode === 'whatsapp' ? 'active' : ''}`}
              onClick={() => {
                setBookMode('whatsapp');
                setStep('pick');
                setSelectedDate(null);
                setSelectedSlot(null);
              }}
            >WhatsApp slots</button>
          </div>

          {showCal && (
            <>
              <div className="book-cal-head">
                <span style={{color:'var(--accent)'}}>Cal.com · Live</span>
                <span>Asia/Kolkata · 15 min</span>
              </div>
              <CalIframeEmbed />
            </>
          )}

          {step === 'sent' && confirmation && (
            <div>
              <div className="book-cal-head">
                <span style={{color:'var(--accent)'}}>✓ Sent · {confirmation.ref}</span>
                <span>Asia/Kolkata</span>
              </div>
              <div className="book-confirmed">
                <div className="row"><span className="l">Date</span><span className="v">{confirmation.dateStr}</span></div>
                <div className="row"><span className="l">Time</span><span className="v">{confirmation.slot} IST</span></div>
                <div className="row"><span className="l">Format</span><span className="v">Zoom · 15 min</span></div>
                <div className="row"><span className="l">With</span><span className="v">Rohit Sharma</span></div>
                <div className="row"><span className="l">Status</span><span className="v">Routed to Rohit</span></div>
              </div>

              <div style={{
                marginTop:16, padding:'14px 16px', border:'1px solid var(--line)',
                borderRadius:12, fontFamily:'var(--mono)', fontSize:11.5, lineHeight:1.7,
                color:'var(--muted)',
              }}>
                {confirmation.inIframe ? (
                  <>
                    <strong style={{color:'var(--accent)', fontWeight:500}}>✓ Booking received</strong><br/>
                    Tap the green WhatsApp button below to send the confirmation to Rohit. Email backup also available.
                  </>
                ) : confirmation.popupBlocked ? (
                  <>
                    <strong style={{color:'#FFD680', fontWeight:500}}>⚠ Popup blocked by browser</strong><br/>
                    Press the green WhatsApp button below to send the confirmation manually.
                  </>
                ) : (
                  <>
                    <strong style={{color:'var(--accent)', fontWeight:500}}>✓ WhatsApp opened in a new tab</strong><br/>
                    Press <strong style={{color:'var(--ink)'}}>Send</strong> in WhatsApp to confirm with Rohit. Email backup below.
                  </>
                )}
              </div>

              <div style={{display:'grid', gridTemplateColumns:'1fr 1fr', gap:8, marginTop:12}}>
                <a
                  href={confirmation.whatsappUrl}
                  target="_blank" rel="noopener"
                  className="book-confirm magnetic-trigger"
                  style={{textDecoration:'none', background:'#25D366', color:'#fff'}}
                >
                  <span>📱 Open WhatsApp again</span>
                </a>
                <a
                  href={confirmation.emailUrl}
                  className="book-confirm magnetic-trigger"
                  style={{textDecoration:'none', background:'transparent', color:'var(--ink)', border:'1px solid var(--line)'}}
                >
                  <span>✉ Email backup</span>
                </a>
              </div>

              <button
                className="magnetic-trigger"
                onClick={reset}
                style={{
                  marginTop:12, width:'100%',
                  background:'transparent', color:'var(--muted)', border:'none',
                  fontFamily:'var(--mono)', fontSize:11, letterSpacing:'0.16em',
                  textTransform:'uppercase', padding:'10px 0',
                }}
              >Book another slot</button>
            </div>
          )}

          {showWhatsapp && step === 'contact' && (
            <div>
              <div className="book-cal-head">
                <button
                  className="magnetic-trigger"
                  onClick={() => setStep('pick')}
                  style={{background:'none', border:'none', color:'var(--muted)', padding:0}}
                >‹ back</button>
                <span style={{color:'var(--ink)'}}>Your details</span>
                <span>Step 2 / 2</span>
              </div>

              <div style={{
                padding:'14px 16px', background:'rgba(0,242,254,0.04)',
                border:'1px solid var(--accent-dim)', borderRadius:12,
                fontFamily:'var(--mono)', fontSize:11, color:'var(--muted)',
                letterSpacing:'0.12em', lineHeight:1.7, marginBottom:16,
              }}>
                <div style={{color:'var(--accent)', textTransform:'uppercase'}}>Selected</div>
                <div style={{color:'var(--ink)', fontSize:13, marginTop:2}}>
                  {selectedDate.toLocaleString('en-US', {weekday:'long', month:'long', day:'numeric'})} · {selectedSlot} IST
                </div>
              </div>

              <div className="bk-field">
                <label>Full name</label>
                <input
                  value={contact.name}
                  onChange={e => setContact({...contact, name:e.target.value.slice(0, 60)})}
                  placeholder="First Last"
                  autoFocus
                />
              </div>
              <div className="bk-field">
                <label>Work email</label>
                <input
                  value={contact.email}
                  onChange={e => setContact({...contact, email:e.target.value.slice(0, 80)})}
                  placeholder="you@company.com"
                />
              </div>
              <div className="bk-field">
                <label>WhatsApp / phone · with country code</label>
                <input
                  value={contact.phone}
                  onChange={e => setContact({...contact, phone:e.target.value.replace(/[^\d+\-\s()]/g,'').slice(0,22)})}
                  placeholder="+91 98765 43210"
                />
              </div>
              <div className="bk-field">
                <label>One line about your site (optional)</label>
                <input
                  value={contact.note}
                  onChange={e => setContact({...contact, note:e.target.value.slice(0, 120)})}
                  placeholder="e.g. Real estate · Mumbai · 3.2s load"
                />
              </div>

              <button
                className="book-confirm magnetic-trigger"
                onClick={submitBooking}
                disabled={submitting || !contact.name || !/@/.test(contact.email) || contact.phone.length < 6}
              >
                {submitting ? 'Sending…' : 'Send booking →'}
              </button>
            </div>
          )}

          {showWhatsapp && step === 'pick' && (
            <>
              <div className="book-cal-head">
                <button
                  className="magnetic-trigger"
                  onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() - 1, 1))}
                  style={{background:'none', border:'none', color:'var(--muted)', padding:0}}
                >‹ prev</button>
                <span style={{color:'var(--ink)'}}>{monthLabel}</span>
                <button
                  className="magnetic-trigger"
                  onClick={() => setViewMonth(new Date(viewMonth.getFullYear(), viewMonth.getMonth() + 1, 1))}
                  style={{background:'none', border:'none', color:'var(--muted)', padding:0}}
                >next ›</button>
              </div>

              <div className="book-cal-grid">
                {dayHeaders.map(d => <div key={d} className="book-day-h">{d}</div>)}
                {grid.map((d, i) => {
                  if (!d) return <div key={i}/>;
                  const past = isPast(d);
                  const avail = availabilityFor(d, bookings);
                  const unavail = past || avail.length === 0;
                  const active = selectedDate && d.toDateString() === selectedDate.toDateString();
                  return (
                    <button
                      key={i}
                      className={`book-day magnetic-trigger ${unavail ? 'unavail' : ''} ${active ? 'active' : ''}`}
                      disabled={unavail}
                      onClick={() => { setSelectedDate(d); setSelectedSlot(null); }}
                    >
                      <span>{d.getDate()}</span>
                      <span className="avail-dot"/>
                    </button>
                  );
                })}
              </div>

              {selectedDate && slots.length > 0 && (
                <>
                  <div style={{
                    marginTop:18, fontFamily:'var(--mono)', fontSize:11,
                    letterSpacing:'0.16em', textTransform:'uppercase', color:'var(--muted)',
                  }}>
                    {selectedDate.toLocaleString('en-US', {weekday:'long', month:'short', day:'numeric'})} · {slots.length} slots
                  </div>
                  <div className="book-slots">
                    {slots.map(s => (
                      <button
                        key={s}
                        className={`book-slot magnetic-trigger ${s === selectedSlot ? 'active' : ''}`}
                        onClick={() => setSelectedSlot(s)}
                      >{s}</button>
                    ))}
                  </div>
                </>
              )}

              <button
                className="book-confirm magnetic-trigger"
                onClick={proceedToContact}
                disabled={!selectedDate || !selectedSlot}
              >
                {selectedDate && selectedSlot
                  ? `Continue · ${selectedDate.toLocaleString('en-US', {month:'short', day:'numeric'})} at ${selectedSlot}`
                  : 'Pick a date & time'} →
              </button>
            </>
          )}
        </div>
      </div>
    </section>
  );
}

window.Booking = Booking;
