/* === Page-level components === */

// === Mobile nav dropdown ===
const MobileNavDropdown = ({ label, icon, items, route, onSelect }) => {
  const [open, setOpen] = useState(false);
  return (
    <div className="mnav-dropdown">
      <button className="mobile-nav-link" onClick={() => setOpen(!open)}>
        <span className="mnav-icon">{icon}</span>
        <span style={{flex:1}}>{label}</span>
        <span className={`mnav-chevron ${open ? 'open' : ''}`}>
          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
            <polyline points="6 9 12 15 18 9"/>
          </svg>
        </span>
      </button>
      <div className={`mnav-sub ${open ? 'open' : ''}`}>
        {items.map(item => (
          <button key={item.id}
            className={`mnav-sub-link ${route === item.id ? 'active' : ''}`}
            onClick={() => onSelect(item.id)}>
            <span>{item.label}</span>
            {item.count != null && <span className="mnav-cnt">{item.count}</span>}
          </button>
        ))}
      </div>
    </div>
  );
};

// === Header ===
const Header = ({ route, navigate, cartCount, lang, setLang, showNoticeBar = true, storeName, noticeText }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [mobileOpen, setMobileOpen] = useState(false);
  const [searchOpen, setSearchOpen] = useState(false);
  const [searchQ, setSearchQ] = useState('');
  const searchRef = useRef(null);

  useEffect(() => {
    if (searchOpen && searchRef.current) searchRef.current.focus();
  }, [searchOpen]);

  const searchResults = useMemo(() => {
    if (!searchQ || searchQ.length < 1) return [];
    const q = searchQ.toLowerCase().trim();
    const words = q.split(/\s+/);
    return PRODUCTS.filter(p => {
      const haystack = (p.brand + ' ' + p.plan + ' ' + p.category + ' ' + (BRAND_AR_ALIASES[p.brand] || '')).toLowerCase();
      return words.every(w => haystack.includes(w));
    }).sort((a, b) => {
      const aStart = a.brand.toLowerCase().startsWith(q) ? 0 : 1;
      const bStart = b.brand.toLowerCase().startsWith(q) ? 0 : 1;
      return aStart - bStart;
    }).slice(0, 12);
  }, [searchQ]);

  const navItems = [
  { id: 'home', ar: 'الرئيسية', en: 'Home' },
  { id: 'catalog', ar: 'كل الباقات', en: 'All Plans' },
  { id: 'cat:ai', ar: 'الذكاء الاصطناعي', en: 'AI & Chat' },
  { id: 'cat:design', ar: 'تصميم', en: 'Design' },
  { id: 'cat:stream', ar: 'بث وترفيه', en: 'Streaming' },
  { id: 'cat:games', ar: 'ألعاب', en: 'Games' },
  { id: 'cat:code', ar: 'برمجة', en: 'Coding' },
  { id: 'cat:cards', ar: 'بطاقات', en: 'Gift Cards' }];

  const mobileNav = (to) => { setMobileOpen(false); navigate(to); };
  const displayStoreName = storeName || t('AI اشتراكات', 'AI Subscriptions');
  const displayNotice = noticeText || t('تسليم خلال 30 دقيقة • أمان كامل • دعم فني 24/7', '30-min delivery · Secure · 24/7 support');

  return (
    <>
      {showNoticeBar &&
      <div className="notice-bar">
          <span>⚡ {displayNotice}</span>
        </div>
      }
      <header className="site-header">
        <div className="header-inner">
          <button className="hamburger-btn" onClick={() => setMobileOpen(true)} aria-label="Menu">
            <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><path d="M4 7h16M4 12h16M4 17h16"/></svg>
          </button>
          <a className="logo" onClick={(e) => {e.preventDefault();navigate('home');}} href="#">
            <div className="logo-mark" style={{ fontFamily: "Inter" }}>AI</div>
            <div className="logo-text">
              <span className="ar">{displayStoreName}</span>
              <span className="en">PREMIUM</span>
            </div>
          </a>
          <nav className="main-nav">
            {navItems.map((item) => {
              const isActive = route === item.id || item.id === 'catalog' && route === 'catalog';
              return (
                <button key={item.id}
                className={`nav-link ${isActive ? 'active' : ''}`}
                onClick={() => navigate(item.id)}>
                  {t(item.ar, item.en)}
                </button>);

            })}
          </nav>
          <div className="header-actions">
            <button className="icon-btn" title={t('بحث', 'Search')} onClick={() => { setSearchOpen(!searchOpen); setSearchQ(''); }}>
              <Icon name="search" size={20} />
            </button>
            <button className="lang-toggle" onClick={() => setLang(lang === 'ar' ? 'en' : 'ar')}>
              {lang === 'ar' ? 'EN' : 'ع'}
            </button>
            <button className="icon-btn" title={t('السلة', 'Cart')} onClick={() => navigate('cart')}>
              <Icon name="cart" size={20} />
              {cartCount > 0 && <span className="badge">{cartCount}</span>}
            </button>
          </div>
        </div>
        {/* Search overlay */}
        {searchOpen && (
          <div className="header-search">
            <div className="header-search-inner">
              <Icon name="search" size={18} />
              <input ref={searchRef} value={searchQ} onChange={(e) => setSearchQ(e.target.value)}
                placeholder={t('ابحث عن براند أو باقة...', 'Search brand or plan...')}
                onKeyDown={(e) => { if (e.key === 'Escape') { setSearchOpen(false); setSearchQ(''); } }}
              />
              <button className="close-btn" onClick={() => { setSearchOpen(false); setSearchQ(''); }} style={{width:28, height:28}}>
                <Icon name="close" size={14} />
              </button>
            </div>
            {searchQ.length >= 1 && (
              <div className="header-search-results">
                {searchResults.length === 0 ? (
                  <div style={{ padding: '20px 16px', textAlign: 'center', color: 'var(--ink-3)', fontSize: 13 }}>
                    {t('مفيش نتائج', 'No results')}
                  </div>
                ) : searchResults.map(p => (
                  <div key={p.id} className="header-search-hit"
                    onClick={() => { setSearchOpen(false); setSearchQ(''); navigate('brand:' + slugify(p.brand)); }}>
                    <ThumbSm brand={p.brand} color={p.color} glyph={p.glyph} size={40} />
                    <div style={{ flex: 1, minWidth: 0 }}>
                      <div style={{ fontWeight: 700, fontSize: 14 }}>{p.brand}</div>
                      <div style={{ fontSize: 12, color: 'var(--ink-3)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{displayPlanName(p, lang)} · {tBilling(p.billing, lang)}</div>
                    </div>
                  </div>
                ))}
              </div>
            )}
          </div>
        )}
      </header>
      {mobileOpen && (
        <>
          <div className="mobile-nav-backdrop" onClick={() => setMobileOpen(false)}/>
          <div className="mobile-nav-drawer">
            <div className="mobile-nav-head">
              <a className="logo" onClick={(e) => {e.preventDefault(); mobileNav('home');}} href="#">
                <div className="logo-mark" style={{ fontFamily: "Inter" }}>AI</div>
                <div className="logo-text">
                  <span className="ar">{displayStoreName}</span>
                  <span className="en">PREMIUM</span>
                </div>
              </a>
              <button className="close-btn" onClick={() => setMobileOpen(false)}>
                <Icon name="close" size={18}/>
              </button>
            </div>
            <div className="mobile-nav-body">
              {/* Mobile search */}
              <div className="mnav-search">
                <Icon name="search" size={16} />
                <input value={searchQ} onChange={(e) => setSearchQ(e.target.value)}
                  placeholder={t('ابحث عن براند أو باقة...', 'Search brand or plan...')} />
              </div>
              {searchQ.length >= 1 && (
                <div className="mnav-search-results">
                  {searchResults.length === 0 ? (
                    <div style={{ padding: '12px 16px', textAlign: 'center', color: 'var(--ink-3)', fontSize: 13 }}>
                      {t('مفيش نتائج', 'No results')}
                    </div>
                  ) : searchResults.map(p => (
                    <div key={p.id} className="header-search-hit"
                      onClick={() => { setSearchQ(''); mobileNav('brand:' + slugify(p.brand)); }}>
                      <ThumbSm brand={p.brand} color={p.color} glyph={p.glyph} size={36} />
                      <div style={{ flex: 1, minWidth: 0 }}>
                        <div style={{ fontWeight: 700, fontSize: 13 }}>{p.brand}</div>
                        <div style={{ fontSize: 11, color: 'var(--ink-3)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{displayPlanName(p, lang)} · {tBilling(p.billing, lang)}</div>
                      </div>
                    </div>
                  ))}
                </div>
              )}
              {/* Main nav */}
              <button className={`mobile-nav-link ${route === 'home' ? 'active' : ''}`}
                onClick={() => mobileNav('home')}>
                <span className="mnav-icon">🏠</span>
                <span>{t('الرئيسية', 'Home')}</span>
              </button>
              <button className={`mobile-nav-link ${route === 'catalog' ? 'active' : ''}`}
                onClick={() => mobileNav('catalog')}>
                <span className="mnav-icon">📦</span>
                <span>{t('كل الباقات', 'All Plans')}</span>
              </button>

              {/* Categories dropdown */}
              <MobileNavDropdown
                label={t('تصفح الفئات', 'Browse Categories')}
                icon="📂"
                items={CATEGORIES.map(c => ({
                  id: 'cat:' + c.id,
                  label: t(c.ar, c.en),
                  count: PRODUCTS.filter(p => p.category === c.match).length
                }))}
                route={route}
                onSelect={mobileNav}
              />

              <div className="mnav-divider"/>

              {/* Cart */}
              <button className="mobile-nav-link" onClick={() => mobileNav('cart')}>
                <span className="mnav-icon">🛒</span>
                <span style={{flex:1}}>{t('السلة', 'Cart')}</span>
                {cartCount > 0 && <span className="badge" style={{position:'static'}}>{cartCount}</span>}
              </button>

              <div className="mnav-divider"/>

              {/* Lang toggle */}
              <button className="mobile-nav-link" onClick={() => setLang(lang === 'ar' ? 'en' : 'ar')}>
                <span className="mnav-icon">🌐</span>
                <span>{lang === 'ar' ? 'English' : 'عربي'}</span>
              </button>
            </div>
            <div className="mobile-nav-foot">
              <a href={WA_LINK} target="_blank" rel="noopener" className="mnav-wa-btn"
                onClick={(e) => guardWhatsAppOpen(e, WA_LINK, lang, { source: 'mobile_nav' })}>
                <Icon name="wa" size={20}/> {t('تواصل معنا واتساب', 'Chat on WhatsApp')}
              </a>
              <div style={{textAlign:'center', marginTop:10, fontSize:11, color:'var(--ink-3)'}}>
                +20 15 51724428
              </div>
            </div>
          </div>
        </>
      )}
    </>);

};

// === Footer ===
const Footer = ({ lang, navigate }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  return (
    <footer className="footer">
      <div className="footer-inner">
        <div>
          <a className="logo" href="#" onClick={(e) => {e.preventDefault();navigate('home');}}>
            <div className="logo-mark">A</div>
            <div className="logo-text">
              <span className="ar">{t(<><span style={{unicodeBidi:'isolate', direction:'ltr'}}>AI اشتراكات</span></>, 'AI Subscriptions')}</span>
              <span className="en">PREMIUM</span>
            </div>
          </a>
          <p style={{ color: 'var(--ink-2)', fontSize: 14, lineHeight: 1.7, marginTop: 14, maxWidth: 320 }}>
            {t(
              'متجرك الموثوق للاشتراكات الرقمية في مصر — تسليم خلال 30 دقيقة، أسعار منافسة، ودعم على مدار الساعة.',
              'Your trusted store for digital subscriptions in Egypt — 30-min delivery, fair prices, 24/7 support.'
            )}
          </p>
          <div className="social-row">
            <a href="https://www.facebook.com/profile.php?id=61569250712286" target="_blank" rel="noopener" title="Facebook">
              <Icon name="fb" size={18} />
            </a>
            <a href={WA_LINK} target="_blank" rel="noopener" title="WhatsApp"
              onClick={(e) => guardWhatsAppOpen(e, WA_LINK, lang, { source: 'footer_social' })}>
              <Icon name="wa" size={18} />
            </a>
          </div>
        </div>
        <div>
          <h4>{t('التصفح', 'Shop')}</h4>
          <ul>
            {CATEGORIES.map((c) =>
            <li key={c.id}><a href="#" onClick={(e) => {e.preventDefault();navigate('cat:' + c.id);}}>{t(c.ar, c.en)}</a></li>
            )}
            <li><a href="#" onClick={(e) => {e.preventDefault();navigate('catalog');}}>{t('كل الباقات', 'All Plans')}</a></li>
          </ul>
        </div>
        <div>
          <h4>{t('الدعم', 'Support')}</h4>
          <ul>
            <li><a href={WA_LINK} target="_blank" rel="noopener"
              onClick={(e) => guardWhatsAppOpen(e, WA_LINK, lang, { source: 'footer_support' })}>{t('واتساب', 'WhatsApp')} +20 15 51724428</a></li>
            <li><a href="https://www.facebook.com/profile.php?id=61569250712286" target="_blank" rel="noopener">{t('فيسبوك', 'Facebook')}</a></li>
            <li><a href="#" onClick={(e) => e.preventDefault()}>{t('الأسئلة الشائعة', 'FAQ')}</a></li>
            <li><a href="#" onClick={(e) => e.preventDefault()}>{t('سياسة الاسترداد', 'Refund Policy')}</a></li>
            <li><a href="#" onClick={(e) => e.preventDefault()}>{t('الشروط والأحكام', 'Terms')}</a></li>
          </ul>
        </div>
        <div>
          <h4>{t('طرق الدفع', 'Payments')}</h4>
          <ul>
            <li>InstaPay</li>
            <li>Vodafone Cash</li>
            <li>Orange Cash</li>
            <li>Etisalat Cash</li>
            <li>WE Pay</li>
          </ul>
        </div>
      </div>
      <div className="footer-bottom">
        <span>© 2026 AI Subscriptions. {t('جميع الحقوق محفوظة.', 'All rights reserved.')}</span>
        <span className="en">Made in Egypt 🇪🇬</span>
      </div>
    </footer>);

};

// === Animated counter ===
const AnimatedCounter = ({ target, suffix = '', duration = 1500 }) => {
  const [count, setCount] = useState(0);
  const ref = useRef(null);
  const started = useRef(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const observer = new IntersectionObserver(([entry]) => {
      if (entry.isIntersecting && !started.current) {
        started.current = true;
        const start = performance.now();
        const step = (now) => {
          const progress = Math.min((now - start) / duration, 1);
          const ease = 1 - Math.pow(1 - progress, 3);
          setCount(Math.round(target * ease));
          if (progress < 1) requestAnimationFrame(step);
        };
        requestAnimationFrame(step);
      }
    }, { threshold: 0.3 });
    observer.observe(el);
    return () => observer.disconnect();
  }, [target, duration]);
  return <span ref={ref}>{count}{suffix}</span>;
};

const formatHeroNumber = (value, lang) => {
  try {
    return new Intl.NumberFormat('en-US').format(value);
  } catch (e) {
    return String(value);
  }
};

const HOUR_MS = 60 * 60 * 1000;
const DEAL_DURATION_MS = 2 * HOUR_MS;

const seedRandom = (seed) => {
  let x = Math.sin(seed) * 10000;
  return x - Math.floor(x);
};

const getDailyDealState = (nowMs = Date.now()) => {
  const now = new Date(nowMs);
  const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
  const daySeed = now.getFullYear() * 10000 + (now.getMonth() + 1) * 100 + now.getDate();
  const randomHour = Math.floor(seedRandom(daySeed) * 22);
  const dealStart = dayStart + randomHour * HOUR_MS;
  const dealEnd = dealStart + DEAL_DURATION_MS;
  if (nowMs < dealStart || nowMs >= dealEnd) {
    return null;
  }
  return {
    remaining: Math.max(0, dealEnd - nowMs),
    endsAt: dealEnd,
    duration: DEAL_DURATION_MS
  };
};

const HERO_VISIT_BASE = 532;
const HERO_ORDER_BASE = 523;
const HERO_ORDER_BASE_DATE_UTC = Date.UTC(2026, 4, 8);
const DAY_MS = 24 * 60 * 60 * 1000;

const getHeroOrderCount = (now = Date.now()) => {
  const daysLive = Math.max(0, Math.floor((now - HERO_ORDER_BASE_DATE_UTC) / DAY_MS));
  return HERO_ORDER_BASE + (daysLive * 10);
};

const formatDealParts = (remainingMs) => {
  const totalSeconds = Math.max(0, Math.floor(remainingMs / 1000));
  const hours = Math.floor(totalSeconds / 3600);
  const minutes = Math.floor((totalSeconds % 3600) / 60);
  const seconds = totalSeconds % 60;
  const pad = (value) => String(value).padStart(2, '0');
  return { hours: pad(hours), minutes: pad(minutes), seconds: pad(seconds) };
};

const isTomorrow = (timestamp, nowMs = Date.now()) => {
  const tomorrow = new Date(nowMs);
  tomorrow.setDate(tomorrow.getDate() + 1);
  return new Date(timestamp).toDateString() === tomorrow.toDateString();
};

const getDealEndMeta = (endsAt, nowMs = Date.now()) => {
  const tomorrow = isTomorrow(endsAt, nowMs);
  const time = new Date(endsAt).toLocaleTimeString('en-US', {
    hour: 'numeric',
    minute: '2-digit',
    hour12: true
  });
  return { tomorrow, time };
};

const useHeroLiveProof = () => {
  const [proof, setProof] = useState(() => {
    const now = Date.now();
    const deal = getDailyDealState(now);
    return {
      visits: HERO_VISIT_BASE,
      orders: getHeroOrderCount(now),
      remaining: deal ? deal.remaining : 0,
      dealEndsAt: deal ? deal.endsAt : 0,
      dealActive: !!deal
    };
  });

  useEffect(() => {
    let active = true;
    const loadVisits = () => {
      fetch('/api/public-stats')
        .then((res) => res.ok ? res.json() : Promise.reject(new Error('Unable to load public stats')))
        .then((data) => {
          const visits = Number(data?.stats?.visits);
          if (!active || !Number.isFinite(visits)) return;
          setProof((current) => ({
            ...current,
            visits: Math.max(HERO_VISIT_BASE, Math.round(visits))
          }));
        })
        .catch(() => {});
    };
    loadVisits();
    const refreshId = window.setTimeout(loadVisits, 1200);
    const pollId = window.setInterval(loadVisits, 30000);
    return () => {
      active = false;
      window.clearTimeout(refreshId);
      window.clearInterval(pollId);
    };
  }, []);

  useEffect(() => {
    const id = window.setInterval(() => {
      setProof((current) => {
        const now = Date.now();
        const deal = getDailyDealState(now);
        return {
          visits: current.visits,
          orders: getHeroOrderCount(now),
          remaining: deal ? deal.remaining : 0,
          dealEndsAt: deal ? deal.endsAt : 0,
          dealActive: !!deal
        };
      });
    }, 1000);

    return () => window.clearInterval(id);
  }, []);

  return proof;
};

const HeroStat = ({ value, suffix = '', label, tone = '' }) => (
  <div className={`hero-stat ${tone}`}>
    <div className="num">{value}{suffix}</div>
    <div className="lbl">{label}</div>
  </div>
);

const DiscountCountdown = ({ lang, remaining, endsAt }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const parts = formatDealParts(remaining);
  const endMeta = getDealEndMeta(endsAt || Date.now() + remaining);
  const labels = lang === 'en'
    ? { hours: 'HRS', minutes: 'MIN', seconds: 'SEC' }
    : { hours: 'ساعة', minutes: 'دقيقة', seconds: 'ثانية' };

  return (
    <div className="hero-deal-timer" aria-live="polite">
      <div className="deal-copy">
        <span className="deal-live"><span className="deal-dot"></span>{t('خصم لايف لفترة محدودة', 'LIMITED-TIME LIVE DISCOUNT')}</span>
        <strong>{t('العرض بينتهي قريب', 'Discount ends soon')}</strong>
        <span className="deal-end-label">
          {lang === 'en' ? (
            <>Ends {endMeta.tomorrow ? 'tomorrow' : 'today'} at <bdi dir="ltr">{endMeta.time}</bdi></>
          ) : (
            <>ينتهي {endMeta.tomorrow ? 'غدًا' : 'اليوم'} الساعة <bdi dir="ltr">{endMeta.time}</bdi></>
          )}
        </span>
        <p>{t('احجز باقتك قبل ما العداد يخلص واستفيد من سعر العرض.', 'Reserve your plan before the timer ends and keep the deal price.')}</p>
      </div>
      <div className="deal-clock" dir="ltr" aria-label={t('عداد الخصم', 'Discount countdown')}>
        <span><strong>{parts.hours}</strong><small>{labels.hours}</small></span>
        <span><strong>{parts.minutes}</strong><small>{labels.minutes}</small></span>
        <span><strong>{parts.seconds}</strong><small>{labels.seconds}</small></span>
      </div>
    </div>
  );
};

// === Hero ===
const Hero = ({ lang, navigate }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const liveProof = useHeroLiveProof();

  // Pick three featured brands for floating cards
  const featured = ['ChatGPT', 'Netflix', 'Spotify'].map((b) => BRANDS.find((br) => br.brand === b)).filter(Boolean);

  return (
    <section className="hero">
      <div className="hero-inner">
        <div>
          <div className="hero-eyebrow">
            <span className="dot"></span>
            <span>{t('متاح الآن — تسليم خلال 30 دقيقة', 'LIVE NOW — 30-min delivery')}</span>
          </div>
          <h1>
            {t(<>كل اشتراكاتك<br /><span className="gold">المفضّلة</span> في مكان واحد</>,
            <>All your favorite<br /><span className="gold">subscriptions</span>, one place</>)}
          </h1>
          <p className="lede">
            {t(
              'من ChatGPT و Claude إلى Netflix و Spotify — أكثر من 150 باقة رقمية بأسعار مصرية وطرق دفع محلية.',
              'From ChatGPT and Claude to Netflix and Spotify — 150+ digital plans, local Egyptian pricing, local payment methods.'
            )}
          </p>
          <div className="hero-cta">
            <button className="btn btn-gold" onClick={() => navigate('catalog')}>
              {t('تصفّح الكتالوج', 'Browse Catalog')}
              <Icon name={lang === 'ar' ? 'arrow' : 'arrowR'} size={18} />
            </button>
            <button className="btn btn-ghost" onClick={() => navigate('cat:ai')}>
              <Icon name="sparkle" size={16} />
              {t('اشتراكات الذكاء الاصطناعي', 'AI Subscriptions')}
            </button>
          </div>
          <div className="hero-stats">
            <HeroStat
              value={<AnimatedCounter target={150} suffix="+"/>}
              label={t('باقة متاحة', 'Plans available')}
            />
            <HeroStat
              value={formatHeroNumber(liveProof.orders, lang)}
              label={t('طلب مكتمل', 'Orders delivered')}
            />
            <HeroStat
              value={formatHeroNumber(liveProof.visits, lang)}
              label={t('زيارات الموقع', 'Site visits')}
              tone="live"
            />
            <HeroStat
              value={<><AnimatedCounter target={30}/><span className="hero-stat-unit"> {t('دقيقة', 'min')}</span></>}
              label={t('متوسط التسليم', 'Avg delivery')}
            />
          </div>
          {liveProof.dealActive && <DiscountCountdown lang={lang} remaining={liveProof.remaining} endsAt={liveProof.dealEndsAt} />}
        </div>
        <div className="hero-visual">
          {featured.map((b, i) =>
          <div key={b.slug} className={`float-card c${i + 1}`}>
              <div style={{ display: 'flex', gap: 12, alignItems: 'center' }}>
                <div style={{
                width: 46, height: 46, borderRadius: 12,
                background: b.color, display: 'grid', placeItems: 'center',
                color: 'white', fontWeight: 800, fontSize: 18, fontFamily: 'Inter',
                boxShadow: `0 8px 24px ${b.color}66`
              }}>{window.BRAND_LOGOS && window.BRAND_LOGOS[b.brand]
                  ? React.cloneElement(window.BRAND_LOGOS[b.brand], {style:{width:'55%',height:'55%'}})
                  : b.glyph}</div>
                <div style={{ flex: 1, minWidth: 0 }}>
                  <div style={{ fontSize: 11, color: 'var(--gold-2)', fontFamily: 'Inter', letterSpacing: '0.1em', textAlign: 'right', direction: 'ltr' }}>{b.brand}</div>
                  <div style={{ fontWeight: 700, fontSize: 15 }}>{displayPlanName(b.plans[0], lang)}</div>
                </div>
              </div>
              <div style={{ marginTop: 14, paddingTop: 12, borderTop: '1px solid var(--line)', display: 'flex', justifyContent: 'flex-end', alignItems: 'center' }}>

                <a className="btn-buy" href={buildWaUrl(b.plans[0], lang)} target="_blank" rel="noopener noreferrer"
                  style={{ padding: '8px 14px', background:'#25D366', color:'white', textDecoration:'none', display:'inline-flex', alignItems:'center', gap:6, borderRadius:8 }}
                  onClick={(e) => {
                    e.stopPropagation();
                    guardWhatsAppOpen(e, buildWaUrl(b.plans[0], lang), lang, { brand: b.brand, plan: b.plans[0].plan, category: b.category, source: 'hero_visual' });
                  }}>
                  <Icon name="wa" size={14} />
                  <span style={{fontSize:12, fontWeight:700}}>{t('واتساب','WhatsApp')}</span>
                </a>
              </div>
            </div>
          )}
        </div>
      </div>
    </section>);

};

// === Category grid ===
const CategoryStrip = ({ lang, navigate }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  return (
    <section className="section" style={{ paddingTop: 18 }}>
      <div className="section-inner">
        <div className="section-head">
          <div>
            <h2 className="section-title">{t(<>تصفّح حسب <em>الفئة</em></>, <>Shop by <em>category</em></>)}</h2>
            <p className="section-sub">{t('خمس فئات تغطي كل ما تحتاجه من اشتراكات رقمية', 'Five categories that cover every digital subscription you need')}</p>
          </div>
        </div>
        <div className="cat-grid">
          {CATEGORIES.map((cat) => {
            const count = PRODUCTS.filter((p) => p.category === cat.match).length;
            return (
              <div key={cat.id} className="cat-card" onClick={() => navigate('cat:' + cat.id)}>
                <div className="cat-icon">{cat.icon}</div>
                <h3>{t(cat.ar, cat.en)}</h3>
                <div className="count">{count} {t('باقة', 'plans')}</div>
                <div className="arrow"><Icon name={lang === 'ar' ? 'arrow' : 'arrowR'} size={20} /></div>
              </div>);

          })}
        </div>
      </div>
    </section>);

};

// === Best sellers ===
const BestSellers = ({ lang, navigate, addToCart }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const carouselRef = useRef(null);

  const items = useMemo(() => {
    const out = [];
    FEATURED_BRANDS.forEach((name) => {
      const b = BRANDS.find((br) => br.brand === name);
      if (!b) return;
      // pick the most popular plan: Plus / Pro / Premium / first
      const preferred = b.plans.find((p) => /^plus$|^pro$|^premium$/i.test(p.plan)) || b.plans[0];
      out.push(preferred);
    });
    return out;
  }, []);

  const scroll = (dir) => {
    const el = carouselRef.current;if (!el) return;
    el.scrollBy({ left: dir * 600, behavior: 'smooth' });
  };

  return (
    <section className="section" style={{ paddingTop: 18, paddingBottom: 24 }}>
      <div className="section-inner">
        <div className="section-head">
          <div>
            <h2 className="section-title">{t(<>الأكثر <em>طلباً</em></>, <>Best <em>sellers</em></>)}</h2>
            <p className="section-sub">{t('الباقات اللي عملاؤنا بيختاروها أكتر', 'The plans our customers love most')}</p>
          </div>
          <div style={{ display: 'flex', gap: 10, alignItems: 'center' }}>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? -1 : 1)}><Icon name="chevR" size={18} /></button>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? 1 : -1)}><Icon name="chevL" size={18} /></button>
            <a href="#" className="section-link" onClick={(e) => {e.preventDefault();navigate('catalog');}}>
              {t('عرض الكل', 'View all')} →
            </a>
          </div>
        </div>
        <div className="carousel-wrap">
          <div className="carousel" ref={carouselRef}>
            {items.map((p) =>
            <ProductCard key={p.id} product={p} lang={lang}
            onClick={() => navigate('brand:' + slugify(p.brand))}
            onAdd={addToCart} />
            )}
          </div>
        </div>
      </div>
    </section>);

};

