// pages.jsx — Page components for Kids of Jupiter
const { T, cls, Logo, PlanetMark, Button, productName, useProducts, useConfig, useCollections, buildWaSingle, buildWaCart, openWa, WHATSAPP } = window.KOJ_Site_Helpers;

function formatSizeRange(sizes) {
  if (!sizes || sizes.length === 0) return '';
  const nums = [...new Set(sizes.map(Number))].sort((a, b) => a - b);
  const ranges = [];
  let start = nums[0], prev = nums[0];
  for (let i = 1; i <= nums.length; i++) {
    if (i < nums.length && nums[i] === prev + 1) {
      prev = nums[i];
    } else {
      ranges.push(start === prev ? `${start}` : `${start}-${prev}`);
      if (i < nums.length) { start = prev = nums[i]; }
    }
  }
  return ranges.join(', ') + ' yaş';
}
const { useState: useS, useMemo: useM, useEffect: useE, useRef: useR } = React;

function ThemeToggle({ theme, toggleTheme }) {
  const isDark = theme === 'boutique';
  return (
    <button
      className="koj-icon-btn"
      onClick={toggleTheme}
      aria-label={isDark ? 'Switch to Light Mode' : 'Switch to Dark Mode'}
      title={isDark ? 'Açık Moda Geç (Light Mode)' : 'Koyu Moda Geç (Dark Mode)'}
    >
      {isDark ? (
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
      ) : (
        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
      )}
    </button>
  );
}

// ─── Header ──────────────────────────────────────────────────────────────────
function Header({ lang, setLang, route, go, cartCount, openCart, openMenu, theme, toggleTheme }) {
  const t = T(lang);
  const config = useConfig();
  const [scrolled, setScrolled] = useS(false);
  useE(() => {
    const fn = () => setScrolled(window.scrollY > 12);
    window.addEventListener('scroll', fn, {passive:true});
    return () => window.removeEventListener('scroll', fn);
  }, []);

  const links = [
    ['#/shop',        t.nav.shop],
    ['#/collections', t.nav.collections],
    ['#/new',         t.nav.new],
    ['#/about',       t.nav.about],
    ['#/contact',     t.nav.contact],
  ];

  return (
    <header className={cls('koj-header', scrolled && 'is-scrolled')}>
      <div className="koj-header-inner">
        <button className="koj-icon-btn koj-mobile-only" aria-label={t.misc.menu} onClick={openMenu}>
          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M3 7h18M3 12h18M3 17h18"/></svg>
        </button>
        <Logo height={30} config={config} />
        <nav className="koj-nav koj-desktop-only">
          {links.map(([href, label]) => (
            <a key={href} href={href} className={cls('koj-navlink', route.startsWith(href) && 'is-active')}>{label}</a>
          ))}
        </nav>
        <div className="koj-header-right">
          <ThemeToggle theme={theme} toggleTheme={toggleTheme} />
          <LangSwitcher lang={lang} setLang={setLang} />
          <button className="koj-icon-btn" aria-label={t.misc.cart} onClick={openCart}>
            <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.4"><path d="M5 7h14l-1.4 11.2a2 2 0 0 1-2 1.8H8.4a2 2 0 0 1-2-1.8L5 7z"/><path d="M9 7V5a3 3 0 0 1 6 0v2"/></svg>
            {cartCount > 0 && <span className="koj-cart-badge">{cartCount}</span>}
          </button>
        </div>
      </div>
    </header>
  );
}

function LangSwitcher({ lang, setLang }) {
  const langs = [['tr','TR'],['en','EN'],['ar','AR'],['ru','RU']];
  const [open, setOpen] = useS(false);
  const ref = useR(null);
  useE(() => {
    const fn = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    document.addEventListener('click', fn);
    return () => document.removeEventListener('click', fn);
  }, []);
  const current = langs.find(l => l[0] === lang) || langs[0];
  return (
    <div className="koj-lang" ref={ref}>
      <button className="koj-lang-btn" onClick={() => setOpen(v => !v)} aria-label="Language">
        <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.4"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"/></svg>
        <span>{current[1]}</span>
      </button>
      {open && (
        <div className="koj-lang-menu">
          {langs.map(([code, label]) => (
            <button key={code} className={cls('koj-lang-item', code === lang && 'is-active')} onClick={() => { setLang(code); setOpen(false); }}>
              {label} <span style={{opacity:.55}}>{ {tr:'Türkçe', en:'English', ar:'العربية', ru:'Русский'}[code]}</span>
            </button>
          ))}
        </div>
      )}
    </div>
  );
}

// ─── Mobile menu ─────────────────────────────────────────────────────────────
function MobileMenu({ open, onClose, lang, setLang, t }) {
  const config = useConfig();
  if (!open) return null;
  const links = [
    ['#/',            t.nav.home],
    ['#/shop',        t.nav.shop],
    ['#/collections', t.nav.collections],
    ['#/new',         t.nav.new],
    ['#/about',       t.nav.about],
    ['#/contact',     t.nav.contact],
  ];
  return (
    <div className="koj-drawer">
      <div className="koj-drawer-inner">
        <div className="koj-drawer-head">
          <Logo height={26} config={config} />
          <button className="koj-icon-btn" onClick={onClose}><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
        </div>
        <nav className="koj-drawer-nav">
          {links.map(([h, l]) => <a key={h} href={h} onClick={onClose}>{l}</a>)}
        </nav>
      </div>
    </div>
  );
}

// ─── Home ─────────────────────────────────────────────────────────────────────
function HomePage({ lang, go, addToCart }) {
  const t = T(lang);
  const products = useProducts();
  const featured = products.filter(p => p.pop >= 8).slice(0, 4);
  const newest = products.filter(p => p.isNew).slice(0, 6);
  return (
    <main>
      <Hero t={t} lang={lang} />
      <Categories t={t} go={go} />
      <FeaturedRow title={t.featured.title} eyebrow={t.featured.eyebrow} products={featured} lang={lang} t={t} />
      <StoryStrip t={t} lang={lang} />
      <NewArrivals t={t} products={newest} lang={lang} go={go} />
      <CtaWa t={t} lang={lang} />
    </main>
  );
}

