// chrome.jsx — Header, Footer, AgeGate, Notice
// Mad Smokes site — fork of UI kit

function Notice({ shipFree }) {
  const msg = shipFree === 'free' ? '★ FREE SHIP OVER $200 ★ TRACKED + ANONYMOUS ★ TYENDINAGA → YOUR DOOR ★ 18+ ONLY ★'
            : shipFree === 'flat' ? '★ FLAT $15 SHIPPING ★ TRACKED + ANONYMOUS ★ TYENDINAGA → YOUR DOOR ★ 18+ ONLY ★'
            : '★ TRACKED + ANONYMOUS ★ TYENDINAGA → YOUR DOOR ★ 18+ ONLY ★';
  if (shipFree === 'none') return null;
  return <div className="notice">{msg}</div>;
}

// Helper — intercept link clicks so SPA routing handles them but the underlying href
// stays correct for middle-click / open-in-new-tab / right-click "copy link" / SEO crawlers.
function navLink(href, onNav, label, extraProps = {}) {
  const handle = (e) => {
    // Let modifier keys (cmd/ctrl/shift) and middle-click open in new tab natively
    if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return;
    e.preventDefault();
    onNav();
  };
  return React.createElement('a', { href, onClick: handle, ...extraProps }, label);
}

// Data-driven "Shop by category" dropdown. Reads window.CATEGORIES (product
// types with stock) and renders nothing until categories exist, so a single-type
// catalog shows no empty menu.
function CategoriesMenu({ onNav, active }) {
  const [open, setOpen] = React.useState(false);
  const cats = window.CATEGORIES || [];
  if (!cats.length) return null;
  return (
    <div style={{position:'relative', display:'inline-block'}}>
      <a href="/shop" className={active==='producttype' ? 'active' : ''} aria-haspopup="true" aria-expanded={open}
         onClick={(e)=>{ e.preventDefault(); setOpen(o=>!o); }} style={{cursor:'pointer'}}>
        Categories <span style={{fontSize:9}}>▾</span>
      </a>
      {open && (
        <>
          <div onClick={()=>setOpen(false)} style={{position:'fixed', inset:0, zIndex:40}}/>
          <div role="menu" style={{position:'absolute', top:'100%', left:0, marginTop:10, zIndex:41,
               background:'#1b1a13', border:'1px solid rgba(255,255,255,.12)', borderRadius:10,
               padding:6, minWidth:210, boxShadow:'0 14px 40px rgba(0,0,0,.55)'}}>
            {cats.map(c => (
              <a key={c.slug} href={'/category/' + c.slug} role="menuitem"
                 onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey||e.button===1) return; e.preventDefault(); setOpen(false); onNav('producttype', { slug: c.slug }); }}
                 style={{display:'flex', justifyContent:'space-between', alignItems:'center', gap:16,
                         padding:'9px 12px', borderRadius:6, color:'var(--bone)', textDecoration:'none', fontSize:13}}
                 onMouseEnter={e=>{ e.currentTarget.style.background='rgba(212,245,55,.12)'; }}
                 onMouseLeave={e=>{ e.currentTarget.style.background='transparent'; }}>
                <span>{c.name}</span>
                <span style={{color:'var(--smoke-400)', fontFamily:'var(--font-mono)', fontSize:11}}>{c.product_count}</span>
              </a>
            ))}
          </div>
        </>
      )}
    </div>
  );
}