// === Trust strip / why us ===
const TrustStrip = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const items = [
  { ic: 'bolt', ar: 'تسليم فوري', en: 'Instant delivery', sub_ar: 'خلال 30 دقيقة من الدفع', sub_en: 'Within 30 min of payment' },
  { ic: 'shield', ar: 'دفع آمن', en: 'Secure payment', sub_ar: 'InstaPay ومحافظ مصرية', sub_en: 'InstaPay & Egyptian wallets' },
  { ic: 'clock', ar: 'دعم 24/7', en: '24/7 support', sub_ar: 'واتساب وفيسبوك', sub_en: 'WhatsApp & Facebook' },
  { ic: 'check', ar: 'ضمان كامل', en: 'Full warranty', sub_ar: 'استرداد لو حصلت مشكلة', sub_en: 'Refund if anything goes wrong' }];

  return (
    <section className="section" style={{ padding: '28px 28px', borderTop: '1px solid var(--line)', borderBottom: '1px solid var(--line)' }}>
      <div className="section-inner">
        <div className="trust-grid">
          {items.map((it, i) =>
          <div key={i} className="trust-item">
              <div style={{
              width: 48, height: 48, borderRadius: 14,
              background: 'rgba(212,169,62,0.1)', border: '1px solid rgba(212,169,62,0.25)',
              display: 'grid', placeItems: 'center', color: 'var(--gold-2)',
              flexShrink: 0
            }}>
                <Icon name={it.ic} size={20} />
              </div>
              <div>
                <div style={{ fontWeight: 700, fontSize: 15 }}>{t(it.ar, it.en)}</div>
                <div className="trust-sub" style={{ fontSize: 12, color: 'var(--ink-3)', marginTop: 2 }}>{t(it.sub_ar, it.sub_en)}</div>
              </div>
            </div>
          )}
        </div>
      </div>
    </section>);

};

