// HimLocal — Web v2.2 Cafes: list page, detail page with menu, item customize modal

const { useState: useStateWCafe, useMemo: useMemoWCafe } = React;

// ─── Cafes list page ─────────────────────────────────────
function WebCafesList({ data, onOpenCafe, onBack }) {
  return (
    <div className="w2-shop w2-route">
      <div className="w2-shop__head">
        <div className="w2-shop__head-inner">
          <div className="w2-shop__head-row">
            <div>
              <h1 className="w2-shop__title">Cafés &amp; <em>kitchens</em></h1>
              <div className="w2-shop__subtitle">Order in, take away, or sit down. Every café here runs on HimLocal — no external redirects.</div>
            </div>
            <button onClick={onBack} style={{padding:'10px 18px',background:'var(--bone-100)',border:'1px solid var(--border-1)',borderRadius:999,cursor:'pointer',font:'600 12px var(--font-body)',color:'var(--slate-700)'}}>← Back home</button>
          </div>
        </div>
      </div>
      <div className="w2-shop__body">
        <div className="w2-cats">
          {data.cafes.map(c => (
            <div key={c.id} className="w2-cat" style={{height:230,cursor:'pointer'}} onClick={() => onOpenCafe(c.id)}>
              <div className="w2-cat__bg" style={{ backgroundImage:`url(${c.img})` }}/>
              <div className="w2-cat__scrim"/>
              <div style={{position:'absolute',top:14,left:14,display:'flex',gap:6}}>
                {c.modes.map(m => (
                  <span key={m} style={{font:'600 8.5px var(--font-body)',letterSpacing:'.18em',textTransform:'uppercase',padding:'3px 8px',borderRadius:999,background:'rgba(255,255,255,.18)',backdropFilter:'blur(8px)',color:'white',border:'1px solid rgba(255,255,255,.22)'}}>
                    {m === 'dinein' ? 'Dine-in' : m === 'takeaway' ? 'Takeaway' : 'Delivery'}
                  </span>
                ))}
              </div>
              <div className="w2-cat__name" style={{bottom:54}}>{c.name}</div>
              <div className="w2-cat__sub" style={{bottom:32}}>{c.loc}</div>
              <div className="w2-cat__sub" style={{bottom:12,fontStyle:'italic'}}>{c.tag}</div>
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}
window.WebCafesList = WebCafesList;

// ─── Cafe detail page (menu + service mode + cart) ───────
function WebCafeDetail({ data, cafe, cart, onBack, onMode, mode, onAdd, onQty, onCheckout }) {
  const [customizing, setCustomizing] = useStateWCafe(null);
  const [activeSect, setActiveSect] = useStateWCafe(cafe?.menu?.[0]?.section);
  const [orderNote, setOrderNote] = useStateWCafe('');
  const c = cafe;
  if (!c) return null;

  const cartLines = cart.map(it => ({ ...it, item:findItem(c, it.itemId) })).filter(l => l.item);
  const subtotal = cartLines.reduce((s, l) => s + l.unitPrice * l.qty, 0);
  const delivery = mode === 'delivery' ? 40 : 0;
  const tax = Math.round(subtotal * 0.05);
  const total = subtotal + delivery + tax;

  const scrollToSect = (name) => {
    setActiveSect(name);
    const el = document.getElementById('cafe-sect-' + name.replace(/\s+/g, '-'));
    if (el) el.scrollIntoView({ behavior:'smooth', block:'start' });
  };

  const quickAdd = (item) => {
    const hasOpts = (item.variants && item.variants.length > 0) || (item.addons && item.addons.length > 0);
    if (hasOpts) { setCustomizing(item); return; }
    onAdd(item, { unitPrice:item.price, qty:1, customLabel:'' });
  };

  // Quantity of a no-option item in cart (sum across lines)
  const itemQtyInCart = (itemId) => cart.filter(l => l.itemId === itemId && !l.customLabel).reduce((s, l) => s + l.qty, 0);
  const lineIdForItem = (itemId) => cart.find(l => l.itemId === itemId && !l.customLabel)?.lineId;

  return (
    <div className="w2-cafe w2-route">
      <div className="w2-cafe__hero" style={{ backgroundImage:`url(${c.img})` }}>
        <div className="w2-cafe__hero-scrim"/>
        <button className="w2-cafe__back" onClick={onBack} aria-label="Back">←</button>
        <div className="w2-cafe__hero-copy">
          <span className="w2-cafe__hero-eyebrow">{c.loc}</span>
          <h1 className="w2-cafe__hero-title">{c.name}</h1>
          <div className="w2-cafe__hero-meta">{c.tag} · {c.hours}</div>
        </div>
      </div>

      <div className="w2-cafe__content">
        <div className="w2-cafe__main">
          <div className="w2-cafe__modes">
            {['dinein','takeaway','delivery'].map(m => {
              const avail = c.modes.includes(m);
              return (
                <button key={m} className={`w2-cafe__mode ${mode === m ? 'is-on' : ''}`} onClick={() => avail && onMode(m)} disabled={!avail}>
                  {m === 'dinein' ? 'Dine-in' : m === 'takeaway' ? 'Takeaway' : 'Delivery'}
                </button>
              );
            })}
          </div>

          <div style={{marginBottom:24,padding:'14px 16px',background:'var(--bg-paper)',border:'1px solid var(--border-1)',borderRadius:10,color:'var(--fg-2)',font:'400 13px var(--font-body)',lineHeight:1.55}}>{c.story}</div>

          {/* Sticky category nav */}
          <div className="w2-cafe__catnav">
            {c.menu.map(sect => (
              <button key={sect.section}
                className={`w2-cafe__catchip ${activeSect === sect.section ? 'is-on' : ''}`}
                onClick={() => scrollToSect(sect.section)}>
                {sect.section} <span style={{opacity:.6}}>· {sect.items.length}</span>
              </button>
            ))}
          </div>

          {c.menu.map(sect => (
            <div key={sect.section} id={'cafe-sect-' + sect.section.replace(/\s+/g, '-')} className="w2-cafe__sect">
              <div className="w2-cafe__sect-h">
                <h2 className="w2-cafe__sect-t">{sect.section}</h2>
                <span style={{font:'400 12px var(--font-mono)',color:'var(--fg-3)',letterSpacing:'.04em'}}>{sect.items.length} {sect.items.length === 1 ? 'item' : 'items'}</span>
              </div>
              <div className="w2-cafe__items">
                {sect.items.map(it => {
                  const hasOpts = (it.variants && it.variants.length > 0) || (it.addons && it.addons.length > 0);
                  const qty = itemQtyInCart(it.id);
                  const lineId = lineIdForItem(it.id);
                  return (
                    <div key={it.id} className="w2-cafe__item" onClick={() => hasOpts ? setCustomizing(it) : null}>
                      <div className="w2-cafe__item-body">
                        <div className="w2-cafe__item-name">{it.name}</div>
                        <div className="w2-cafe__item-desc">{it.desc}</div>
                        <div className="w2-cafe__item-price">₹{it.price.toLocaleString()}</div>
                      </div>
                      <div className="w2-cafe__item-img" style={{ backgroundImage:`url(${it.img})` }}>
                        {hasOpts && <div className="w2-cafe__item-customize">Customize</div>}
                        {!hasOpts && qty > 0 ? (
                          <div className="w2-cafe__qty-badge" onClick={e => e.stopPropagation()}>
                            <button onClick={() => onQty(lineId, -1)}>−</button>
                            <span>{qty}</span>
                            <button onClick={() => onQty(lineId, 1)}>+</button>
                          </div>
                        ) : (
                          <button className="w2-cafe__item-add" onClick={e => { e.stopPropagation(); quickAdd(it); }}>+</button>
                        )}
                      </div>
                    </div>
                  );
                })}
              </div>
            </div>
          ))}

          <div className="w2-cafe__sect">
            <div className="w2-cafe__sect-h">
              <h2 className="w2-cafe__sect-t">What people say</h2>
            </div>
            {c.reviews.map((r, i) => (
              <div key={i} style={{padding:'14px 16px',background:'var(--bg-paper)',border:'1px solid var(--border-1)',borderRadius:10,marginBottom:8}}>
                <div style={{display:'flex',justifyContent:'space-between',alignItems:'center'}}>
                  <strong style={{font:'600 13px var(--font-body)',color:'var(--slate-700)'}}>{r.author}</strong>
                  <span style={{font:'500 11px var(--font-mono)',color:'var(--fg-3)'}}>{r.when} · {'★'.repeat(r.stars)}</span>
                </div>
                <div style={{font:'400 13px var(--font-body)',color:'var(--fg-2)',marginTop:6,lineHeight:1.55}}>{r.text}</div>
              </div>
            ))}
          </div>
        </div>

        {/* Right sidebar: cart */}
        <aside className="w2-cafe__sb">
          {cartLines.length === 0 ? (
            <div className="w2-cafe__sb-empty">
              <h4>Your order</h4>
              <p>Add items from the menu — your cart will live here.</p>
            </div>
          ) : (
            <>
              <h3 className="w2-cafe__sb-title">Your <em>order</em></h3>
              <div className="w2-cafe__sb-mode">{mode === 'dinein' ? 'Dine-in' : mode === 'takeaway' ? 'Takeaway' : 'Delivery'}</div>
              {cartLines.map((l, i) => (
                <div key={i} className="w2-cafe-line">
                  <div className="w2-cafe-line__img" style={{ backgroundImage:`url(${l.item.img})` }}/>
                  <div className="w2-cafe-line__body">
                    <div className="w2-cafe-line__name">{l.item.name}</div>
                    {l.customLabel && <div className="w2-cafe-line__custom">{l.customLabel}</div>}
                    <div className="w2-cafe-line__row">
                      <span className="w2-cafe-line__price">₹{(l.unitPrice * l.qty).toLocaleString()}</span>
                      <span className="w2-cafe-line__qty">
                        <button onClick={() => onQty(l.lineId, -1)}>−</button>
                        <span>{l.qty}</span>
                        <button onClick={() => onQty(l.lineId, 1)}>+</button>
                      </span>
                    </div>
                  </div>
                </div>
              ))}
              <div className="w2-cafe__sb-totals">
                <div className="w2-cafe__sb-line"><span>Subtotal</span><span style={{fontFamily:'var(--font-mono)'}}>₹{subtotal.toLocaleString()}</span></div>
                {mode === 'delivery' && <div className="w2-cafe__sb-line"><span>Delivery</span><span style={{fontFamily:'var(--font-mono)'}}>₹{delivery}</span></div>}
                <div className="w2-cafe__sb-line"><span>GST (5%)</span><span style={{fontFamily:'var(--font-mono)'}}>₹{tax.toLocaleString()}</span></div>
                <div className="w2-cafe__sb-line" style={{paddingTop:8,borderTop:'1px dashed var(--border-1)',marginTop:6}}>
                  <strong>Total</strong><strong style={{fontFamily:'var(--font-mono)'}}>₹{total.toLocaleString()}</strong>
                </div>
              </div>
              <div style={{padding:'12px 14px',background:'var(--bone-100)',border:'1px solid var(--border-1)',borderRadius:10,marginTop:12}}>
                <div style={{display:'flex',justifyContent:'space-between',alignItems:'center',font:'600 10.5px var(--font-body)',letterSpacing:'.14em',textTransform:'uppercase',color:'var(--fg-2)',marginBottom:6}}>
                  Special instructions
                  <span style={{font:'500 10px var(--font-body)',padding:'2px 6px',borderRadius:999,background:'rgba(31,59,87,.08)',color:'var(--fg-3)',letterSpacing:'.04em',textTransform:'none'}}>Optional</span>
                </div>
                <textarea
                  value={orderNote} maxLength={200}
                  onChange={e => setOrderNote(e.target.value)}
                  placeholder="Allergies, less spicy, no onion, less butter…"
                  style={{width:'100%',minHeight:54,padding:'8px 10px',borderRadius:8,background:'white',border:'1px solid var(--border-2)',font:'400 13px var(--font-body)',color:'var(--fg-1)',resize:'vertical'}}/>
                <div style={{font:'400 11px var(--font-body)',color:'var(--fg-3)',marginTop:4}}>{orderNote.length}/200 · Sent to the kitchen as-is.</div>
              </div>
              <button className="w2-cafe__sb-cta" onClick={() => onCheckout({ subtotal, delivery, tax, total, mode, note:orderNote.trim() || undefined })}>
                {mode === 'delivery' ? 'Set delivery address →' : mode === 'takeaway' ? 'Pick up at café →' : 'Place order at table →'}
              </button>
            </>
          )}
        </aside>
      </div>

      {customizing && (
        <WebItemCustomize item={customizing}
          onClose={() => setCustomizing(null)}
          onAdd={(detail) => { onAdd(customizing, detail); setCustomizing(null); }}/>
      )}
    </div>
  );
}
window.WebCafeDetail = WebCafeDetail;

function findItem(cafe, id) {
  for (const s of cafe.menu) {
    for (const it of s.items) if (it.id === id) return it;
  }
  return null;
}

// ─── Item customize modal ────────────────────────────────
function WebItemCustomize({ item, onClose, onAdd }) {
  const variants = item.variants || [];
  const addons = item.addons || [];
  const [variantIdx, setVariantIdx] = useStateWCafe(variants.length > 0 ? 0 : -1);
  const [addOnPicks, setAddOnPicks] = useStateWCafe([]);
  const [qty, setQty] = useStateWCafe(1);

  const unit = item.price + (variantIdx >= 0 ? (variants[variantIdx]?.price || 0) : 0) + addOnPicks.reduce((s, i) => s + (addons[i]?.price || 0), 0);
  const total = unit * qty;

  const toggleAddon = (i) => setAddOnPicks(p => p.includes(i) ? p.filter(x => x !== i) : [...p, i]);

  const submit = () => {
    const parts = [];
    if (variantIdx >= 0 && variants[variantIdx]) parts.push(variants[variantIdx].name);
    addOnPicks.forEach(i => parts.push('+ ' + addons[i].name));
    onAdd({ unitPrice:unit, qty, customLabel:parts.join(' · ') });
  };

  return (
    <div className="w2-cust-back" onClick={onClose}>
      <div className="w2-cust" onClick={e => e.stopPropagation()}>
        <div className="w2-cust__img" style={{ backgroundImage:`url(${item.img})` }}/>
        <div className="w2-cust__body">
          <h2 className="w2-cust__title">{item.name}</h2>
          <div className="w2-cust__desc">{item.desc}</div>

          {variants.length > 0 && (
            <div className="w2-cust__group">
              <div className="w2-cust__group-l">Choose one</div>
              <div className="w2-cust__opts">
                {variants.map((v, i) => (
                  <button key={i} className={`w2-cust__opt ${variantIdx === i ? 'is-on' : ''}`} onClick={() => setVariantIdx(i)}>
                    {v.name}
                    <span>{v.price > 0 ? `+₹${v.price}` : 'Included'}</span>
                  </button>
                ))}
              </div>
            </div>
          )}

          {addons.length > 0 && (
            <div className="w2-cust__group">
              <div className="w2-cust__group-l">Add ons</div>
              <div className="w2-cust__opts">
                {addons.map((a, i) => (
                  <button key={i} className={`w2-cust__opt ${addOnPicks.includes(i) ? 'is-on' : ''}`} onClick={() => toggleAddon(i)}>
                    {a.name}<span>+₹{a.price}</span>
                  </button>
                ))}
              </div>
            </div>
          )}
        </div>
        <div className="w2-cust__foot">
          <div className="w2-cust__qty">
            <button onClick={() => setQty(q => Math.max(1, q - 1))}>−</button>
            <span>{qty}</span>
            <button onClick={() => setQty(q => q + 1)}>+</button>
          </div>
          <button className="w2-cust__add" onClick={submit}>Add · ₹{total.toLocaleString()}</button>
        </div>
      </div>
    </div>
  );
}
window.WebItemCustomize = WebItemCustomize;

// ─── Address selector modal ──────────────────────────────
function WebAddressSelector({ addresses, selectedId, title, subtitle, onPick, onAdd, onClose, ctaLabel = 'Continue' }) {
  const [pick, setPick] = useStateWCafe(selectedId || addresses.find(a => a.isDefault)?.id || addresses[0]?.id);
  const [mode, setMode] = useStateWCafe('list');  // 'list' | 'new'
  const [draft, setDraft] = useStateWCafe({ label:'Home', name:'', phone:'', line1:'', line2:'', city:'', state:'', pincode:'' });

  if (mode === 'new') {
    const valid = draft.name && draft.phone && draft.line1 && draft.city && draft.pincode;
    return (
      <div className="w2-addr-back" onClick={onClose}>
        <div className="w2-addr" onClick={e => e.stopPropagation()}>
          <div className="w2-addr__lbl">Add new address</div>
          <h2 className="w2-addr__title">Where should we <em>deliver?</em></h2>
          <div className="w2-addr__sub">Drop a pin so the courier (or café cook) finds you fast.</div>
          <div className="w2-addrf__pin">
            <div className="w2-addrf__pin-dot"/>
          </div>
          <div className="w2-addrf__row">
            <div className="w2-addrf__field">
              <label className="w2-addrf__field-l">Label</label>
              <select className="w2-addrf__input" value={draft.label} onChange={e => setDraft(d => ({ ...d, label:e.target.value }))}>
                {['Home','Office','Other'].map(o => <option key={o}>{o}</option>)}
              </select>
            </div>
            <div className="w2-addrf__field">
              <label className="w2-addrf__field-l">Phone</label>
              <input className="w2-addrf__input" placeholder="+91 …" value={draft.phone} onChange={e => setDraft(d => ({ ...d, phone:e.target.value }))}/>
            </div>
          </div>
          <div className="w2-addrf__field" style={{marginBottom:10}}>
            <label className="w2-addrf__field-l">Full name</label>
            <input className="w2-addrf__input" value={draft.name} onChange={e => setDraft(d => ({ ...d, name:e.target.value }))}/>
          </div>
          <div className="w2-addrf__field" style={{marginBottom:10}}>
            <label className="w2-addrf__field-l">Address line 1</label>
            <input className="w2-addrf__input" value={draft.line1} onChange={e => setDraft(d => ({ ...d, line1:e.target.value }))}/>
          </div>
          <div className="w2-addrf__field" style={{marginBottom:10}}>
            <label className="w2-addrf__field-l">Address line 2 (optional)</label>
            <input className="w2-addrf__input" value={draft.line2} onChange={e => setDraft(d => ({ ...d, line2:e.target.value }))}/>
          </div>
          <div className="w2-addrf__row">
            <div className="w2-addrf__field">
              <label className="w2-addrf__field-l">City</label>
              <input className="w2-addrf__input" value={draft.city} onChange={e => setDraft(d => ({ ...d, city:e.target.value }))}/>
            </div>
            <div className="w2-addrf__field">
              <label className="w2-addrf__field-l">Pincode</label>
              <input className="w2-addrf__input" value={draft.pincode} onChange={e => setDraft(d => ({ ...d, pincode:e.target.value }))}/>
            </div>
          </div>
          <div className="w2-addr__actions">
            <button className="w2-addr__cancel" onClick={() => setMode('list')}>← Back</button>
            <button className="w2-addr__continue" disabled={!valid} style={!valid ? { opacity:.5, cursor:'not-allowed' } : null}
              onClick={() => { onAdd({ ...draft, id:'a' + Date.now() }); setMode('list'); }}>Save address</button>
          </div>
        </div>
      </div>
    );
  }

  return (
    <div className="w2-addr-back" onClick={onClose}>
      <div className="w2-addr" onClick={e => e.stopPropagation()}>
        <div className="w2-addr__lbl">{title || 'Select address'}</div>
        <h2 className="w2-addr__title">Where do we send it?</h2>
        <div className="w2-addr__sub">{subtitle || 'Pick a saved address, or add a new one.'}</div>
        {addresses.length === 0 && (
          <div style={{padding:'24px 16px',textAlign:'center',color:'var(--fg-3)',background:'var(--bone-100)',borderRadius:10,marginBottom:12}}>
            No addresses saved yet. Add your first below.
          </div>
        )}
        {addresses.map(a => (
          <div key={a.id} className={`w2-addr-card ${pick === a.id ? 'is-on' : ''}`} onClick={() => setPick(a.id)}>
            <div className="w2-addr-card__radio"/>
            <div className="w2-addr-card__body">
              <div className="w2-addr-card__label">
                <span>{a.label}</span>
                {a.isDefault && <span className="w2-addr-card__label-tag">Default</span>}
              </div>
              <div className="w2-addr-card__name">{a.name}</div>
              <div className="w2-addr-card__addr">{a.line1}{a.line2 ? `, ${a.line2}` : ''}<br/>{a.city}, {a.state} · {a.pincode}</div>
              <div className="w2-addr-card__phone">{a.phone}</div>
            </div>
            <button className="w2-addr-card__edit" onClick={e => { e.stopPropagation(); /* edit not wired */ }}>Edit</button>
          </div>
        ))}
        <button className="w2-addr__addnew" onClick={() => setMode('new')}>+ Add new address</button>
        <div className="w2-addr__actions">
          <button className="w2-addr__cancel" onClick={onClose}>Cancel</button>
          <button className="w2-addr__continue" disabled={!pick} onClick={() => onPick(pick)}>{ctaLabel} →</button>
        </div>
      </div>
    </div>
  );
}
window.WebAddressSelector = WebAddressSelector;