function drawSnowflake(ctx, x, y, radius, opacity) {
  ctx.save();
  ctx.translate(x, y);
  ctx.strokeStyle = `rgba(255, 255, 255, ${opacity})`;
  ctx.lineWidth = 1.2;
  ctx.beginPath();
  for (let i = 0; i < 6; i++) {
    ctx.moveTo(0, 0);
    ctx.lineTo(0, -radius);
    ctx.moveTo(0, -radius * 0.55);
    ctx.lineTo(-radius * 0.35, -radius * 0.75);
    ctx.moveTo(0, -radius * 0.55);
    ctx.lineTo(radius * 0.35, -radius * 0.75);
    ctx.rotate(Math.PI / 3);
  }
  ctx.stroke();
  ctx.restore();
}

function GlobalSnowCanvas() {
  const canvasRef = useR(null);
  useE(() => {
    const canvas = canvasRef.current;
    if (!canvas) return;
    const ctx = canvas.getContext('2d');
    let animationFrameId;

    let width = (canvas.width = window.innerWidth);
    let height = (canvas.height = window.innerHeight);

    const handleResize = () => {
      if (!canvas) return;
      width = canvas.width = window.innerWidth;
      height = canvas.height = window.innerHeight;
    };
    window.addEventListener('resize', handleResize);

    const numParticles = 75;
    const particles = Array.from({ length: numParticles }, () => ({
      x: Math.random() * width,
      y: Math.random() * height,
      r: Math.random() * 3.5 + 1.2,
      d: Math.random() * numParticles,
      opacity: Math.random() * 0.65 + 0.3,
      speedY: Math.random() * 0.8 + 0.4,
      isSnowflake: Math.random() < 0.3,
      color: Math.random() > 0.35 ? 'rgba(255, 255, 255,' : 'rgba(226, 184, 94,'
    }));

    let angle = 0;
    const render = () => {
      ctx.clearRect(0, 0, width, height);
      angle += 0.008;

      particles.forEach((p) => {
        p.y += p.speedY + Math.cos(angle + p.d) * 0.4;
        p.x += Math.sin(angle) * 0.8;

        if (p.y > height + 15) {
          p.y = -15;
          p.x = Math.random() * width;
        }
        if (p.x > width + 15) p.x = -15;
        if (p.x < -15) p.x = width + 15;

        if (p.isSnowflake) {
          drawSnowflake(ctx, p.x, p.y, p.r * 2.2, p.opacity);
        } else {
          ctx.beginPath();
          ctx.fillStyle = `${p.color}${p.opacity})`;
          ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2, true);
          ctx.fill();
        }
      });

      animationFrameId = requestAnimationFrame(render);
    };

    render();

    return () => {
      window.removeEventListener('resize', handleResize);
      cancelAnimationFrame(animationFrameId);
    };
  }, []);

  return (
    <canvas
      ref={canvasRef}
      className="koj-global-snow"
      aria-hidden="true"
      style={{
        position: 'fixed',
        inset: 0,
        width: '100vw',
        height: '100vh',
        pointerEvents: 'none',
        zIndex: 9999
      }}
    />
  );
}
window.KOJ_GlobalSnowCanvas = GlobalSnowCanvas;

function Hero({ t, lang }) {
  const config = useConfig();
  const L = lang.charAt(0).toUpperCase() + lang.slice(1);
  const eyebrow = config.heroEyebrow || t.hero.eyebrow;
  const title   = config['heroTitle'+L] || config.heroTitleTr || t.hero.title;
  const sub     = config['heroSub'+L]   || config.heroSubTr   || t.hero.sub;
  const cta     = config['heroCta'+L]   || config.heroCtaTr   || t.hero.cta;
  const cta2    = config['heroCta2'+L]  || config.heroCta2Tr  || t.hero.cta2;

  // Slider Logic
  const slides = useM(() => {
    const list = [config.heroSlide1, config.heroSlide2, config.heroSlide3, config.heroSlide4, config.heroSlide5, config.heroSlide6].filter(Boolean);
    return list.length >= 3 ? list : [
      'assets/products/product-02-boy-rock.png',
      'assets/products/product-03-boy-cap-front.png',
      'assets/products/product-06-boy-cap-side.png',
      'assets/products/product-08-shirt-shorts.png',
      'assets/products/product-01-flatlay-set.png'
    ];
  }, [config]);

  const [active, setActive] = useS(0);
  useE(() => {
    if (slides.length <= 1) return;
    const itv = setInterval(() => setActive(v => (v + 1) % slides.length), 4500);
    return () => clearInterval(itv);
  }, [slides.length]);

  return (
    <section className="koj-hero">
      <div className="koj-hero-grid">
        <div className="koj-hero-text koj-reveal">
          <span className="koj-eyebrow koj-reveal koj-reveal-delay-1">{eyebrow}</span>
          <h1 className="koj-h1 koj-reveal koj-reveal-delay-2">{title}</h1>
          <p className="koj-lead koj-reveal koj-reveal-delay-3">{sub}</p>
          <div className="koj-hero-ctas koj-reveal koj-reveal-delay-4">
            <Button as="a" href="#/shop" variant="primary">{cta}</Button>
            <Button as="a" href="#/about" variant="ghost">{cta2}</Button>
          </div>
          <div className="koj-hero-meta koj-reveal koj-reveal-delay-5">
            <span>· {t.about.stats[0].n} {t.about.stats[0].l}</span>
            <span>· {t.about.stats[3].n}</span>
          </div>
        </div>
        <div className="koj-hero-img-wrap koj-reveal koj-reveal-delay-2">
          <div className="koj-hero-slider">
             {slides.map((s, i) => (
               <img key={i} className={cls('koj-hero-slide', active === i && 'is-active')} src={s} alt="" />
             ))}
          </div>
          <span className="koj-hero-tag">BORN TO EXPLORE</span>
        </div>
      </div>
    </section>
  );
}