// === Category carousel section (reusable) ===
const CategoryCarousel = ({ lang, navigate, addToCart, categoryMatch, titleAr, titleEn, emAr, emEn, subAr, subEn, catId }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const carouselRef = useRef(null);
  const items = useMemo(() => {
    const seen = new Set();
    return PRODUCTS.filter(p => p.category === categoryMatch).filter(p => {
      if (seen.has(p.brand)) return false;
      seen.add(p.brand);
      return true;
    }).slice(0, 10);
  }, [categoryMatch]);

  const scroll = (dir) => {
    const el = carouselRef.current; if (!el) return;
    el.scrollBy({ left: dir * 600, behavior: 'smooth' });
  };

  return (
    <section className="section" style={{ paddingTop: 18, paddingBottom: 24 }}>
      <div className="section-inner">
        <div className="section-head">
          <div>
            <h2 className="section-title">{t(<>{titleAr} <em>{emAr}</em></>, <>{titleEn} <em>{emEn}</em></>)}</h2>
            <p className="section-sub">{t(subAr, subEn)}</p>
          </div>
          <div style={{ display: 'flex', gap: 10, alignItems: 'center' }}>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? -1 : 1)}><Icon name="chevR" size={18} /></button>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? 1 : -1)}><Icon name="chevL" size={18} /></button>
            <a href="#" className="section-link" onClick={(e) => {e.preventDefault();navigate('cat:' + catId);}}>
              {t('عرض الكل', 'View all')} →
            </a>
          </div>
        </div>
        <div className="carousel-wrap">
          <div className="carousel" ref={carouselRef}>
            {items.map((p) =>
              <ProductCard key={p.id} product={p} lang={lang}
                onClick={() => navigate('brand:' + slugify(p.brand))}
                onAdd={addToCart} />
            )}
          </div>
        </div>
      </div>
    </section>
  );
};

// === CTA Banner ===
const CtaBanner = ({ lang, navigate }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  return (
    <section className="section" style={{ padding: '34px 28px' }}>
      <div className="section-inner">
        <div style={{
          background: 'linear-gradient(135deg, rgba(212,169,62,0.12) 0%, rgba(212,169,62,0.04) 100%)',
          border: '1px solid rgba(212,169,62,0.2)',
          borderRadius: 20, padding: '48px 36px', textAlign: 'center'
        }}>
          <h2 style={{ fontSize: 28, fontWeight: 800, marginBottom: 12 }}>
            {t(<>مش لاقي اللي بتدور عليه؟</>, <>Can't find what you're looking for?</>)}
          </h2>
          <p style={{ color: 'var(--ink-2)', fontSize: 16, maxWidth: 500, margin: '0 auto 24px' }}>
            {t('تواصل معانا على واتساب وهنوفرلك أي اشتراك تحتاجه بأفضل سعر', 'Contact us on WhatsApp and we\'ll get you any subscription at the best price')}
          </p>
          <div style={{ display: 'flex', gap: 12, justifyContent: 'center', flexWrap: 'wrap' }}>
            <a href={WA_LINK} target="_blank" rel="noopener" className="btn btn-gold"
              onClick={(e) => guardWhatsAppOpen(e, WA_LINK, lang, { source: 'cta_banner' })}
              style={{ background: '#25D366', color: 'white', textDecoration: 'none', padding: '14px 28px', fontSize: 15 }}>
              <Icon name="wa" size={18} />
              {t('تواصل واتساب', 'Contact WhatsApp')}
            </a>
            <button className="btn btn-ghost" onClick={() => navigate('catalog')} style={{ padding: '14px 28px', fontSize: 15 }}>
              {t('تصفح الكتالوج', 'Browse catalog')}
            </button>
          </div>
        </div>
      </div>
    </section>
  );
};

// === Brand logos strip ===
const BrandLogosStrip = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const logos = ['ChatGPT', 'Claude', 'Gemini', 'Netflix', 'Spotify', 'Canva', 'Cursor', 'YouTube Premium', 'PlayStation', 'ElevenLabs', 'Perplexity', 'Windsurf'];
  return (
    <section className="section" style={{ padding: '28px 28px', borderTop: '1px solid var(--line)' }}>
      <div className="section-inner">
        <p style={{ textAlign: 'center', fontSize: 13, color: 'var(--ink-3)', marginBottom: 20, fontWeight: 600, letterSpacing: '0.05em', textTransform: 'uppercase' }}>
          {t('نوفرلك أشهر العلامات التجارية', 'Trusted brands we offer')}
        </p>
        <div style={{
          display: 'flex', flexWrap: 'wrap', justifyContent: 'center', gap: 24, alignItems: 'center', opacity: 0.5
        }}>
          {logos.map(name => {
            const brand = BRANDS.find(b => b.brand === name);
            if (!brand) return null;
            return (
              <div key={name} style={{ width: 36, height: 36, color: 'var(--ink-2)' }}>
                {window.BRAND_LOGOS && window.BRAND_LOGOS[name]
                  ? React.cloneElement(window.BRAND_LOGOS[name], { style: { width: '100%', height: '100%' } })
                  : <span style={{ fontSize: 24, fontWeight: 800 }}>{brand.glyph}</span>
                }
              </div>
            );
          })}
        </div>
      </div>
    </section>
  );
};