function Header({ ageVerified, cartCount, active, onCartOpen, onNav, onSearch, user, onMobileMenu }) {
  const isAdmin = user && (user.role === 'admin' || user.role === 'staff');
  const displayName = user
    ? (user.display_name || user.first_name || user.email.split('@')[0])
    : null;

  return (
    <header className="site-header">
      <div className="shell header-grid">
        <button
          className="hamburger-btn"
          aria-label="Open menu"
          onClick={onMobileMenu}
          type="button"
        >
          <i data-lucide="menu"></i>
        </button>

        <nav className="nav nav-left" aria-label="Main">
          <a href="/shop" className={active==='shop' ? 'active' : ''}
             onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey) return; e.preventDefault(); onNav('shop'); }}>Shop</a>
          <CategoriesMenu onNav={onNav} active={active}/>
          <a href="/brands" className={active==='brands' ? 'active' : ''}
             onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey) return; e.preventDefault(); onNav('brands'); }}>Brands</a>
          <a href="/faq" className={active==='faq' ? 'active' : ''}
             onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey) return; e.preventDefault(); onNav('faq'); }}>FAQ</a>
          <a href="/track" className={active==='track' ? 'active' : ''}
             onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey) return; e.preventDefault(); onNav('track'); }}>Track</a>
          {isAdmin && (
            <a href="/admin" target="_blank" rel="noreferrer"
               style={{color:'var(--acid)', borderBottom:'2px solid var(--acid)', paddingBottom:1}}>
              CMS ↗
            </a>
          )}
        </nav>

        <a href="/" className="brand-mark brand-center"
           onClick={(e)=>{ if (e.metaKey||e.ctrlKey||e.shiftKey) return; e.preventDefault(); onNav('home'); }}>
          <img src="assets/logo-lockup.png" alt="MAD SMOKES" />
        </a>

        <div className="header-tools">
          {ageVerified && <span className="age-chip">18+ Verified</span>}
          <button type="button" className="icon-btn" aria-label="Search" onClick={onSearch}><i data-lucide="search"></i></button>
          {user ? (
            <button
              type="button"
              className="icon-btn"
              aria-label="Account"
              onClick={()=>onNav('account')}
              style={{display:'flex', alignItems:'center', gap:5, fontSize:12, fontWeight:700,
                      fontFamily:'var(--font-ui)', color:'var(--acid)', padding:'6px 8px'}}
            >
              <i data-lucide="user"></i>
              <span style={{textTransform:'uppercase', letterSpacing:'.06em'}}>{displayName}</span>
            </button>
          ) : (
            <button type="button" className="icon-btn" aria-label="Sign in" onClick={()=>onNav('account')}>
              <i data-lucide="user"></i>
            </button>
          )}
          <button type="button" className="cart-pill" aria-label={`Cart (${cartCount} items)`} onClick={onCartOpen}>
            <i data-lucide="shopping-bag"></i>
            <span>{cartCount}</span>
          </button>
        </div>
      </div>
    </header>
  );
}

function navHandler(href, onNav) {
  return (e) => {
    if (e.metaKey || e.ctrlKey || e.shiftKey || e.button === 1) return;
    e.preventDefault();
    onNav();
  };
}

function Footer({ onNav }) {
  const year = new Date().getFullYear();
  return (
    <footer className="site-footer">
      <div className="shell">
        <div className="cols">
          <div>
            <div className="brand-mark" style={{marginBottom: 12}}>
              <img src="assets/logo-lockup.png" alt="MAD SMOKES" style={{height: 64}}/>
            </div>
            <p style={{fontSize: 12, lineHeight: 1.6, maxWidth: 320}}>
              Native tobacco shipped from Tyendinaga Mohawk Territory. Adults only. Anonymous shipping, no signature, no markings.
            </p>
          </div>
          <div>
            <h5>Shop</h5>
            <a href="/shop" onClick={navHandler('/shop', ()=>onNav('shop'))}>All products</a>
            {(window.CATEGORIES || []).map(c => (
              <a key={c.slug} href={'/category/' + c.slug} onClick={navHandler('/category/' + c.slug, ()=>onNav('producttype', { slug: c.slug }))}>{c.name}</a>
            ))}
            <a href="/brands" onClick={navHandler('/brands', ()=>onNav('brands'))}>Brands</a>
          </div>
          <div>
            <h5>Help</h5>
            <a href="/faq" onClick={navHandler('/faq', ()=>onNav('faq'))}>FAQ</a>
            <a href="/track" onClick={navHandler('/track', ()=>onNav('track'))}>Track order</a>
            <a href="/faq" onClick={navHandler('/faq', ()=>onNav('faq'))}>Shipping</a>
            <a href="/faq" onClick={navHandler('/faq', ()=>onNav('faq'))}>Contact</a>
          </div>
          <div>
            <h5>Account</h5>
            <a href="/account" onClick={navHandler('/account', ()=>onNav('account'))}>Sign in</a>
            <a href="/account" onClick={navHandler('/account', ()=>onNav('account'))}>Orders</a>
            <a href="/account" onClick={navHandler('/account', ()=>onNav('account'))}>Addresses</a>
          </div>
        </div>
        <div className="legal">
          <p>© Mad Smokes {year}. All sales final. Customers must be of legal smoking age in their province (18+ AB/MB/QC, 19+ elsewhere). Anonymous shipping — no ID at delivery. Smoking is harmful to health.</p>
        </div>
      </div>
    </footer>
  );
}