function Categories({ t, go }) {
  const cats = [
    { key:'dress',  label:t.cats.dress,  img:'assets/products/product-01-flatlay-set.png' },
    { key:'shorts', label:t.cats.shorts, img:'assets/products/product-07-shorts-detail.png' },
    { key:'set',    label:t.cats.set,    img:'assets/products/product-08-shirt-shorts.png' },
    { key:'shirt',  label:t.cats.shirt,  img:'assets/products/product-03-boy-cap-front.png' },
    { key:'tee',    label:t.cats.tee,    img:'assets/products/product-05-knit-detail.png' },
  ];
  return (
    <section className="koj-section koj-reveal">
      <div className="koj-section-head">
        <span className="koj-eyebrow">{t.cats.title}</span>
      </div>
      <div className="koj-cats">
        {cats.map((c, idx) => (
          <a key={c.key} className={cls("koj-cat koj-reveal", `koj-reveal-delay-${(idx % 5) + 1}`)} href={`#/shop?cat=${c.key}`}>
            <div className="koj-cat-img"><img src={c.img} alt="" /></div>
            <span className="koj-cat-label">{c.label}</span>
          </a>
        ))}
      </div>
    </section>
  );
}

function FeaturedRow({ title, eyebrow, products, lang, t }) {
  if (!products.length) return null;
  return (
    <section className="koj-section koj-reveal">
      <div className="koj-section-head">
        <span className="koj-eyebrow">{eyebrow}</span>
        <h2 className="koj-h2">{title}</h2>
      </div>
      <div className="koj-product-grid koj-grid-4">
        {products.map((p, idx) => (
          <ProductCard key={p.id} p={p} lang={lang} t={t} className={cls("koj-reveal", `koj-reveal-delay-${(idx % 4) + 1}`)} />
        ))}
      </div>
    </section>
  );
}

function ProductCard({ p, lang, t, className }) {
  const fallback = 'assets/products/product-01-flatlay-set.png';
  const [imgSrc, setImgSrc] = useS(p.img || fallback);
  useE(() => { setImgSrc(p.img || fallback); }, [p.img]);

  return (
    <a className={cls("koj-card", className)} href={`#/p/${p.id}`}>
      <div className="koj-card-img">
        <img src={imgSrc} alt="" loading="lazy" onError={() => setImgSrc(fallback)} />
        {p.isNew && <span className="koj-badge">NEW</span>}
        <span className="koj-card-hover">{t.featured.view} →</span>
      </div>
      <div className="koj-card-meta">
        <span className="koj-card-name">{productName(p, lang)}</span>
        <span className="koj-card-price">{p.price ? `₺${p.price}` : t.product.ask}</span>
      </div>
    </a>
  );
}

function StoryStrip({ t, lang }) {
  const config = useConfig();
  const L = lang.charAt(0).toUpperCase() + lang.slice(1);
  const eyebrow = config.storyEyebrow || t.story.eyebrow;
  const title   = config['storyTitle'+L] || config.storyTitleTr || t.story.title;
  const body    = config['storyBody'+L]  || config.storyBodyTr  || t.story.body;
  const cta     = config['storyCta'+L]   || config.storyCtaTr   || t.story.cta;

  return (
    <section className="koj-section koj-reveal koj-story">
      <div className="koj-story-grid">
        <div className="koj-story-img koj-reveal koj-reveal-delay-1">
          <img src="assets/products/product-06-boy-cap-side.png" alt="" />
        </div>
        <div className="koj-story-text koj-reveal koj-reveal-delay-2">
          <span className="koj-eyebrow">{eyebrow}</span>
          <h2 className="koj-h2">{title}</h2>
          <p className="koj-lead">{body}</p>
          <Button as="a" href="#/about" variant="link">{cta} →</Button>
        </div>
      </div>
    </section>
  );
}

function NewArrivals({ t, products, lang }) {
  if (!products.length) return null;
  return (
    <section className="koj-section koj-reveal">
      <div className="koj-section-head koj-section-head-row">
        <div>
          <span className="koj-eyebrow">{t.new.eyebrow}</span>
          <h2 className="koj-h2">{t.new.title}</h2>
        </div>
        <a className="koj-link" href="#/shop">{t.new.viewAll} →</a>
      </div>
      <div className="koj-product-grid koj-grid-3">
        {products.map((p, idx) => (
          <ProductCard key={p.id} p={p} lang={lang} t={t} className={cls("koj-reveal", `koj-reveal-delay-${(idx % 3) + 1}`)} />
        ))}
      </div>
    </section>
  );
}