// === FAQ Section ===
const FaqSection = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [openIdx, setOpenIdx] = useState(null);

  const faqs = [
    { q_ar: 'إزاي بتشتغل الخدمة؟', q_en: 'How does the service work?',
      a_ar: 'بتختار الباقة اللي عايزها، بتبعتلنا على واتساب، وبنوفرلك الاشتراك خلال 30 دقيقة. بنبعتلك بيانات الدخول على الإيميل.',
      a_en: 'Choose your plan, send us a WhatsApp message, and we\'ll set up your subscription within 30 minutes. Login details will be sent to your email.' },
    { q_ar: 'هل الاشتراكات أصلية؟', q_en: 'Are subscriptions genuine?',
      a_ar: 'أيوا، كل الاشتراكات أصلية 100% ومباشرة من الشركات الرسمية. بنضمنلك حساب شغال طول فترة الاشتراك.',
      a_en: 'Yes, all subscriptions are 100% genuine and directly from official providers. We guarantee a working account for the full subscription period.' },
    { q_ar: 'إيه طرق الدفع المتاحة؟', q_en: 'What payment methods are available?',
      a_ar: 'بنقبل InstaPay، فودافون كاش، محافظ إلكترونية، وتحويل بنكي. كل الطرق آمنة ومشفرة.',
      a_en: 'We accept InstaPay, Vodafone Cash, e-wallets, and bank transfers. All methods are secure and encrypted.' },
    { q_ar: 'لو حصلت مشكلة في الاشتراك؟', q_en: 'What if there\'s an issue with my subscription?',
      a_ar: 'فريق الدعم متاح 24/7 على واتساب. لو حصلت أي مشكلة بنحلها فوراً أو بنرجعلك فلوسك.',
      a_en: 'Our support team is available 24/7 on WhatsApp. If any issue arises, we\'ll fix it immediately or refund you.' },
    { q_ar: 'ليه الأسعار أرخص؟', q_en: 'Why are prices cheaper?',
      a_ar: 'بنوفر اشتراكات بأسعار مخفضة من خلال شراكات وعروض حصرية مع الموزعين الرسميين.',
      a_en: 'We offer discounted subscriptions through partnerships and exclusive deals with official distributors.' },
  ];

  return (
    <section className="section" style={{ paddingBottom: 34 }}>
      <div className="section-inner">
        <div style={{ textAlign: 'center', marginBottom: 36 }}>
          <h2 className="section-title">{t(<>أسئلة <em>شائعة</em></>, <>Frequently Asked <em>Questions</em></>)}</h2>
          <p className="section-sub">{t('كل اللي محتاج تعرفه عن خدماتنا', 'Everything you need to know about our services')}</p>
        </div>
        <div className="faq-section">
          {faqs.map((faq, i) => (
            <div key={i} className={`faq-item ${openIdx === i ? 'open' : ''}`}>
              <button className="faq-q" onClick={() => setOpenIdx(openIdx === i ? null : i)}>
                <span>{t(faq.q_ar, faq.q_en)}</span>
                <span className="faq-icon">+</span>
              </button>
              <div className="faq-a">{t(faq.a_ar, faq.a_en)}</div>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
};

// === Testimonials ===
const Testimonials = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const carouselRef = useRef(null);

  const reviews = [
    { name_ar: 'أحمد م.', name_en: 'Ahmed M.', init: 'أ',
      text_ar: 'والله خدمة تحفة. خدت ChatGPT Plus واستلمته ف ربع ساعة بالظبط، وأرخص من أي حد شوفته.',
      text_en: 'Honestly great service. Got my ChatGPT Plus in 15 min exactly, cheaper than anyone else I found.', stars: 5 },
    { name_ar: 'سارة ع.', name_en: 'Sara A.', init: 'س',
      text_ar: 'بقالي ٦ شهور بتعامل معاهم ولا مرة حصلت مشكلة. بكلمهم واتساب وبيردوا ع طول.',
      text_en: 'Been with them 6 months now, never had a single issue. Message on WhatsApp, they reply right away.', stars: 5 },
    { name_ar: 'محمد ر.', name_en: 'Mohamed R.', init: 'م',
      text_ar: 'كنت مستغرب إنها أول مرة أجرب أشتري أونلاين وتمشي كويس أوي كده. النتفلكس شغال فل الفل.',
      text_en: 'Was surprised everything went so smooth for my first online purchase. Netflix running perfectly.', stars: 5 },
    { name_ar: 'نورا ح.', name_en: 'Noura H.', init: 'ن',
      text_ar: 'خدت Spotify و Canva Pro مع بعض. حرفيا ف دقايق كانوا عندي. هرجعلهم تاني أكيد.',
      text_en: 'Got Spotify and Canva Pro together. Literally had them in minutes. Will def come back.', stars: 5 },
    { name_ar: 'كريم س.', name_en: 'Karim S.', init: 'ك',
      text_ar: 'الموقع بسيط ومفيش تعقيد. خدت Claude Pro واشتغل من أول ما فعلته.',
      text_en: 'Simple website, no hassle. Got Claude Pro and it worked from the moment I activated it.', stars: 4 },
    { name_ar: 'ياسمين ف.', name_en: 'Yasmin F.', init: 'ي',
      text_ar: 'لفيت على ناس كتير وكلهم كانوا بيطلعوا مضروبين. هنا بجد حاجة تانية، خدت Gemini واتفعل لحظي.',
      text_en: 'Went through so many sellers who turned out to be scams. This is legit different. Got Gemini, activated instantly.', stars: 5 },
    { name_ar: 'عمر ط.', name_en: 'Omar T.', init: 'ع',
      text_ar: 'خدت NordVPN و Netflix سوا. الاتنين شغالين وما حصلش أي هنج ولا حاجة. تمام كده.',
      text_en: 'Got NordVPN and Netflix together. Both work fine, no lag or anything. All good.', stars: 5 },
    { name_ar: 'فاطمة ك.', name_en: 'Fatma K.', init: 'ف',
      text_ar: 'أنا كنت خايفة الصراحة أدفع أونلاين بس الحمدلله طلعوا ناس محترمة. خدت Canva وشغال كويس.',
      text_en: 'I was honestly scared to pay online but they turned out to be legit. Got Canva, works well.', stars: 5 },
    { name_ar: 'حسن م.', name_en: 'Hassan M.', init: 'ح',
      text_ar: 'كلمتهم واتساب الساعة ٢ بليل وردوا عليا! خدت Midjourney واتفعل ف نفس اللحظة.',
      text_en: 'Messaged them at 2 AM on WhatsApp and they actually replied! Got Midjourney activated same moment.', stars: 5 },
    { name_ar: 'منى ع.', name_en: 'Mona A.', init: 'م',
      text_ar: 'بجد من أول يوم ليهم وأنا بتعامل معاهم. مش هتلاقي أحسن من كده ف مصر والله.',
      text_en: 'Been with them since day one honestly. You really won\'t find better in Egypt.', stars: 5 },
    { name_ar: 'يوسف ه.', name_en: 'Yousef H.', init: 'ي',
      text_ar: 'خدت PlayStation Plus بسعر مكنتش متخيل ألاقيه. اتفعل ف دقيقتين مبالغش.',
      text_en: 'Got PS Plus at a price I never thought I\'d find. Activated in 2 min, not even exaggerating.', stars: 5 },
    { name_ar: 'دينا ر.', name_en: 'Dina R.', init: 'د',
      text_ar: 'ليا ٣ شهور على Spotify Premium من عندهم ومفيش أي مشكلة خالص. ناس ثقة بجد.',
      text_en: 'Had Spotify Premium from them for 3 months, zero issues. Genuinely trustworthy people.', stars: 4 },
    { name_ar: 'علي ن.', name_en: 'Ali N.', init: 'ع',
      text_ar: 'سعرهم أرخص من السوق بفرق ملحوظ. خدت Adobe واستلمته ف نص ساعة تقريبا.',
      text_en: 'Their prices are noticeably cheaper than the market. Got Adobe, received it in about 30 min.', stars: 5 },
    { name_ar: 'مصطفى ج.', name_en: 'Mostafa G.', init: 'م',
      text_ar: 'م. أحمد راجل محترم فشخ والله. خدت منه ChatGPT و Gemini والاتنين شغالين زي الساعة.',
      text_en: 'Ahmed is super professional honestly. Got ChatGPT and Gemini from him, both running perfectly.', stars: 5 },
    { name_ar: 'هاجر م.', name_en: 'Hagar M.', init: 'ه',
      text_ar: 'اتعاملت مع م. أحمد كذا مرة وكل مرة بيبقى متعاون ومبيزهقش. تفعيل فوري وبيتابع بعدها كمان.',
      text_en: 'Dealt with Ahmed several times, always cooperative and patient. Instant activation and he checks on you after.', stars: 5 },
    { name_ar: 'طارق ع.', name_en: 'Tarek A.', init: 'ط',
      text_ar: 'م. أحمد شغله مظبوط ومبيغلاش. خدت منه Netflix و Claude وكله تمام من يومها.',
      text_en: 'Ahmed does solid work and doesn\'t overcharge. Got Netflix and Claude, all good since day one.', stars: 5 },
    { name_ar: 'رنا خ.', name_en: 'Rana K.', init: 'ر',
      text_ar: 'صاحبتي هي اللي دلتني على م. أحمد. خدت Spotify و Canva وفعلا زي ما قالتلي بالظبط، سريع ومحترم.',
      text_en: 'My friend told me about Ahmed. Got Spotify and Canva, exactly as she said - fast and professional.', stars: 5 },
    { name_ar: 'إبراهيم ص.', name_en: 'Ibrahim S.', init: 'إ',
      text_ar: 'لو حد سألني هقوله ع طول روح لـ م. أحمد. خدت منه ٣ اشتراكات وواحدة واحدة كلهم اشتغلوا من غير أي وجع دماغ.',
      text_en: 'If anyone asks me I\'d say go to Ahmed immediately. Got 3 subs from him, all worked with zero headache.', stars: 5 },
    { name_ar: 'خالد ف.', name_en: 'Khaled F.', init: 'خ',
      text_ar: 'جربت مع كذا واحد قبل كده وكلهم ضيعوا وقتي وفلوسي. م. أحمد أول واحد يطلع فعلا زي ما بيقول، شخص مثالي للشغل ده.',
      text_en: 'Tried other sellers before, all wasted my time and money. Ahmed is the first one who actually delivers what he says. Ideal for this.', stars: 5 },
    { name_ar: 'سلمى د.', name_en: 'Salma D.', init: 'س',
      text_ar: 'كنت بجرب ناس كتير ومحدش فيهم كمل معايا غير م. أحمد. بيتابع لحد ما كل حاجة تشتغل ومبيسبكش ف النص.',
      text_en: 'Was trying many people and none of them followed through except Ahmed. He stays with you until everything works.', stars: 5 },
    { name_ar: 'عبدالله ح.', name_en: 'Abdullah H.', init: 'ع',
      text_ar: 'م. أحمد من أحسن اللي اتعاملت معاهم أونلاين. الباقي كانوا بيختفوا بعد ما ياخدوا الفلوس، بس ده بيفضل موجود ويساعدك.',
      text_en: 'Ahmed is the best I dealt with online. Others would vanish after getting paid, but he stays around and helps.', stars: 5 },
  ];

  const scroll = (dir) => {
    const el = carouselRef.current; if (!el) return;
    el.scrollBy({ left: dir * 340, behavior: 'smooth' });
  };

  return (
    <section className="section" style={{ paddingTop: 18, paddingBottom: 34 }}>
      <div className="section-inner">
        <div className="section-head">
          <div>
            <h2 className="section-title">{t(<>آراء <em>عملائنا</em></>, <>What our <em>customers</em> say</>)}</h2>
            <p className="section-sub">{t('تجارب حقيقية من عملاء سعداء', 'Real experiences from happy customers')}</p>
          </div>
          <div style={{ display: 'flex', gap: 10 }}>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? -1 : 1)}><Icon name="chevR" size={18}/></button>
            <button className="icon-btn" onClick={() => scroll(lang === 'ar' ? 1 : -1)}><Icon name="chevL" size={18}/></button>
          </div>
        </div>
        <div className="carousel-wrap">
          <div className="carousel" ref={carouselRef} style={{ gap: 16 }}>
            {reviews.map((r, i) => (
              <div key={i} className="testimonial-card">
                <div className="testimonial-stars">{'★'.repeat(r.stars)}{'☆'.repeat(5 - r.stars)}</div>
                <div className="testimonial-text" style={{ direction: 'rtl', textAlign: 'right' }}>"{r.text_ar}"</div>
                <div className="testimonial-author">
                  <div className="testimonial-avatar">{t(r.init, r.name_en[0])}</div>
                  <div>
                    <div className="testimonial-name">{t(r.name_ar, r.name_en)}</div>
                    <div className="testimonial-sub">{t('عميل موثق', 'Verified customer')}</div>
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      </div>
    </section>
  );
};

const leadFormInitialState = { name: '', phone: '', email: '', interest: '', message: '', consent: false, website: '' };
const leadPopupInitialState = { ...leadFormInitialState, consent: true };
const LEAD_POPUP_TRIGGER_DELAY_MS = 9000;
const LEAD_POPUP_FALLBACK_DELAY_MS = 28000;
const LEAD_POPUP_SCROLL_RATIO = 0.35;

const leadInterestOptions = (lang) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  return [
    t('ChatGPT / أدوات ذكاء اصطناعي', 'ChatGPT / AI tools'),
    t('تصميم وميديا', 'Design and media'),
    t('Streaming وترفيه', 'Streaming and entertainment'),
    t('Gaming أو Gift Cards', 'Gaming or gift cards'),
    t('مش عارف، محتاج ترشيح', 'Not sure, need advice')
  ];
};

const buildLeadPayload = (form, source, lang) => {
  const route = typeof analyticsRoute === 'function' ? analyticsRoute() : (window.AISUBS_CURRENT_ROUTE || 'home');
  return {
    ...form,
    source,
    route,
    path: window.location.pathname,
    sessionId: typeof analyticsSessionId === 'function' ? analyticsSessionId() : '',
    lang: document.documentElement.lang || lang,
    referrer: typeof analyticsReferrer === 'function' ? analyticsReferrer() : '',
    device: typeof analyticsDevice === 'function' ? analyticsDevice() : '',
    browser: typeof analyticsBrowser === 'function' ? analyticsBrowser() : ''
  };
};

const sendLead = async (form, source, lang) => {
  const res = await fetch('/api/leads', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(buildLeadPayload(form, source, lang))
  });
  const data = await res.json().catch(() => ({}));
  if (!res.ok || !data.ok) throw new Error(data.error || 'Unable to save lead');
  return data;
};

const LeadCaptureSection = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [form, setForm] = useState(leadFormInitialState);
  const [status, setStatus] = useState('idle');
  const [error, setError] = useState('');
  const interests = leadInterestOptions(lang);

  const updateField = (key, value) => setForm((prev) => ({ ...prev, [key]: value }));

  const submitLead = async (e) => {
    e.preventDefault();
    setError('');
    if (!form.phone.trim() && !form.email.trim()) {
      setError(t('اكتب إيميل أو رقم واتساب عشان نقدر نكلمك.', 'Add an email or WhatsApp number so we can contact you.'));
      return;
    }
    if (!form.consent) {
      setError(t('لازم توافق إننا نتواصل معاك بخصوص الطلب.', 'Please allow us to contact you about this request.'));
      return;
    }
    setStatus('loading');
    try {
      await sendLead(form, 'home_lead_form', lang);
      setStatus('sent');
      setForm(leadFormInitialState);
    } catch (err) {
      setStatus('idle');
      setError(t('حصلت مشكلة. جرب تاني أو كلمنا واتساب مباشرة.', 'Something went wrong. Try again or contact us on WhatsApp.'));
    }
  };

  return (
    <section className="lead-capture-section">
      <div className="lead-capture-inner">
        <div className="lead-copy">
          <span className="eyebrow">{t('محتاج مساعدة؟', 'Need help?')}</span>
          <h2>{t('سيب بياناتك ونرشحلك أنسب اشتراك', 'Leave your details and we will recommend the right plan')}</h2>
          <p>{t('ده اختياري. إحصائيات التصفح بتتجمع بشكل مجهول بدون اسم أو عنوان IP. بيانات التواصل بتتسجل بس لو بعتها بنفسك، وهنستخدمها للرد على الطلب أو الترشيح.', 'This is optional. Browsing analytics are anonymous with no name or IP address. Contact details are only saved if you submit them, and we use them only to reply about this request or recommendation.')}</p>
          <div className="lead-points">
            <span>{t('رد سريع', 'Fast reply')}</span>
            <span>{t('ترشيح مناسب', 'Better recommendation')}</span>
            <span>{t('تصفح مجهول', 'Anonymous browsing')}</span>
          </div>
        </div>
        <form className="lead-form" onSubmit={submitLead}>
          <input className="lead-hp" tabIndex="-1" autoComplete="off" value={form.website} onChange={(e) => updateField('website', e.target.value)} />
          <div className="lead-form-grid">
            <label>
              <span>{t('الاسم', 'Name')}</span>
              <input dir="auto" value={form.name} onChange={(e) => updateField('name', e.target.value)} placeholder={t('اسمك', 'Your name')} />
            </label>
            <label>
              <span>{t('الإيميل', 'Email')}</span>
              <input dir="ltr" inputMode="email" autoComplete="email" value={form.email} onChange={(e) => updateField('email', e.target.value)} placeholder="name@email.com" />
            </label>
            <label>
              <span>{t('رقم واتساب', 'WhatsApp number')}</span>
              <input dir="ltr" inputMode="tel" autoComplete="tel" value={form.phone} onChange={(e) => updateField('phone', e.target.value)} placeholder="+20..." />
            </label>
            <label>
              <span>{t('مهتم بإيه؟', 'Interested in')}</span>
              <select value={form.interest} onChange={(e) => updateField('interest', e.target.value)}>
                <option value="">{t('اختار نوع الاشتراك', 'Choose a subscription type')}</option>
                {interests.map((item) => <option key={item} value={item}>{item}</option>)}
              </select>
            </label>
          </div>
          <label>
            <span>{t('ملاحظات', 'Notes')}</span>
            <textarea dir="auto" rows="3" value={form.message} onChange={(e) => updateField('message', e.target.value)} placeholder={t('اكتب الخدمة أو الباقة اللي محتاجها', 'Write the service or plan you need')} />
          </label>
          <label className="lead-consent">
            <input type="checkbox" checked={form.consent} onChange={(e) => updateField('consent', e.target.checked)} />
            <span>{t('أوافق إن AI Subscriptions يتواصل معايا بخصوص الطلب ده.', 'I agree that AI Subscriptions can contact me about this request.')}</span>
          </label>
          <p className="lead-privacy-note">
            {t('ملحوظة: بيانات التواصل اختيارية ومش بتتربط بإحصائيات التصفح المجهولة.', 'Note: contact details are optional and are not linked to anonymous browsing analytics.')}
          </p>
          {error && <div className="lead-form-error">{error}</div>}
          {status === 'sent' && <div className="lead-form-success">{t('تمام، بياناتك وصلت. هنكلمك قريب.', 'Done, your details were sent. We will contact you soon.')}</div>}
          <button className="btn btn-gold btn-block" disabled={status === 'loading'}>
            {status === 'loading' ? t('جاري الإرسال...', 'Sending...') : t('ابعتهالي', 'Send request')}
          </button>
        </form>
      </div>
    </section>
  );
};