function MobileMenu({ open, onClose, onNav, isAdmin, user }) {
  if (!open) return null;
  const go = (view) => () => { onNav(view); onClose(); };
  const displayName = user ? (user.display_name || user.first_name || user.email.split('@')[0]) : null;
  return (
    <>
      <div className="drawer-scrim" onClick={onClose}/>
      <aside className="mobile-menu" aria-label="Mobile navigation">
        <header>
          <span style={{fontFamily:'var(--font-display)', fontSize: 22, color: 'var(--acid)', textTransform:'uppercase'}}>Menu</span>
          <button type="button" className="icon-btn" aria-label="Close menu" onClick={onClose} style={{color:'var(--bone)'}}>
            <i data-lucide="x"></i>
          </button>
        </header>
        <nav className="mobile-menu-nav">
          <a href="/" onClick={navHandler('/', go('home'))}>Home</a>
          <a href="/shop" onClick={navHandler('/shop', go('shop'))}>Shop</a>
          {(window.CATEGORIES || []).map(c => (
            <a key={c.slug} href={'/category/' + c.slug}
               onClick={navHandler('/category/' + c.slug, () => { onNav('producttype', { slug: c.slug }); onClose(); })}
               style={{paddingLeft: 18, fontSize: 15, opacity: .8}}>{c.name}</a>
          ))}
          <a href="/brands" onClick={navHandler('/brands', go('brands'))}>Brands</a>
          <a href="/faq" onClick={navHandler('/faq', go('faq'))}>FAQ</a>
          <a href="/track" onClick={navHandler('/track', go('track'))}>Track order</a>
          <a href="/account" onClick={navHandler('/account', go('account'))}>
            {user ? `Account — ${displayName}` : 'Sign in / register'}
          </a>
          {isAdmin && (
            <a href="/admin" target="_blank" rel="noreferrer" style={{color:'var(--acid)'}}>CMS ↗</a>
          )}
        </nav>
      </aside>
    </>
  );
}

function AgeGate({ onAccept, onDecline }) {
  const [hover, setHover] = React.useState(false);
  return (
    <div className="scrim" style={{backdropFilter:'none'}}>
      <div className="modal" style={{maxWidth: 520, transform:'rotate(-1deg)', boxShadow:'var(--shadow-sticker-lg)'}}>
        <div style={{position:'relative', height: 130, marginBottom: 8}}>
          <img
            src="assets/skull-icon.png"
            alt=""
            className="skull"
            onMouseEnter={()=>setHover(true)}
            onMouseLeave={()=>setHover(false)}
            style={{
              height: 130, margin: '0 auto', display: 'block',
              transition: 'transform .4s cubic-bezier(.6,-0.4,.3,1.4)',
              transform: hover ? 'rotate(-8deg) scale(1.08)' : 'rotate(0) scale(1)',
              animation: 'smokeWiggle 5s ease-in-out infinite',
              filter:'drop-shadow(4px 4px 0 var(--ink))'
            }}
          />
          {/* puff badges */}
          <span className="deco-sticker ember" style={{top: 0, right: 0, transform:'rotate(8deg)'}}>18+</span>
          <span className="deco-sticker bone" style={{top: 60, left: 0, transform:'rotate(-12deg)', fontSize:11}}>NO ID NEEDED</span>
        </div>
        <h2 style={{textAlign:'center'}}>Are you 18 or older?</h2>
        <p style={{textAlign:'center', marginTop: 8, fontFamily:'var(--font-ui)'}}>
          This site sells tobacco. By entering, you confirm you're of legal smoking age in your province.
        </p>
        <div style={{display:'flex', gap: 12, marginTop: 24}}>
          <button className="btn btn-primary btn-block btn-lg" onClick={onAccept}>Yeah, let me in</button>
          <button className="btn btn-ghost btn-block" style={{borderColor:'var(--ink)', color:'var(--ink)'}} onClick={onDecline}>Nope, I'll go</button>
        </div>
        <p style={{fontSize: 11, marginTop: 18, color: 'var(--smoke-400)', textAlign:'center'}}>
          We don't sell to minors. Smoking is harmful to health.
        </p>
      </div>
    </div>
  );
}

// ---- Social proof toast ----
// Rotating "Jordan in Toronto bought Canadians Light" toaster.
// Pulls from /api/social-proof. Dismissible — suppressed for 24h after × click.