function CtaWa({ t, lang }) {
  const config = useConfig();
  const mapQuery = config.contactAddr || 'Platform Merter, Ali Gürcan Caddesi No:27/1, Abdurrahman Gürman Mahallesi, 34160 Merter, Güngören, İstanbul';
  const mapEmbed = `https://www.google.com/maps?q=${encodeURIComponent(mapQuery)}&z=16&output=embed`;
  const mapDir   = `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(mapQuery)}`;

  const stat1 = config.aboutStat4N || t.cta.stat1;
  const stat1v = config.contactAddr || t.cta.stat1v;
  const stat2 = config.aboutStat1LTr || t.cta.stat2;
  const stat2v = config.aboutStat1N || t.cta.stat2v;
  const stat3 = config.aboutStat3LTr || t.cta.stat3;
  const stat3v = config.aboutStat3N || t.cta.stat3v;

  return (
    <section className="koj-section">
      <div className="koj-atelier koj-reveal">
        <div className="koj-atelier-img koj-reveal koj-reveal-delay-1">
          <img src="assets/products/product-10-fabric.png" alt="" />
        </div>
        <div className="koj-atelier-text koj-reveal koj-reveal-delay-2">
          <span className="koj-eyebrow">{t.cta.eyebrow}</span>
          <h2 className="koj-h2">{t.cta.title}</h2>
          <p className="koj-lead">{t.cta.body}</p>
          <dl className="koj-atelier-stats">
            <div className="koj-reveal koj-reveal-delay-3"><dt>{stat1}</dt><dd>{stat1v}</dd></div>
            <div className="koj-reveal koj-reveal-delay-4"><dt>{stat2}</dt><dd>{stat2v}</dd></div>
            <div className="koj-reveal koj-reveal-delay-5"><dt>{stat3}</dt><dd>{stat3v}</dd></div>
          </dl>
          <Button as="a" href="#/about" variant="ghost">{t.cta.btn} →</Button>
        </div>
      </div>
      <div className="koj-mapwrap koj-reveal" style={{marginTop:'48px'}}>
        <div className="koj-map-meta koj-reveal koj-reveal-delay-1">
          <span className="koj-eyebrow">{t.cta.mapTitle}</span>
          <p className="koj-lead" style={{margin:'6px 0 14px', whiteSpace:'pre-line'}}>{config.contactAddr || t.cta.mapSub}</p>
          <a className="koj-link" href={mapDir} target="_blank" rel="noopener">{t.cta.directions} →</a>
        </div>
        <div className="koj-map-frame koj-reveal koj-reveal-delay-2">
          <iframe src={mapEmbed} loading="lazy" referrerPolicy="no-referrer-when-downgrade" allowFullScreen title="Map"></iframe>
        </div>
      </div>
    </section>
  );
}

function WaIcon({ size = 18 }) {
  return (
    <svg width={size} height={size} viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19.05 4.95A10 10 0 0 0 4.04 17.6L3 21l3.5-1.02A10 10 0 1 0 19.05 4.95zm-7.04 15.05a8.3 8.3 0 0 1-4.23-1.16l-.3-.18-2.07.6.62-2.02-.2-.32A8.32 8.32 0 1 1 12 20zm4.78-6.22c-.26-.13-1.55-.77-1.79-.86-.24-.09-.42-.13-.6.13-.18.26-.69.86-.84 1.04-.16.18-.31.2-.57.07-.26-.13-1.1-.41-2.1-1.3-.78-.7-1.31-1.55-1.46-1.81-.15-.26-.02-.4.11-.53.11-.11.26-.31.39-.46.13-.15.18-.26.26-.44.09-.18.04-.33-.02-.46-.07-.13-.6-1.46-.83-2-.22-.52-.44-.45-.6-.46l-.51-.01c-.18 0-.46.07-.7.33-.24.26-.92.9-.92 2.2 0 1.3.94 2.55 1.07 2.73.13.18 1.85 2.83 4.49 3.97.63.27 1.12.43 1.5.55.63.2 1.21.17 1.66.1.51-.08 1.55-.63 1.77-1.24.22-.6.22-1.13.16-1.24-.07-.11-.24-.18-.5-.31z"/></svg>
  );
}

// ─── Shop / Catalog ───────────────────────────────────────────────────────────
function ShopPage({ lang, route, go }) {
  const t = T(lang);
  const products = useProducts();
  const params = useM(() => {
    const q = route.split('?')[1] || '';
    const o = {};
    q.split('&').filter(Boolean).forEach(kv => { const [k,v] = kv.split('='); o[k] = decodeURIComponent(v||''); });
    return o;
  }, [route]);
  const [cat, setCat] = useS(params.cat || 'all');
  useE(() => { setCat(params.cat || 'all'); }, [params.cat]);
  const [sort, setSort] = useS('new');

  const filtered = useM(() => {
    let list = cat === 'all' ? products : products.filter(p => p.cat === cat);
    if (sort === 'pop') list = [...list].sort((a,b) => (b.pop||0) - (a.pop||0));
    if (sort === 'az')  list = [...list].sort((a,b) => productName(a, lang).localeCompare(productName(b, lang)));
    if (sort === 'new') list = [...list].sort((a,b) => (b.isNew?1:0) - (a.isNew?1:0));
    return list;
  }, [cat, sort, lang, products]);

  const allCats = [['all', t.cats.all], ['dress', t.cats.dress], ['shorts', t.cats.shorts], ['set', t.cats.set], ['shirt', t.cats.shirt], ['tee', t.cats.tee]];
  // Hide categories that have no products
  const cats = allCats.filter(([k]) => k === 'all' || products.some(p => p.cat === k));
  const sorts = [['new', t.catalog.sortNew], ['pop', t.catalog.sortPop], ['az', t.catalog.sortAZ]];

  return (
    <main>
      <section className="koj-section koj-catalog-head">
        <span className="koj-eyebrow">{t.nav.shop}</span>
        <h1 className="koj-h1">{t.catalog.title}</h1>
        <p className="koj-lead" style={{maxWidth:520}}>{t.hero.sub}</p>
      </section>
      <section className="koj-section">
        <div className="koj-catalog-bar">
          <div className="koj-chips">
            {cats.map(([k,l]) => (
              <button key={k} className={cls('koj-chip', cat===k && 'is-active')} onClick={() => { setCat(k); go(`#/shop${k==='all'?'':'?cat='+k}`); }}>{l}</button>
            ))}
          </div>
          <div className="koj-catalog-meta">
            <span className="koj-results-count">{filtered.length} {t.catalog.results}</span>
            <select className="koj-select" value={sort} onChange={e => setSort(e.target.value)}>
              {sorts.map(([k,l]) => <option key={k} value={k}>{t.catalog.sort}: {l}</option>)}
            </select>
          </div>
        </div>
        <div className="koj-product-grid koj-grid-4">
          {filtered.map(p => <ProductCard key={p.id} p={p} lang={lang} t={t} />)}
        </div>
      </section>
    </main>
  );
}