const LeadCapturePopup = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const storageKey = 'aisubs_lead_popup_closed_at';
  const [visible, setVisible] = useState(false);
  const [form, setForm] = useState({ ...leadPopupInitialState, interest: leadInterestOptions(lang)[0] || '' });
  const [status, setStatus] = useState('idle');
  const [error, setError] = useState('');
  const interests = leadInterestOptions(lang);

  useEffect(() => {
    let closedAt = 0;
    try { closedAt = Number(localStorage.getItem(storageKey) || 0); } catch (e) {}
    const sevenDays = 7 * 24 * 60 * 60 * 1000;
    if (closedAt && Date.now() - closedAt < sevenDays) return;
    let shown = false;
    const showPopup = () => {
      if (shown) return;
      shown = true;
      window.removeEventListener('scroll', onScroll);
      setVisible(true);
    };
    const onScroll = () => {
      const doc = document.documentElement;
      const scrollable = Math.max(1, doc.scrollHeight - window.innerHeight);
      const progress = window.scrollY / scrollable;
      if (progress >= LEAD_POPUP_SCROLL_RATIO) showPopup();
    };
    const armScrollTrigger = () => {
      onScroll();
      if (!shown) window.addEventListener('scroll', onScroll, { passive: true });
    };
    const triggerTimer = window.setTimeout(armScrollTrigger, LEAD_POPUP_TRIGGER_DELAY_MS);
    const fallbackTimer = window.setTimeout(showPopup, LEAD_POPUP_FALLBACK_DELAY_MS);
    return () => {
      window.clearTimeout(triggerTimer);
      window.clearTimeout(fallbackTimer);
      window.removeEventListener('scroll', onScroll);
    };
  }, []);

  useEffect(() => {
    setForm((prev) => prev.interest ? { ...prev, consent: true } : { ...prev, consent: true, interest: interests[0] || '' });
  }, [lang]);

  const updateField = (key, value) => setForm((prev) => ({ ...prev, [key]: value }));
  const closePopup = () => {
    try { localStorage.setItem(storageKey, String(Date.now())); } catch (e) {}
    setVisible(false);
  };

  const submitLead = async (e) => {
    e.preventDefault();
    setError('');
    if (!form.email.trim()) {
      setError(t('اكتب الإيميل عشان نبعتلك الترشيح.', 'Add your email so we can send the recommendation.'));
      return;
    }
    if (!form.interest.trim()) {
      setError(t('اختار نوع الاشتراك اللي مهتم بيه.', 'Choose the subscription category you are interested in.'));
      return;
    }
    setStatus('loading');
    try {
      await sendLead({ ...form, consent: true }, 'lead_popup', lang);
      setStatus('sent');
      setForm({ ...leadPopupInitialState, interest: interests[0] || '' });
      try { localStorage.setItem(storageKey, String(Date.now())); } catch (err) {}
      window.setTimeout(() => setVisible(false), 1200);
    } catch (err) {
      setStatus('idle');
      setError(t('حصلت مشكلة. جرب تاني أو كلمنا واتساب.', 'Something went wrong. Try again or contact us on WhatsApp.'));
    }
  };

  if (!visible) return null;

  return (
    <div className="lead-popup" role="dialog" aria-modal="true" aria-label={t('طلب ترشيح اشتراك', 'Plan recommendation request')}>
      <div className="lead-popup-card">
        <button className="lead-popup-close" type="button" onClick={closePopup} aria-label={t('إغلاق', 'Close')}>
          <Icon name="close" size={14} />
        </button>
        <div className="lead-popup-copy">
          <span className="eyebrow">{t('محتاج ترشيح سريع؟', 'Need a quick pick?')}</span>
          <h3>{t('اختار النوع وسيب الإيميل', 'Choose a category and email')}</h3>
          <p>{t('هنبعتلك ترشيح مختصر على الإيميل حسب نوع الاشتراك اللي مهتم بيه.', 'We will email a short recommendation based on the subscription category you choose.')}</p>
        </div>
        <form className="lead-popup-form" onSubmit={submitLead}>
          <input className="lead-hp" tabIndex="-1" autoComplete="off" value={form.website} onChange={(e) => updateField('website', e.target.value)} />
          <div className="lead-popup-grid">
            <label>
              <span>{t('الإيميل', 'Email')}</span>
              <input dir="ltr" inputMode="email" autoComplete="email" value={form.email} onChange={(e) => updateField('email', e.target.value)} placeholder="name@email.com" />
            </label>
            <label>
              <span>{t('النوع', 'Category')}</span>
              <select value={form.interest} onChange={(e) => updateField('interest', e.target.value)}>
                {interests.map((item) => <option key={item} value={item}>{item}</option>)}
              </select>
            </label>
          </div>
          <p className="lead-popup-note">
            {t('بالإرسال أنت توافق إننا نتواصل معاك على الإيميل بخصوص الترشيح ده فقط.', 'By sending, you agree that we can email you about this recommendation only.')}
          </p>
          {error && <div className="lead-form-error">{error}</div>}
          {status === 'sent' && <div className="lead-form-success">{t('تمام، وصلتنا بياناتك.', 'Done, we received your details.')}</div>}
          <button className="btn btn-gold btn-block" disabled={status === 'loading'}>
            {status === 'loading' ? t('جاري الإرسال...', 'Sending...') : t('ابعتهالي', 'Send')}
          </button>
        </form>
      </div>
    </div>
  );
};