const SOCIAL_PROOF_DISMISS_KEY = 'ms_sp_dismissed_at';
const SOCIAL_PROOF_DISMISS_TTL = 24 * 60 * 60 * 1000; // 24h
const SOCIAL_PROOF_FIRST_DELAY = 8000;    // 8s after page load before first toast
const SOCIAL_PROOF_VISIBLE_MS = 6000;     // each toast visible for 6s
const SOCIAL_PROOF_GAP_MS = 12000;        // 12s gap between toasts

function timeAgo(iso) {
  if (!iso) return 'just now';
  const ms = Date.now() - new Date(iso).getTime();
  const s = Math.max(1, Math.floor(ms / 1000));
  if (s < 60) return `${s}s ago`;
  const m = Math.floor(s / 60);
  if (m < 60) return `${m} min ago`;
  const h = Math.floor(m / 60);
  if (h < 24) return `${h}h ago`;
  const d = Math.floor(h / 24);
  return `${d}d ago`;
}

function SocialProofToast({ onOpenProduct }) {
  const [feed, setFeed] = React.useState([]);
  const [idx, setIdx] = React.useState(0);
  const [visible, setVisible] = React.useState(false);
  const [dismissed, setDismissed] = React.useState(false);

  // Suppress if user dismissed recently
  React.useEffect(() => {
    try {
      const raw = localStorage.getItem(SOCIAL_PROOF_DISMISS_KEY);
      if (raw && Date.now() - parseInt(raw, 10) < SOCIAL_PROOF_DISMISS_TTL) {
        setDismissed(true);
      }
    } catch (_) {}
  }, []);

  // Fetch feed (once per page load)
  React.useEffect(() => {
    if (dismissed) return;
    window.api.get('/social-proof')
      .then(r => {
        if (r?.feed?.length) setFeed(r.feed);
      })
      .catch(() => {});
  }, [dismissed]);

  // Cycle through entries
  React.useEffect(() => {
    if (dismissed || !feed.length) return;
    let cancelled = false;
    let showT, hideT;

    const showNext = (startIdx) => {
      if (cancelled) return;
      setIdx(startIdx);
      setVisible(true);
      hideT = setTimeout(() => {
        if (cancelled) return;
        setVisible(false);
        showT = setTimeout(() => showNext((startIdx + 1) % feed.length), SOCIAL_PROOF_GAP_MS);
      }, SOCIAL_PROOF_VISIBLE_MS);
    };

    const first = setTimeout(() => showNext(0), SOCIAL_PROOF_FIRST_DELAY);

    return () => {
      cancelled = true;
      clearTimeout(first); clearTimeout(showT); clearTimeout(hideT);
    };
  }, [feed, dismissed]);

  const dismiss = () => {
    setVisible(false);
    setDismissed(true);
    try { localStorage.setItem(SOCIAL_PROOF_DISMISS_KEY, String(Date.now())); } catch (_) {}
  };

  if (dismissed || !feed.length) return null;
  const entry = feed[idx];
  if (!entry) return null;

  const handleClick = (e) => {
    if (!entry.product_slug) return;
    // Don't intercept the dismiss button
    if (e.target.closest('.sp-dismiss')) return;
    const p = (window.PRODUCTS || []).find(x => x.slug === entry.product_slug);
    if (p && onOpenProduct) onOpenProduct(p);
  };

  return (
    <div
      className={'social-proof-toast' + (visible ? ' is-visible' : '')}
      onClick={handleClick}
      role="status"
      aria-live="polite"
      style={{cursor: entry.product_slug ? 'pointer' : 'default'}}
    >
      <div className="sp-icon" aria-hidden="true">
        <i data-lucide="shopping-bag"></i>
      </div>
      <div className="sp-body">
        <div className="sp-line">
          <strong>{entry.name}</strong>
          {entry.city ? <span style={{color:'var(--smoke-300)'}}> in {entry.city}{entry.province ? `, ${entry.province}` : ''}</span> : null}
        </div>
        <div className="sp-line-2">
          just grabbed <strong style={{color:'var(--acid)'}}>{entry.product}</strong>
        </div>
        <div className="sp-meta">{timeAgo(entry.when) || 'recently'}</div>
      </div>
      <button
        type="button"
        className="sp-dismiss"
        onClick={dismiss}
        aria-label="Dismiss social proof notifications"
      >
        ×
      </button>
    </div>
  );
}

window.Notice = Notice;
window.Header = Header;
window.Footer = Footer;
window.MobileMenu = MobileMenu;
window.AgeGate = AgeGate;
window.SocialProofToast = SocialProofToast;