// ─── Product detail ───────────────────────────────────────────────────────────
function ProductPage({ lang, productId, addToCart, go }) {
  const t = T(lang);
  const products = useProducts();
  const p = products.find(x => x.id === productId);
  if (!p) return (
    <main className="koj-section">
      <h1 className="koj-h1">404</h1>
      <a className="koj-link" href="#/shop">← {t.nav.shop}</a>
    </main>
  );
  const [size, setSize] = useS(p.sizes?.[0] || '');
  const [color, setColor] = useS(p.colors?.[0] || '');
  const [qty, setQty] = useS(1);
  const [activeImg, setActiveImg] = useS(0);

  // Galeri: önce renk görselleri, sonra ana görsel, tekrar olmasın
  const gallery = useM(() => {
    if (p.images && Array.isArray(p.images) && p.images.length > 0) {
      return p.images;
    }
    const imgs = [];
    if (p.img) imgs.push(p.img);
    if (p.colorImages) {
      Object.values(p.colorImages).forEach(url => {
        if (url && !imgs.includes(url)) imgs.push(url);
      });
    }
    return imgs.length ? imgs : ['assets/products/product-05-knit-detail.png'];
  }, [p]);

  // Renk değişince o rengin fotoğrafına geç
  useE(() => {
    const colorUrl = p.colorImages?.[color];
    if (colorUrl) {
      const idx = gallery.indexOf(colorUrl);
      setActiveImg(idx >= 0 ? idx : 0);
    } else {
      setActiveImg(0);
    }
  }, [color]);

  const related = products.filter(x => x.id !== p.id && x.cat === p.cat).slice(0, 4);

  return (
    <main>
      <div className="koj-section">
        <a className="koj-back" href="#/shop">← {t.misc.back}</a>
      </div>
      <section className="koj-section koj-pdp">
        <div className="koj-pdp-gallery">
          <div className="koj-pdp-thumbs">
            {gallery.map((g, i) => (
              <button key={i} className={cls('koj-pdp-thumb', activeImg===i && 'is-active')} onClick={() => setActiveImg(i)}>
                <img src={g} alt="" />
              </button>
            ))}
          </div>
          <div className="koj-pdp-main">
            <img src={gallery[activeImg]} alt="" />
            {p.isNew && <span className="koj-badge koj-badge-lg">NEW</span>}
          </div>
        </div>
        <div className="koj-pdp-info">
          <span className="koj-eyebrow">{t.cats[p.cat]}</span>
          <h1 className="koj-h1 koj-h1-md">{productName(p, lang)}</h1>
          <span className="koj-pdp-price">{p.price ? `₺${p.price}` : t.product.ask}</span>
          <span className="koj-pdp-code">{t.product.code}: {p.id}</span>

          {p.colors?.length > 0 && (
            <div className="koj-pdp-field">
              <label className="koj-field-label">{t.product.color}</label>
              <div className="koj-options">
                {p.colors.map(c => (
                  <button key={c} className={cls('koj-pill', color===c && 'is-active')} onClick={() => setColor(c)}>{window.KOJ_translateColor(c, lang)}</button>
                ))}
              </div>
            </div>
          )}
          {p.sizes?.length > 0 && (
            <div className="koj-pdp-field">
              <label className="koj-field-label">{t.product.size}</label>
              <div className="koj-options">
                {p.sizes.map(s => (
                  <button key={s} className={cls('koj-size', size===s && 'is-active')} onClick={() => setSize(s)}>{s}</button>
                ))}
              </div>
              <span style={{fontSize:'12px', opacity:.6, marginTop:'4px', display:'block'}}>{formatSizeRange(p.sizes)}</span>
            </div>
          )}
          <div className="koj-pdp-field">
            <label className="koj-field-label">{t.cart.qty}</label>
            <div className="koj-qty">
              <button onClick={() => setQty(q => Math.max(1, q-1))}>−</button>
              <span>{qty}</span>
              <button onClick={() => setQty(q => q+1)}>+</button>
            </div>
          </div>

          <div className="koj-pdp-actions">
            <Button variant="primary" onClick={() => { addToCart({ id:p.id, size, color, qty }); window.dispatchEvent(new CustomEvent('koj:open-cart')); }}>{t.product.add}</Button>
          </div>

          {/* Product Description */}
          {(p.descTr || p.descEn) && (
            <div className="koj-pdp-desc">
              <p>{p['desc' + lang.charAt(0).toUpperCase() + lang.slice(1)] || p.descTr || p.descEn}</p>
            </div>
          )}

          <div className="koj-pdp-details">
            <h3 className="koj-h4">{t.product.details}</h3>
            <dl>
              {p.material && <div><dt>{t.product.material}</dt><dd>{p.material[lang] || p.material.en}</dd></div>}
              <div><dt>{t.product.care}</dt><dd>30°C · {lang==='tr'?'Düşük ısıda':'Low temp'}</dd></div>
              <div><dt>{t.product.code}</dt><dd>{p.id}</dd></div>
            </dl>
          </div>
        </div>
      </section>

      {related.length > 0 && (
        <section className="koj-section">
          <div className="koj-section-head">
            <h2 className="koj-h2">{t.product.related}</h2>
          </div>
          <div className="koj-product-grid koj-grid-4">
            {related.map(r => <ProductCard key={r.id} p={r} lang={lang} t={t} />)}
          </div>
        </section>
      )}
    </main>
  );
}