// === Home page ===
const HomePage = ({ lang, navigate, addToCart }) =>
<>
    <Hero lang={lang} navigate={navigate} />
    <TrustStrip lang={lang} />
    <BestSellers lang={lang} navigate={navigate} addToCart={addToCart} />
    <CategoryCarousel lang={lang} navigate={navigate} addToCart={addToCart}
      categoryMatch="ذكاء اصطناعي وشات" catId="ai"
      titleAr="اشتراكات" titleEn="AI &" emAr="الذكاء الاصطناعي" emEn="Chat"
      subAr="ChatGPT و Claude و Gemini وغيرهم" subEn="ChatGPT, Claude, Gemini and more" />
    <CategoryStrip lang={lang} navigate={navigate} />
    <CategoryCarousel lang={lang} navigate={navigate} addToCart={addToCart}
      categoryMatch="بث وترفيه" catId="stream"
      titleAr="بث" titleEn="Streaming &" emAr="وترفيه" emEn="Entertainment"
      subAr="Netflix و Disney+ و Spotify وأكتر" subEn="Netflix, Disney+, Spotify and more" />
    <CategoryCarousel lang={lang} navigate={navigate} addToCart={addToCart}
      categoryMatch="تصميم وميديا" catId="design"
      titleAr="تصميم" titleEn="Design &" emAr="وميديا" emEn="Media"
      subAr="Canva و Midjourney و Freepik وأكتر" subEn="Canva, Midjourney, Freepik and more" />
    <Testimonials lang={lang} />
    <BrandLogosStrip lang={lang} />
    <FaqSection lang={lang} />
    <CtaBanner lang={lang} navigate={navigate} />
    <LeadCaptureSection lang={lang} />
  </>;


// === Catalog page ===
const CatalogPage = ({ lang, navigate, addToCart, initialCategory = null }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [activeCat, setActiveCat] = useState(initialCategory);
  const [search, setSearch] = useState('');
  const [activeBilling, setActiveBilling] = useState(null);

  useEffect(() => {setActiveCat(initialCategory);}, [initialCategory]);

  const activeCategory = useMemo(() => {
    return activeCat ? CATEGORIES.find((c) => c.id === activeCat) : null;
  }, [activeCat]);

  const BILLING_ORDER = ['Monthly', 'Annual', 'Top-up', 'Gift card', 'بطاقة هدية', 'Monthly/Annual', 'Custom'];
  const billingOpts = useMemo(() => {
    const source = activeCategory ? PRODUCTS.filter((p) => p.category === activeCategory.match) : PRODUCTS;
    const set = new Set(source.map((p) => p.billing).filter(Boolean));
    return [...set].sort((a, b) => {
      const ai = BILLING_ORDER.indexOf(a);
      const bi = BILLING_ORDER.indexOf(b);
      if (ai !== -1 || bi !== -1) return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi);
      return String(a).localeCompare(String(b));
    });
  }, [activeCategory]);

  useEffect(() => {
    if (activeBilling && !billingOpts.includes(activeBilling)) setActiveBilling(null);
  }, [activeBilling, billingOpts]);

  const selectCategory = (catId) => {
    setActiveCat(catId || null);
    navigate(catId ? `cat:${catId}` : 'catalog');
  };

  const filtered = useMemo(() => {
    return PRODUCTS.filter((p) => {
      if (activeCat) {
        if (activeCategory && p.category !== activeCategory.match) return false;
      }
      if (activeBilling && p.billing !== activeBilling) return false;
      if (search) {
        const q = search.toLowerCase().trim();
        const words = q.split(/\s+/);
        const haystack = (p.brand + ' ' + p.plan + ' ' + p.category + ' ' + (BRAND_AR_ALIASES[p.brand] || '')).toLowerCase();
        if (!words.every(w => haystack.includes(w))) return false;
      }
      return true;
    });
  }, [activeCat, activeBilling, activeCategory, search]);

  const pageTitle = activeCategory;

  return (
    <div className="catalog-layout">
      <aside className="filter-panel">
        <h4>{t('الفئات', 'Categories')}</h4>
        <ul className="filter-list">
          <li><button className={!activeCat ? 'active' : ''} onClick={() => selectCategory(null)}>
            <span>{t('جميع الفئات', 'All categories')}</span>
            <span className="cnt">{PRODUCTS.length}</span>
          </button></li>
          {CATEGORIES.map((c) => {
            const count = PRODUCTS.filter((p) => p.category === c.match).length;
            return (
              <li key={c.id}>
                <button className={activeCat === c.id ? 'active' : ''} onClick={() => selectCategory(c.id)}>
                  <span>{t(c.ar, c.en)}</span>
                  <span className="cnt">{count}</span>
                </button>
              </li>);

          })}
        </ul>
        <h4>{t('نوع الاشتراك', 'Billing')}</h4>
        <ul className="filter-list">
          <li><button className={!activeBilling ? 'active' : ''} onClick={() => setActiveBilling(null)}>
            <span>{t('الكل', 'All')}</span>
          </button></li>
          {billingOpts.map((b) =>
          <li key={b}>
              <button className={activeBilling === b ? 'active' : ''} onClick={() => setActiveBilling(b)}>
                <span>{tBilling(b, lang)}</span>
              </button>
            </li>
          )}
        </ul>
      </aside>
      <div>
        <div className="mobile-filter-bar" aria-label={t('تصفية الكتالوج', 'Catalog filters')}>
          <label>
            <span>{t('الفئة', 'Category')}</span>
            <select value={activeCat || ''} onChange={(e) => selectCategory(e.target.value || null)}>
              <option value="">{t('كل الفئات', 'All categories')}</option>
              {CATEGORIES.map((c) => (
                <option key={c.id} value={c.id}>{t(c.ar, c.en)}</option>
              ))}
            </select>
          </label>
          <label>
            <span>{t('الفوترة', 'Billing')}</span>
            <select value={activeBilling || ''} onChange={(e) => setActiveBilling(e.target.value || null)}>
              <option value="">{t('كل الأنواع', 'All billing')}</option>
              {billingOpts.map((b) => (
                <option key={b} value={b}>{tBilling(b, lang)}</option>
              ))}
            </select>
          </label>
        </div>
        <div className="catalog-head">
          <div>
            <h1 className="catalog-title">
              {pageTitle ? t(pageTitle.ar, pageTitle.en) : t('كل الباقات', 'All plans')}
            </h1>
            <div className="catalog-meta">{filtered.length} {t('باقة', 'plans')}</div>
          </div>
          <div className="search-box" style={{ position: 'relative' }}>
            <input
              placeholder={t('ابحث عن براند أو باقة...', 'Search brand or plan...')}
              value={search}
              onChange={(e) => setSearch(e.target.value)} />
            <Icon name="search" size={18} />
            {search.length >= 2 && (
              <div className="search-dropdown">
                {filtered.length === 0
                  ? <div className="search-empty">{t('مفيش نتائج', 'No results')}</div>
                  : filtered.slice(0, 8).map(p => (
                    <div key={p.id} className="search-hit" onClick={() => { setSearch(''); navigate('brand:' + slugify(p.brand)); }}>
                      <ThumbSm brand={p.brand} color={p.color} glyph={p.glyph} size={36}/>
                      <div>
                        <div className="hit-brand">{p.brand}</div>
                        <div className="hit-plan">{displayPlanName(p, lang)}</div>
                        <div className="hit-cat">{p.category}</div>
                      </div>
                    </div>
                  ))
                }
              </div>
            )}
          </div>
        </div>
        {filtered.length === 0 ?
        <div className="empty-state">
            <div style={{ fontSize: 48, marginBottom: 12 }}>🔍</div>
            <div>{t('مفيش نتائج', 'No results')}</div>
          </div> :

        <div className="product-grid">
            {filtered.map((p) =>
          <ProductCard key={p.id} product={p} lang={lang}
          onClick={() => navigate('brand:' + slugify(p.brand))}
          onAdd={addToCart} />
          )}
            <RequestCard lang={lang} />
          </div>
        }
      </div>
    </div>);

};

// === Request missing subscription card ===
const RequestCard = ({ lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const msg = lang === 'en'
    ? 'Hello! I would like to request a subscription that is not on the website.\n\n• Service / App name: \n• Plan: \n• Notes: \n\nPlease let me know if it is available and the price. Thanks!'
    : 'السلام عليكم! حابب أطلب اشتراك مش موجود على الموقع.\n\n• اسم الخدمة / التطبيق: \n• الباقة: \n• ملاحظات: \n\nياريت تقولولي لو متوفر والسعر كام. شكراً!';
  const url = `${WA_LINK}?text=${encodeURIComponent(msg)}`;
  return (
    <a href={url} target="_blank" rel="noopener noreferrer"
      className="product-card"
      onClick={(e) => guardWhatsAppOpen(e, url, lang, { source: 'request_missing' })}
      style={{
        textDecoration:'none',
        background:'linear-gradient(140deg, rgba(212,169,62,0.08), rgba(37,211,102,0.08))',
        border:'1.5px dashed rgba(212,169,62,0.4)',
        display:'flex', flexDirection:'column', alignItems:'center', justifyContent:'center',
        textAlign:'center', padding:'24px 18px', minHeight:240, gap:14, cursor:'pointer'
      }}>
      <div style={{
        width:56, height:56, borderRadius:'50%',
        background:'rgba(212,169,62,0.12)',
        border:'1px solid rgba(212,169,62,0.35)',
        display:'flex', alignItems:'center', justifyContent:'center',
        color:'var(--gold-2)', fontSize:32, fontWeight:300
      }}>+</div>
      <h3 style={{ fontSize:17, fontWeight:700, color:'var(--ink)', margin:0, lineHeight:1.3 }}>
        {t('مش لاقي اشتراكك؟', 'Can\u2019t find your subscription?')}
      </h3>
      <p style={{ fontSize:13, color:'var(--ink-2)', margin:0, lineHeight:1.6, maxWidth:260 }}>
        {t('اطلبه عبر واتساب وإحنا نجيبهولك خلال وقت قياسي.',
           'Request it on WhatsApp and we\u2019ll get it for you fast.')}
      </p>
      <div style={{
        marginTop:6, padding:'9px 18px', borderRadius:99,
        background:'#25D366', color:'white', fontWeight:700, fontSize:13,
        display:'inline-flex', alignItems:'center', gap:7
      }}>
        <Icon name="wa" size={14}/>
        {t('اطلب الآن', 'Request now')}
      </div>
    </a>
  );
};
const BrandPage = ({ slug, lang, navigate, addToCart }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const brand = BRANDS.find((b) => b.slug === slug);
  const [selectedId, setSelectedId] = useState(brand?.plans[0]?.id);
  const [addedId, setAddedId] = useState(null);
  const addFlashTimerRef = useRef(null);

  useEffect(() => {
    return () => {
      if (addFlashTimerRef.current) window.clearTimeout(addFlashTimerRef.current);
    };
  }, []);

  if (!brand) {
    return <div className="empty-state">{t('غير موجود', 'Not found')}</div>;
  }
  const selected = brand.plans.find((p) => p.id === selectedId) || brand.plans[0];
  const cat = CATEGORIES.find((c) => c.match === brand.category);
  const isGiftCard = brand.category === 'بطاقات رقمية';
  const isChatGptSharedPlan = brand.brand === 'ChatGPT' && /Plus Shared/i.test(selected.plan);
  const planName = (p) => {
    return displayPlanName(p, lang);
  };
  const planHint = (p) => {
    if (brand.brand === 'ChatGPT' && /Plus Shared/i.test(p.plan)) return t('حساب مشترك بسعر اقتصادي', 'Shared account at an affordable price');
    if (brand.brand === 'ChatGPT' && /Plus Private|Private/i.test(p.plan)) return t('حساب خاص بيك بالكامل', 'Fully private account just for you');
    return '';
  };
  const planBadges = (p) => {
    if (brand.brand === 'ChatGPT' && /Plus Shared/i.test(p.plan)) {
      return [
        { cls: 'popular', label: t('الأكثر طلباً', 'Most Popular') },
        { cls: 'value', label: t('أفضل قيمة', 'Best Value') },
      ];
    }
    return [];
  };
  const selectedPackageName = `${brand.brand} - ${planName(selected)}`;
  const handleAddSelected = (e) => {
    const added = addToCart(selected);
    if (added === false) return;
    flyToCart(e, selected);
    setAddedId(selected.id);
    if (addFlashTimerRef.current) window.clearTimeout(addFlashTimerRef.current);
    addFlashTimerRef.current = window.setTimeout(() => setAddedId(null), 1500);
  };
  const handlePlanSelect = (p) => {
    setSelectedId(p.id);
    trackAnalytics('plan_select', { brand: brand.brand, plan: p.plan, category: p.category, source: 'brand_detail' });
  };
  const features = isGiftCard ? [
    t('كود رقمي خلال 30 دقيقة', 'Digital code within 30 minutes'),
    t('يعمل على حسابك مباشرة', 'Works on your account directly'),
    t('كود أصلي 100% من المتجر الرسمي', '100% authentic official store code'),
    t('صالح للاستخدام في مصر والمنطقة', 'Valid for Egypt & region'),
    t('إرسال الكود عبر واتساب', 'Code sent via WhatsApp'),
    t('دعم فني على واتساب', 'WhatsApp tech support'),
  ] : isChatGptSharedPlan ? [
    t('تفعيل خلال 30 دقيقة', 'Activated within 30 minutes'),
    t('حساب ChatGPT Plus مشترك بسعر اقتصادي', 'Shared ChatGPT Plus account at an affordable price'),
    t('متابعة ودعم لو حصلت أي مشكلة', 'Monitoring and support if any issue happens'),
    t('ضمان طوال مدة الاشتراك', 'Warranty for full subscription period'),
    t('إعداد كامل ومجاني', 'Free full setup'),
    t('دعم فني على واتساب', 'WhatsApp tech support'),
  ] : [
    t('تفعيل خلال 30 دقيقة', 'Activated within 30 minutes'),
    t('تفعيل موثوق ومتابعة بعد الشراء', 'Reliable activation with after-sale follow-up'),
    t('بيانات دخول حصرية لك', 'Exclusive credentials for you'),
    t('ضمان طوال مدة الاشتراك', 'Warranty for full subscription period'),
    t('إعداد كامل ومجاني', 'Free full setup'),
    t('دعم فني على واتساب', 'WhatsApp tech support'),
  ];


  return (
    <div className="detail-layout">
      <div className="breadcrumbs">
        <a href="#" onClick={(e) => {e.preventDefault();navigate('home');}}>{t('الرئيسية', 'Home')}</a>
        <span>/</span>
        {cat && <>
          <a href="#" onClick={(e) => {e.preventDefault();navigate('cat:' + cat.id);}}>{t(cat.ar, cat.en)}</a>
          <span>/</span>
        </>}
        <span style={{ color: 'var(--ink)' }}>{brand.brand}</span>
      </div>
      <div className="detail-grid">
        <div className="detail-visual">
          <BrandVisual brand={brand.brand} color={brand.color} glyph={brand.glyph} size="lg" />
        </div>
        <div className="detail-info">
          <div className="brand-line">{brand.brand}</div>
          <h1>{brand.brand}</h1>
          <div style={{ display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', marginTop: 8 }}>
            <span style={{ fontSize: 13, padding: '4px 10px', borderRadius: 99, background: 'var(--bg-3)', border: '1px solid var(--line)', color: 'var(--ink-2)' }}>
              {cat ? t(cat.ar, cat.en) : ''}
            </span>
            <span style={{ fontSize: 13, padding: '4px 10px', borderRadius: 99, background: 'rgba(212,169,62,0.08)', border: '1px solid rgba(212,169,62,0.25)', color: 'var(--gold-2)' }}>
              ⚡ {t('تسليم 30 دقيقة', '30-min delivery')}
            </span>
          </div>
          <p className="desc">
            {isGiftCard ? t(
              `اشتري بطاقة ${brand.brand} الرقمية بالجنيه المصري — كود أصلي يوصلك على واتساب خلال 30 دقيقة. اشحن حسابك أو أهدي صاحبك!`,
              `Buy ${brand.brand} digital gift cards in EGP — authentic code delivered via WhatsApp within 30 minutes. Top up your account or gift a friend!`
            ) : t(
              isChatGptSharedPlan
                ? `استمتع بمزايا ${brand.brand} Plus من خلال حساب مشترك موثوق بسعر اقتصادي. التفعيل سريع والدعم متاح على واتساب لو احتجت أي مساعدة.`
                : `استمتع بكل مزايا ${brand.brand} الرسمية باشتراك أصلي وتفعيل سريع — ادفع بالجنيه المصري واستلم بياناتك خلال 30 دقيقة.`,
              isChatGptSharedPlan
                ? `Enjoy ${brand.brand} Plus through a trusted shared account at an affordable price. Fast activation, with WhatsApp support if you need any help.`
                : `Enjoy every official ${brand.brand} feature with an authentic subscription and fast activation — pay in EGP and receive your credentials within 30 minutes.`
            )}
          </p>

          <h3 style={{ margin: '8px 0 4px', fontSize: 14, color: 'var(--ink-3)', textTransform: 'uppercase', letterSpacing: '0.1em', fontWeight: 700 }}>
            {t('اختر الباقة', 'Choose your plan')}
          </h3>
          {brand.brand === 'ChatGPT' && (
            <div className="plan-guide">
              {t('بلس مشترك: حساب مشترك بسعر اقتصادي · بلس خاص: حساب خاص بيك بالكامل', 'Plus Shared: shared account at an affordable price · Plus Private: fully private account just for you')}
            </div>
          )}
          <div className="plan-options">
            {brand.plans.map((p) =>
            <div key={p.id}
            className={`plan-option ${selectedId === p.id ? 'selected' : ''}`}
            onClick={() => handlePlanSelect(p)}>
                <div>
                  <div className="plan-name-row">
                    <div className="name">{planName(p)}</div>
                    {planBadges(p).map((badge) => (
                      <span key={badge.cls} className={`plan-badge ${badge.cls}`}>{badge.label}</span>
                    ))}
                  </div>
                  <div className="billing">{tBilling(p.billing, lang)}</div>
                  {planHint(p) && <div className="plan-hint">{planHint(p)}</div>}
                </div>
                <div style={{ textAlign: 'left' }}>
                  <span style={{fontSize: 11, padding: '4px 10px', borderRadius: 99, background:'rgba(37,211,102,0.12)', color:'#25D366', border:'1px solid rgba(37,211,102,0.3)', fontWeight:700, display:'inline-flex', alignItems:'center', gap:6}}>
                    <Icon name="wa" size={12}/>
                    {t('اطلب الآن','Order Now')}
                  </span>
                </div>
              </div>
            )}
          </div>

          <ul className="feature-list">
            {features.map((f, i) =>
            <li key={i}><span className="check"><Icon name="check" size={18} /></span>{f}</li>
            )}
          </ul>

          <div className="detail-buy detail-buy-sticky">
            <div className="sticky-selected-package">
              <span>{t('الباقة المختارة', 'Selected plan')}</span>
              <strong>{selectedPackageName}</strong>
            </div>
            <a className="btn btn-gold detail-wa-btn" href={buildWaUrl(selected, lang)} target="_blank" rel="noopener noreferrer"
              onClick={(e) => guardWhatsAppOpen(e, buildWaUrl(selected, lang), lang, { brand: selected.brand, plan: selected.plan, category: selected.category, source: 'brand_detail' })}
              style={{ justifyContent: 'center', background:'#25D366', color:'white', boxShadow:'0 8px 24px rgba(37,211,102,0.3)', textDecoration:'none' }}>
              <Icon name="wa" size={18} />
              {t('أرسل الطلب الآن (واتساب)', 'Order Now (WhatsApp)')}
            </a>
            <button className={`btn btn-ghost detail-add-btn ${addedId === selected.id ? 'is-added' : ''}`} onClick={handleAddSelected} style={{justifyContent:'center'}}>
              <Icon name={addedId === selected.id ? 'check' : 'plus'} size={18} />
              {addedId === selected.id ? t('تمت', 'Added') : t('السلة', 'Cart')}
            </button>
          </div>

          {/* Trust badges */}
          <div style={{
            display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: 10,
            marginTop: 24, padding: 16,
            background: 'var(--bg-2)', border: '1px solid var(--line)',
            borderRadius: 14
          }}>
            {[
              { icon: 'bolt', ar: 'تسليم فوري', en: 'Instant delivery', sub_ar: 'خلال 30 دقيقة', sub_en: 'Within 30 min' },
              { icon: 'shield', ar: 'دفع آمن', en: 'Secure payment', sub_ar: 'محافظ مصرية', sub_en: 'Egyptian wallets' },
              { icon: 'check', ar: 'ضمان كامل', en: 'Full warranty', sub_ar: 'استرداد لو حصلت مشكلة', sub_en: 'Refund if issue' }
            ].map((badge, i) => (
              <div key={i} style={{ textAlign: 'center', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6 }}>
                <div style={{
                  width: 36, height: 36, borderRadius: 10,
                  background: 'rgba(212,169,62,0.1)', border: '1px solid rgba(212,169,62,0.2)',
                  display: 'grid', placeItems: 'center', color: 'var(--gold-2)'
                }}>
                  <Icon name={badge.icon} size={16} />
                </div>
                <div style={{ fontWeight: 700, fontSize: 12 }}>{t(badge.ar, badge.en)}</div>
                <div style={{ fontSize: 10, color: 'var(--ink-3)' }}>{t(badge.sub_ar, badge.sub_en)}</div>
              </div>
            ))}
          </div>
        </div>
      </div>

      {/* Comments section */}
      <CommentsSection brandSlug={slug} brandName={brand.brand} lang={lang} />
    </div>);

};

// === Comments ===
const CommentsSection = ({ brandSlug, brandName, lang }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [name, setName] = useState(() => localStorage.getItem('aisubs_commenter') || '');
  const [text, setText] = useState('');
  const [rating, setRating] = useState(5);
  const [comments, setComments] = useState([]);
  const [loadingComments, setLoadingComments] = useState(false);
  const [submitState, setSubmitState] = useState('idle');
  const [notice, setNotice] = useState('');

  useEffect(() => {
    let active = true;
    setLoadingComments(true);
    fetch(`/api/comments/${encodeURIComponent(brandSlug)}`)
      .then((res) => res.json())
      .then((data) => {
        if (active && data && data.ok) setComments(Array.isArray(data.comments) ? data.comments : []);
      })
      .catch(() => {
        if (active) setComments([]);
      })
      .finally(() => {
        if (active) setLoadingComments(false);
      });
    return () => { active = false; };
  }, [brandSlug]);

  const submit = async (e) => {
    e.preventDefault();
    const cleanName = name.trim();
    const cleanText = text.trim();
    if (!cleanName || !cleanText || submitState === 'sending') return;
    setSubmitState('sending');
    setNotice('');
    try {
      try { localStorage.setItem('aisubs_commenter', cleanName); } catch (err) {}
      const payload = {
        name: cleanName,
        text: cleanText,
        rating,
        brandSlug,
        brandName,
        source: 'review_form',
        route: `brand:${brandSlug}`,
        path: window.location.pathname,
        lang,
        sessionId: typeof analyticsSessionId === 'function' ? analyticsSessionId() : '',
        referrer: typeof analyticsReferrer === 'function' ? analyticsReferrer() : '',
        device: typeof analyticsDevice === 'function' ? analyticsDevice() : '',
        browser: typeof analyticsBrowser === 'function' ? analyticsBrowser() : ''
      };
      const res = await fetch('/api/comments', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(payload)
      });
      const data = await res.json().catch(() => ({}));
      if (!res.ok || !data.ok) throw new Error(data.error || 'Unable to post review');
      setText('');
      setRating(5);
      setSubmitState('sent');
      setNotice(t('تعليقك وصل وهيظهر بعد مراجعة الأدمن.', 'Your review was sent and will appear after admin review.'));
    } catch (err) {
      setSubmitState('error');
      setNotice(t('حصلت مشكلة في إرسال التعليق. حاول تاني بعد شوية.', 'Could not send the review. Please try again shortly.'));
    }
  };

  const avgRating = comments.length ? (comments.reduce((s, c) => s + Number(c.rating || 0), 0) / comments.length).toFixed(1) : null;
  const starText = (score) => {
    const safeScore = Math.max(1, Math.min(5, Number(score) || 5));
    return '★'.repeat(safeScore) + '☆'.repeat(5 - safeScore);
  };

  return (
    <div style={{ marginTop: 40 }}>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 12, marginBottom: 24 }}>
        <div>
          <h2 style={{ fontSize: 22, fontWeight: 800, margin: 0 }}>{t('آراء العملاء', 'Customer Reviews')}</h2>
          <p style={{ fontSize: 13, color: 'var(--ink-3)', margin: '4px 0 0' }}>
            {comments.length} {t('تعليق', 'comments')}
            {avgRating && <> · <span style={{ color: 'var(--gold-2)' }}>★ {avgRating}</span></>}
          </p>
        </div>
      </div>

      {/* Add comment form */}
      <form onSubmit={submit} style={{
        background: 'var(--bg-2)', border: '1px solid var(--line)',
        borderRadius: 14, padding: 20, marginBottom: 24
      }}>
        <div style={{ fontWeight: 700, fontSize: 15, marginBottom: 14 }}>
          {t('أضف تعليقك', 'Add your review')}
        </div>
        <div style={{ display: 'flex', gap: 10, marginBottom: 12, flexWrap: 'wrap' }}>
          <input
            value={name} onChange={(e) => setName(e.target.value)}
            placeholder={t('اسمك', 'Your name')}
            style={{
              flex: '1 1 180px', padding: '10px 14px', borderRadius: 10,
              border: '1px solid var(--line)', background: 'var(--bg-3)',
              color: 'var(--ink)', fontFamily: 'inherit', fontSize: 14
            }}
          />
          <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>
            {[1,2,3,4,5].map(star => (
              <button key={star} type="button" onClick={() => setRating(star)}
                style={{
                  background: 'none', border: 'none', cursor: 'pointer', padding: 2,
                  color: star <= rating ? 'var(--gold-2)' : 'var(--ink-3)',
                  fontSize: 20, transition: '0.15s'
                }}>★</button>
            ))}
          </div>
        </div>
        <textarea
          value={text} onChange={(e) => setText(e.target.value)}
          placeholder={t('اكتب رأيك هنا...', 'Write your review here...')}
          rows={3}
          style={{
            width: '100%', padding: '10px 14px', borderRadius: 10,
            border: '1px solid var(--line)', background: 'var(--bg-3)',
            color: 'var(--ink)', fontFamily: 'inherit', fontSize: 14,
            resize: 'vertical', marginBottom: 12
          }}
        />
        {notice && (
          <div className={`comment-submit-note ${submitState === 'error' ? 'is-error' : ''}`}>
            {notice}
          </div>
        )}
        <button type="submit" className="btn btn-gold btn-sm"
          disabled={!name.trim() || !text.trim() || submitState === 'sending'}
          style={{ width: '100%', justifyContent: 'center' }}>
          {submitState === 'sending' ? t('جاري الإرسال...', 'Sending...') : t('إرسال للمراجعة', 'Send for review')}
        </button>
      </form>

      {/* Comments list */}
      {comments.length === 0 ? (
        <div style={{ textAlign: 'center', padding: '32px 16px', color: 'var(--ink-3)', fontSize: 14 }}>
          {loadingComments ? t('جاري تحميل التعليقات...', 'Loading reviews...') : t('لا توجد تعليقات منشورة بعد.', 'No published reviews yet.')}
        </div>
      ) : (
        <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          {comments.map(c => (
            <div key={c.id} style={{
              background: 'var(--bg-2)', border: '1px solid var(--line)',
              borderRadius: 14, padding: 16
            }}>
              <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 8 }}>
                <div style={{
                  width: 36, height: 36, borderRadius: '50%',
                  background: 'linear-gradient(135deg, var(--gold-3), var(--gold))',
                  display: 'grid', placeItems: 'center',
                  color: '#0a0908', fontWeight: 800, fontSize: 15
                }}>{c.name[0].toUpperCase()}</div>
                <div style={{ flex: 1 }}>
                  <div style={{ fontWeight: 700, fontSize: 14 }}>{c.name}</div>
                  <div style={{ fontSize: 11, color: 'var(--ink-3)' }}>
                    {c.ts ? new Date(c.ts).toLocaleDateString(lang === 'ar' ? 'ar-EG' : 'en-US', { year: 'numeric', month: 'short', day: 'numeric' }) : ''}
                  </div>
                </div>
                <div style={{ color: 'var(--gold-2)', fontSize: 13, letterSpacing: 2 }}>
                  {starText(c.rating)}
                </div>
              </div>
              <p style={{ margin: 0, fontSize: 14, color: 'var(--ink-2)', lineHeight: 1.7 }}>{c.text}</p>
            </div>
          ))}
        </div>
      )}
    </div>
  );
};