// ─── About ────────────────────────────────────────────────────────────────────
function AboutPage({ lang }) {
  const t = T(lang);
  const config = useConfig();
  const L = lang.charAt(0).toUpperCase() + lang.slice(1);
  
  const eyebrow = config.aboutEyebrow || t.about.eyebrow;
  const title   = config['aboutTitle'+L] || config.aboutTitleTr || t.about.title;
  const p1      = config['aboutP1'+L]    || config.aboutP1Tr    || t.about.p1;
  const p2      = config['aboutP2'+L]    || config.aboutP2Tr    || t.about.p2;

  const stats = [1,2,3,4].map(n => ({
    n: config[`aboutStat${n}N`] || t.about.stats[n-1].n,
    l: config[`aboutStat${n}L`+L] || config[`aboutStat${n}LTr`] || t.about.stats[n-1].l
  }));

  const mainImg = config.aboutMainImg || "assets/products/product-01-flatlay-set.png";
  const strips = [config.aboutStrip1, config.aboutStrip2, config.aboutStrip3].filter(Boolean);
  if (strips.length === 0) strips.push("assets/products/product-04-boy-back.png", "assets/products/product-09-hanging.png", "assets/products/product-07-shorts-detail.png");

  return (
    <main>
      <section className="koj-section koj-about-hero koj-reveal">
        <span className="koj-eyebrow">{eyebrow}</span>
        <h1 className="koj-h1 koj-h1-xl">{title}</h1>
      </section>
      <section className="koj-section koj-about-grid koj-reveal">
        <div className="koj-about-img koj-reveal koj-reveal-delay-1"><img src={mainImg} alt="" /></div>
        <div className="koj-about-text koj-reveal koj-reveal-delay-2">
          <p className="koj-lead">{p1}</p>
          <p className="koj-lead">{p2}</p>
        </div>
      </section>
      <section className="koj-section koj-reveal">
        <div className="koj-stats">
          {stats.map((s, i) => (
            <div key={i} className={cls("koj-stat koj-reveal", `koj-reveal-delay-${i + 1}`)}>
              <span className="koj-stat-n">{s.n}</span>
              <span className="koj-stat-l">{s.l}</span>
            </div>
          ))}
        </div>
      </section>
      <section className="koj-section koj-about-strip koj-reveal">
        {strips.map((s, i) => <img key={i} className={cls("koj-reveal", `koj-reveal-delay-${i + 1}`)} src={s} alt="" />)}
      </section>
    </main>
  );
}

const FALLBACK_COLLECTIONS = [
  { id:'set',    titleTr:'Atlas Koleksiyonu', titleEn:'Atlas Collection',   titleAr:'\u0645\u062c\u0645\u0648\u0639\u0629 \u0623\u062a\u0644\u0627\u0633',   titleRu:'\u041a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f Atlas',     descTr:'Keten takımlar — yaz keşifleri için.', descEn:'Linen sets — for summer expeditions.', descAr:'\u0623\u0637\u0642\u0645 \u0643\u062a\u0627\u0646\u064a\u0629 \u0644\u0644\u0631\u062d\u0644\u0627\u062a \u0627\u0644\u0635\u064a\u0641\u064a\u0629.', descRu:'\u041b\u044c\u043d\u044f\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u043b\u0435\u0442\u043d\u0438\u0445 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439.', cat:'set',    img:'assets/products/product-01-flatlay-set.png',      order:1 },
  { id:'shirt',  titleTr:'Orbit Gömlekler',  titleEn:'Orbit Shirts',  titleAr:'\u0642\u0645\u0635\u0627\u0646 \u0623\u0648\u0631\u0628\u062a',  titleRu:'\u0420\u0443\u0431\u0430\u0448\u043a\u0438 Orbit',  descTr:'Hafif, yıkanmış kumaşlar.', descEn:'Light, washed fabrics.', descAr:'\u0623\u0642\u0645\u0634\u0629 \u062e\u0641\u064a\u0641\u0629 \u0645\u063a\u0633\u0648\u0644\u0629.', descRu:'\u041b\u0451\u0433\u043a\u0438\u0435 \u043f\u0440\u043e\u043c\u044b\u0442\u044b\u0435 \u0442\u043a\u0430\u043d\u0438.', cat:'shirt',  img:'assets/products/product-03-boy-cap-front.png',    order:2 },
  { id:'shorts', titleTr:'Meridian Şortlar', titleEn:'Meridian Shorts', titleAr:'\u0634\u0648\u0631\u062a\u0627\u062a \u0645\u064a\u0631\u064a\u062f\u064a\u0627\u0646', titleRu:'\u0428\u043e\u0440\u0442\u044b Meridian', descTr:'Dayanıklı dikim, rahat kalıp.', descEn:'Durable seams, easy fit.', descAr:'\u062d\u064a\u0627\u0643\u0629 \u0645\u062a\u064a\u0646\u0629 \u0648\u0642\u0635\u0629 \u0645\u0631\u064a\u062d\u0629.', descRu:'\u041f\u0440\u043e\u0447\u043d\u044b\u0435 \u0448\u0432\u044b, \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043a\u0440\u043e\u0439.', cat:'shorts', img:'assets/products/product-07-shorts-detail.png',    order:3 },
  { id:'tee',    titleTr:'Stardust T-shirtler', titleEn:'Stardust Tees', titleAr:'\u062a\u064a\u0634\u064a\u0631\u062a\u0627\u062a \u0633\u062a\u0627\u0631\u062f\u0633\u062a', titleRu:'\u0424\u0443\u0442\u0431\u043e\u043b\u043a\u0438 Stardust', descTr:'Organik pamuk temelleri.', descEn:'Organic cotton basics.', descAr:'\u0623\u0633\u0627\u0633\u064a\u0627\u062a \u0645\u0646 \u0627\u0644\u0642\u0637\u0646 \u0627\u0644\u0639\u0636\u0648\u064a.', descRu:'\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u043b\u043e\u043f\u043e\u043a.', cat:'tee',    img:'assets/products/product-05-knit-detail.png',      order:4 },
  { id:'dress',  titleTr:'Luna Elbiseler',   titleEn:'Luna Dresses',  titleAr:'\u0641\u0633\u0627\u062a\u064a\u0646 \u0644\u0648\u0646\u0627',  titleRu:'\u041f\u043b\u0430\u0442\u044c\u044f Luna', descTr:'Hafif, akıcı, zamansız.', descEn:'Light, flowing, timeless.', descAr:'\u062e\u0641\u064a\u0641\u0629\u060c \u0627\u0646\u0633\u064a\u0629\u060c \u062e\u0627\u0644\u062f\u0629.', descRu:'\u041b\u0451\u0433\u043a\u0438\u0435, \u0441\u0442\u0440\u0443\u044f\u0449\u0438\u0435\u0441\u044f, \u0432\u043d\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.', cat:'dress',  img:'assets/products/product-01-flatlay-set.png',      order:5 },
];