// === Account page ===
const AccountPage = ({ user, orders, lang, navigate, logout }) => {
  const t = (ar, en) => lang === 'en' ? en : ar;
  const [tab, setTab] = useState('orders');

  return (
    <div className="account-grid">
      <aside className="account-side">
        <div className="user-card">
          <div className="avatar">{user.name[0].toUpperCase()}</div>
          <div>
            <div style={{ fontWeight: 700 }}>{user.name}</div>
            <div style={{ fontSize: 12, color: 'var(--ink-3)' }}>{user.email}</div>
          </div>
        </div>
        <button className={`acc-link ${tab === 'orders' ? 'active' : ''}`} onClick={() => setTab('orders')}>
          <Icon name="box" size={18} /> {t('طلباتي', 'My Orders')}
        </button>
        <button className={`acc-link ${tab === 'profile' ? 'active' : ''}`} onClick={() => setTab('profile')}>
          <Icon name="user" size={18} /> {t('بياناتي', 'Profile')}
        </button>
        <button className={`acc-link ${tab === 'wishlist' ? 'active' : ''}`} onClick={() => setTab('wishlist')}>
          <Icon name="heart" size={18} /> {t('المفضّلة', 'Wishlist')}
        </button>
        <button className="acc-link" onClick={logout} style={{ color: 'var(--danger)', marginTop: 8 }}>
          <Icon name="logout" size={18} /> {t('تسجيل الخروج', 'Sign out')}
        </button>
      </aside>
      <div>
        {tab === 'orders' &&
        <div>
            <h1 style={{ fontSize: 28, fontWeight: 800, marginTop: 0 }}>{t('طلباتي', 'My Orders')}</h1>
            <p style={{ color: 'var(--ink-2)', marginBottom: 24 }}>{orders.length} {t('طلب', 'orders')}</p>
            {orders.length === 0 ?
          <div className="empty-state" style={{ background: 'var(--bg-2)', borderRadius: 14, border: '1px solid var(--line)' }}>
                <Icon name="box" size={48} />
                <p style={{ margin: '16px 0 4px' }}>{t('لا توجد طلبات بعد', 'No orders yet')}</p>
                <button className="btn btn-gold btn-sm" onClick={() => navigate('catalog')} style={{ marginTop: 12 }}>
                  {t('ابدأ التسوق', 'Start shopping')}
                </button>
              </div> :

          orders.map((o) =>
          <div key={o.id} className="order-row">
                  <div className="order-head">
                    <div>
                      <div className="id">#{o.id}</div>
                      <div className="date">{o.date}</div>
                    </div>
                    <span className={`status-pill ${o.status === 'delivered' ? 'delivered' : 'pending'}`}>
                      {o.status === 'delivered' ? t('تم التسليم', 'Delivered') : t('قيد المعالجة', 'Processing')}
                    </span>
                  </div>
                  <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
                    {o.items.map((it, i) =>
              <div key={i} className="summary-item">
                        <ThumbSm brand={it.brand} color={it.color} glyph={it.glyph} size={40} />
                        <div className="info">
                          <div className="b">{it.brand}</div>
                          <div className="p">{displayPlanName(it, lang)}</div>
                        </div>
                        <div className="qty">×{it.qty}</div>
                        <div className="price">{fmtPrice(it.priceNum * it.qty)} <span style={{ fontSize: 11, color: 'var(--ink-3)' }}>EGP</span></div>
                      </div>
              )}
                  </div>
                  <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 14, paddingTop: 14, borderTop: '1px solid var(--line)' }}>
                    <span style={{ color: 'var(--ink-2)', fontSize: 14 }}>{t('الإجمالي', 'Total')}</span>
                    <span style={{ fontFamily: 'Inter', fontWeight: 800, fontSize: 18 }}>{fmtPrice(o.total)} <span style={{ fontSize: 12, color: 'var(--ink-3)' }}>EGP</span></span>
                  </div>
                </div>
          )
          }
          </div>
        }
        {tab === 'profile' &&
        <div className="panel">
            <h2>{t('بياناتي', 'Profile')}</h2>
            <p className="sub">{t('عدّل بياناتك الشخصية', 'Edit your personal information')}</p>
            <div className="form-row">
              <label>{t('الاسم', 'Name')}</label>
              <input defaultValue={user.name} />
            </div>
            <div className="form-row">
              <label>{t('الإيميل', 'Email')}</label>
              <input defaultValue={user.email} />
            </div>
            <div className="form-row">
              <label>{t('رقم الموبايل', 'Phone')}</label>
              <input defaultValue={user.phone || ''} placeholder="+20 1XXXXXXXXX" />
            </div>
            <button className="btn btn-gold" style={{ marginTop: 8 }}>
              <Icon name="check" size={18} /> {t('حفظ التعديلات', 'Save changes')}
            </button>
          </div>
        }
        {tab === 'wishlist' &&
        <div className="empty-state" style={{ background: 'var(--bg-2)', borderRadius: 14, border: '1px solid var(--line)' }}>
            <Icon name="heart" size={48} />
            <p style={{ margin: '16px 0 4px' }}>{t('مفيش حاجة في المفضّلة لسه', 'Wishlist is empty')}</p>
          </div>
        }
      </div>
    </div>);

};

Object.assign(window, {
  Header, Footer, Hero, CategoryStrip, BestSellers, TrustStrip,
  HomePage, CatalogPage, BrandPage, LeadCapturePopup
});