function CollectionsPage({ lang, go }) {
  const t = T(lang);
  const firestoreColls = useCollections();
  const collections = firestoreColls.length > 0 ? firestoreColls : FALLBACK_COLLECTIONS;
  const getTitle = (c) => c['title' + lang.charAt(0).toUpperCase() + lang.slice(1)] || c.titleEn || c.titleTr || '';
  const getDesc  = (c) => c['desc'  + lang.charAt(0).toUpperCase() + lang.slice(1)] || c.descEn  || c.descTr  || '';
  return (
    <main>
      <section className="koj-section koj-about-hero">
        <span className="koj-eyebrow">{t.nav.collections}</span>
        <h1 className="koj-h1 koj-h1-xl">{t.nav.collections}</h1>
        <p className="koj-lead" style={{maxWidth:520}}>{t.hero.sub}</p>
      </section>
      <section className="koj-section koj-reveal">
        <div className="koj-collections">
          {collections.map((c, i) => (
            <a key={c.id} href={'#/shop?cat='+c.cat} className={cls('koj-collection koj-reveal', i % 3 === 0 && 'is-wide', `koj-reveal-delay-${(i % 3) + 1}`)}>
              <div className="koj-collection-img"><img src={c.img || "assets/products/product-01-flatlay-set.png"} alt="" /></div>
              <div className="koj-collection-meta">
                <span className="koj-eyebrow">{"N°0"+(i+1)}</span>
                <h2 className="koj-h2">{getTitle(c)}</h2>
                <p className="koj-lead">{getDesc(c)}</p>
                <span className="koj-link">{t.featured.view} →</span>
              </div>
            </a>
          ))}
        </div>
      </section>
    </main>
  );
}

function NewInPage({ lang }) {
  const t = T(lang);
  const products = useProducts();
  const items = products.filter(p => p.isNew);
  return (
    <main>
      <section className="koj-section koj-about-hero">
        <span className="koj-eyebrow">{t.new.eyebrow}</span>
        <h1 className="koj-h1 koj-h1-xl">{t.new.title}</h1>
        <p className="koj-lead" style={{maxWidth:520}}>{t.hero.sub}</p>
      </section>
      <section className="koj-section">
        <div className="koj-product-grid koj-grid-4">
          {items.map(p => <ProductCard key={p.id} p={p} lang={lang} t={t} />)}
        </div>
      </section>
    </main>
  );
}

function ContactPage({ lang }) {
  const t = T(lang);
  const config = useConfig();
  const wa    = config.whatsapp    || WHATSAPP;
  const email = config.email       || 'hello@kidsofjupiter.com';
  const addr  = config.contactAddr || t.contact.addr;
  const hours = config.contactHours|| t.contact.hoursV;

  const L = lang.charAt(0).toUpperCase() + lang.slice(1);
  const sub = config['contactSub'+L] || config.contactSubTr || t.contact.sub;

  const items = [
    { l:t.contact.whatsapp, v:'+' + wa, a:'https://wa.me/' + wa, icon:<WaIcon /> },
    { l:t.contact.email,    v:email, a:'mailto:' + email },
    { l:t.contact.address,  v:addr },
    { l:t.contact.hours,    v:hours },
  ];
  return (
    <main>
      <section className="koj-section koj-about-hero">
        <span className="koj-eyebrow">{t.nav.contact}</span>
        <h1 className="koj-h1 koj-h1-xl">{t.contact.title}</h1>
        <p className="koj-lead" style={{maxWidth:520}}>{sub}</p>
      </section>
      <section className="koj-section">
        <div className="koj-contact-grid">
          {items.map((it, i) => (
            <div key={i} className="koj-contact-card">
              <span className="koj-eyebrow">{it.l}</span>
              {it.a ? <a className="koj-contact-v" href={it.a} target="_blank">{it.icon}{it.v}</a> : <span className="koj-contact-v">{it.v}</span>}
            </div>
          ))}
        </div>
      </section>
    </main>
  );
}

// ─── Cart drawer ─────────────────────────────────────────────────────────────
function CartDrawer({ open, onClose, lang, cart, setQty, remove, clear }) {
  const t = T(lang);
  const products = useProducts();
  if (!open) return null;
  const total = cart.reduce((s,x) => s + x.qty, 0);
  return (
    <div className="koj-cart-overlay" onClick={onClose}>
      <aside className="koj-cart-drawer" onClick={e => e.stopPropagation()}>
        <div className="koj-cart-head">
          <h3 className="koj-h3">{t.cart.title} <span style={{opacity:.5}}>· {total}</span></h3>
          <button className="koj-icon-btn" onClick={onClose}><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
        </div>
        {cart.length === 0 ? (
          <div className="koj-cart-empty">
            <PlanetMark size={48} />
            <p>{t.cart.empty}</p>
            <Button as="a" href="#/shop" onClick={onClose} variant="ghost">{t.cart.emptyCta}</Button>
          </div>
        ) : (
          <>
            <div className="koj-cart-items">
              {cart.map(it => {
                const p = products.find(x => x.id === it.id);
                if (!p) return null;
                const k = `${it.id}|${it.size}|${it.color}`;
                return (
                  <div key={k} className="koj-cart-item">
                    <img src={p.img} alt="" />
                    <div className="koj-cart-item-mid">
                      <a href={`#/p/${p.id}`} onClick={onClose} className="koj-cart-item-name">{productName(p, lang)}</a>
                      <span className="koj-cart-item-meta">{t.product.size}: {it.size} · {t.product.color}: {window.KOJ_translateColor(it.color, lang)}</span>
                      <div className="koj-cart-item-qty">
                        <div className="koj-qty koj-qty-sm">
                          <button onClick={() => setQty(k, it.qty-1)}>−</button>
                          <span>{it.qty}</span>
                          <button onClick={() => setQty(k, it.qty+1)}>+</button>
                        </div>
                        <button className="koj-link-sm" onClick={() => remove(k)}>{t.cart.remove}</button>
                      </div>
                    </div>
                  </div>
                );
              })}
            </div>
            <div className="koj-cart-foot">
              <p className="koj-cart-note">{t.cart.note}</p>
              <Button variant="wa" onClick={() => openWa(buildWaCart(cart, lang))}><WaIcon /> {t.cart.send}</Button>
              <button className="koj-link-sm koj-clear" onClick={clear}>{t.cart.clear}</button>
            </div>
          </>
        )}
      </aside>
    </div>
  );
}

// ─── Footer ──────────────────────────────────────────────────────────────────
function Footer({ lang }) {
  const t = T(lang);
  const config = useConfig();
  const tagline = config.footerTagline || t.footer.tag;
  const copy    = config.footerCopy    || `© 2026 Kids of Jupiter. ${t.footer.rights}`;
  
  return (
    <footer className="koj-footer">
      <div className="koj-footer-top">
        <div className="koj-footer-brand">
          <Logo height={28} config={config} />
          <p>{tagline}</p>
        </div>
        <div className="koj-footer-cols">
          <div>
            <h4>{t.footer.shop}</h4>
            <a href="#/shop">{t.nav.shop}</a>
            <a href="#/new">{t.nav.new}</a>
            <a href="#/collections">{t.nav.collections}</a>
          </div>
          <div>
            <h4>{t.footer.help}</h4>
            <a href="#/contact">{t.nav.contact}</a>
            <a href={`https://wa.me/${config.whatsapp || WHATSAPP}`} target="_blank">{t.contact.whatsapp}</a>
            <a href="#/about">{t.nav.about}</a>
          </div>
          {(config.instagram || config.tiktok || config.pinterest) && (
          <div>
            <h4>{t.footer.social}</h4>
            {config.instagram && config.instagram !== '#' && <a href={config.instagram} target="_blank" rel="noopener">Instagram</a>}
            {config.tiktok && config.tiktok !== '#' && <a href={config.tiktok} target="_blank" rel="noopener">TikTok</a>}
            {config.pinterest && config.pinterest !== '#' && <a href={config.pinterest} target="_blank" rel="noopener">Pinterest</a>}
          </div>
          )}
        </div>
      </div>
      <div className="koj-footer-bot">
        <span>{copy}</span>
        <span>Born to explore · İstanbul</span>
      </div>
    </footer>
  );
}

function FloatingWa({ lang }) {
  const t = T(lang);
  const config = useConfig();
  const wa = config.whatsapp || WHATSAPP;
  return (
    <a className="koj-fab" href={`https://wa.me/${wa}?text=${encodeURIComponent(t.wa.greet)}`} target="_blank" aria-label="WhatsApp">
      <WaIcon size={24} />
    </a>
  );
}

function ComingSoonView({ lang }) {
  const t = T(lang);
  const config = useConfig();
  const [email, setEmail] = useS('');
  const [subscribed, setSubscribed] = useS(false);

  const handleSubscribe = (e) => {
    e.preventDefault();
    if (!email) return;
    setSubscribed(true);
  };

  const handleBypass = () => {
    localStorage.setItem('koj_preview', 'true');
    window.location.hash = '#/shop';
    window.location.reload();
  };

  return (
    <div className="koj-coming-soon">
      <div className="koj-cs-card koj-reveal is-revealed">
        <Logo height={48} config={config} variant="white" />
        <h1 className="koj-h1 koj-cs-title" style={{ letterSpacing: '0.06em', textTransform: 'uppercase' }}>SİTEMİZ YENİLENİYOR</h1>
        <p className="koj-lead koj-cs-sub">
          Çok yakında burada da sizlerle.
        </p>

        {subscribed ? (
          <div className="koj-cs-success">
            ✨ Teşekkürler! Koleksiyon yayınlandığında ilk sizin haberiniz olacak.
          </div>
        ) : (
          <form className="koj-cs-form" onSubmit={handleSubscribe}>
            <input
              type="email"
              placeholder="E-posta adresiniz..."
              value={email}
              onChange={(e) => setEmail(e.target.value)}
              required
            />
            <button type="submit" className="koj-btn koj-btn-primary">Haber Ver</button>
          </form>
        )}

        <div className="koj-cs-footer">
          <a href={`https://wa.me/${config.whatsapp || WHATSAPP}?text=${encodeURIComponent(t.wa.greet)}`} className="koj-cs-wa" target="_blank" rel="noopener noreferrer">
            <WaIcon size={18} /> WhatsApp ile Ulaşın
          </a>
        </div>
      </div>
    </div>
  );
}

Object.assign(window, {
  Header, MobileMenu, HomePage, ShopPage, ProductPage, AboutPage, ContactPage,
  CollectionsPage, CartDrawer, Footer, FloatingWa, ProductCard, WaIcon, NewInPage,
  ComingSoonView
});
