// Shared shell for kolabs site: router, apps registry, nav, footer, motion helpers
const { useState, useEffect, useRef } = React;
const clamp01 = (v) => Number.isFinite(v) ? Math.max(0, Math.min(1, v)) : 0;
const easeOut = (t) => 1 - Math.pow(1 - t, 3);

// ─── Mağaza linkleri ─────────────────────────────────────────────
const PLAY_DEV = 'https://play.google.com/store/apps/dev?id=4847348210883195663';
const APPLE_DEV = 'https://apps.apple.com/tr/developer/alperen-kolamuc/id6779129794';
const TENAX_APP_STORE = 'https://apps.apple.com/us/app/tenax-easy-workout/id6800214009';
const VAKIT_APP_STORE = 'https://apps.apple.com/us/app/vakit-ezan-namaz-k%C4%B1ble/id6786204640';
const ZIKIRMATIK_APP_STORE = 'https://apps.apple.com/tr/app/zikirmatik-zikir-sayac%C4%B1/id6779129792';

// ─── Uygulama kaydı ──────────────────────────────────────────────
// Dile bağlı olmayan kimlik: yol, renk, logo, mağaza kimlikleri, video.
// Görünen metinlerin hepsi i18n.jsx'ten okunuyor (appText).
// play: Play Store paket adı (yayında değilse null) · ios: App Store linki.
const APPS = [
  { key: 'tenax', route: '/tenax', color: '#b9ff3a', glow: '#5f9e1a', logo: 'assets/tenax-logo.png',
    play: 'com.kolabs.tenax', ios: TENAX_APP_STORE, video: null, shots: 3 },
  { key: 'noctavia', route: '/noctavia', color: '#a58bff', glow: '#7a6cf0', logo: 'assets/noctavia-logo.png',
    play: 'com.kolabs.noctavia', ios: null, video: 'gqFKvhNwTvY', shots: 6 },
  { key: 'zikirmatik', route: '/zikirmatik', color: '#3ddc97', glow: '#2f7bff', logo: 'assets/zikirmatik-logo.png',
    play: 'com.kolabs.zikirmatik', ios: ZIKIRMATIK_APP_STORE, video: 'tkZ7tQ_YLM0', shots: 3 },
  // Yol /ramazan olarak kalıyor: mağazadaki eski sürümlerin destek linkleri buraya bakıyor.
  { key: 'ramazan', route: '/ramazan', color: '#f5b83d', glow: '#3d74e0', logo: 'assets/ramazan-logo.jpg',
    play: 'com.kolabs.imsakiye', ios: VAKIT_APP_STORE, video: 'q_ctbszurLQ', shots: 3 },
  { key: 'kelimebul', route: '/kelime-bul', color: '#ff7a45', glow: '#a8e04a', logo: 'assets/kelimebul-logo.jpg',
    play: 'com.kolabs.kelimebul', ios: null, video: 'maW_PTYIIEg', shots: 3 },
  { key: 'hesapvakti', route: '/hesap-vakti', color: '#ff5a82', glow: '#ffd23a', logo: 'assets/hesapvakti-logo.png',
    play: 'com.kolabs.hesapvakti', ios: null, video: 'C04hQT9sNX0', shots: 3 },
  // Kapalı B2B, henüz iki mağazada da yok.
  { key: 'patisstray', route: '/patisstray', color: '#a57cff', glow: '#6d28d9', logo: 'assets/patisstray-logo.png',
    play: null, ios: null, video: null, shots: 3, soon: true },
];
const appByKey = (k) => APPS.find(a => a.key === k);

// Mağaza görselleri metin içerir, yani dile bağlıdır. İngilizcesi YALNIZCA
// bu iki uygulamada var; diğerlerinde `-en` dosyası yok ve istenirse 404 döner.
const EN_SHOTS = new Set(['tenax', 'patisstray']);
function shotSrc(slug, name, lang) {
  const suffix = (lang === 'en' && EN_SHOTS.has(slug)) ? '-en' : '';
  return `assets/${slug}-${name}${suffix}.png`;
}
const shotsOf = (a, lang) => Array.from({ length: a.shots }, (_, i) => shotSrc(a.key, i + 1, lang));

// Uygulamanın o dildeki metinleri. Noctavia'nın metinleri ayrı bir ağaçta duruyor.
// `card`: ana sayfa kartının adı, açıklaması ve kategorisi (t.home.apps) — hero bunları gösterir.
function appText(t, key) {
  const meta = t.appsMeta[key];
  const home = t.home.apps[key];
  if (key === 'noctavia') {
    const n = t.noctavia.home;
    const seen = new Set();
    const faq = ['sesliYorum', 'ruyaSozlugu', 'temaAnalizi', 'ruyaGunlugu', 'premium']
      .flatMap(k => t.noctavia[k].faq)
      .filter(f => !seen.has(f.q) && seen.add(f.q));
    return {
      name: meta.name, fullName: home.name, short: meta.desc, cat: n.eyebrow,
      tagline: n.h2, lead: n.lead, ctaTitle: n.ctaTitle, ctaSub: n.ctaSub,
      features: n.features.map(f => ({ title: f.title, desc: f.desc, to: f.to.split('/').pop() })),
      faq, stats: t.appStats[key], card: home,
    };
  }
  const a = t.apps[key];
  return {
    name: meta.name, fullName: home.name, short: meta.desc, cat: a.eyebrow,
    tagline: a.h2, lead: a.lead, ctaTitle: a.ctaTitle, ctaSub: a.ctaSub,
    features: a.features, faq: a.faq, stats: t.appStats[key], raw: a, card: home,
  };
}

// ─── Router (history API) ────────────────────────────────────────
function usePathRoute() {
  const [path, setPath] = useState(() => decodeURIComponent(window.location.pathname || '/'));
  useEffect(() => {
    const onPop = () => setPath(decodeURIComponent(window.location.pathname || '/'));
    window.addEventListener('popstate', onPop);
    window.addEventListener('kolabs:navigate', onPop);
    return () => {
      window.removeEventListener('popstate', onPop);
      window.removeEventListener('kolabs:navigate', onPop);
    };
  }, []);
  return path;
}

function navigate(to) {
  if (!to) return;
  if (window.location.pathname === to) return;
  window.history.pushState({}, '', to);
  window.dispatchEvent(new Event('kolabs:navigate'));
  window.scrollTo({ top: 0, behavior: 'instant' });
}

// Backward-compat alias. The single source of truth for path↔lang mapping
// is `pathForLang` in i18n.jsx (uses PATH_MAP for slug translation).
function applyLang(to, lang) {
  return pathForLang(to, lang);
}

function Link({ to, children, className, onClick: extraOnClick, ...rest }) {
  const { lang } = useLang();
  const href = applyLang(to, lang);
  const onClick = (e) => {
    if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button === 1) return;
    e.preventDefault();
    if (extraOnClick) extraOnClick(e);
    navigate(href);
  };
  return <a href={href} onClick={onClick} className={className} {...rest}>{children}</a>;
}

function scrollToId(id, offset = 80) {
  const el = document.getElementById(id);
  if (el) window.scrollTo({ top: el.getBoundingClientRect().top + window.scrollY - offset, behavior: 'smooth' });
}

// ─── Motion helpers ──────────────────────────────────────────────
function useScrollProgress(ref) {
  const [p, setP] = useState(0);
  useEffect(() => {
    let raf;
    const f = () => {
      const el = ref.current; if (!el) return;
      const r = el.getBoundingClientRect();
      const total = r.height - window.innerHeight;
      setP(total > 0 ? clamp01(-r.top / total) : clamp01((window.innerHeight - r.top) / (window.innerHeight + r.height)));
    };
    const on = () => { cancelAnimationFrame(raf); raf = requestAnimationFrame(f); };
    f();
    window.addEventListener('scroll', on, { passive: true });
    window.addEventListener('resize', on);
    return () => { window.removeEventListener('scroll', on); window.removeEventListener('resize', on); cancelAnimationFrame(raf); };
  }, []);
  return p;
}

function Reveal({ children, className = '', delay = 0, as: Tag = 'div', style, ...rest }) {
  const ref = useRef(null);
  const [inView, setIn] = useState(false);
  useEffect(() => {
    const io = new IntersectionObserver(([e]) => { if (e.isIntersecting) { setIn(true); io.disconnect(); } }, { threshold: 0.12 });
    ref.current && io.observe(ref.current);
    return () => io.disconnect();
  }, []);
  return <Tag ref={ref} className={`rv ${inView ? 'in' : ''} ${className}`} style={{ transitionDelay: delay + 'ms', ...style }} {...rest}>{children}</Tag>;
}

function SplitWord({ text, className = '', base = 0 }) {
  return <span className={'split ' + className} aria-label={text}>{[...text].map((ch, i) => <span key={i} className="split-c" style={{ animationDelay: base + i * 45 + 'ms' }}>{ch === ' ' ? ' ' : ch}</span>)}</span>;
}

function Phone({ children, className = '', style }) {
  return <div className={'phone ' + className} style={style}><div className="phone-screen">{children}</div></div>;
}

function SectionLabel({ num, children }) {
  return <div className="slabel"><span className="slabel-n">({num})</span><span>{children}</span></div>;
}

// ─── Store buttons ───────────────────────────────────────────────
const ICON_PLAY = <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M22.018 13.298l-3.919 2.218-3.515-3.493 3.543-3.521 3.891 2.202a1.49 1.49 0 0 1 0 2.594zM1.337.924a1.486 1.486 0 0 0-.112.568v21.017c0 .217.045.419.124.6l11.155-11.087L1.337.924zm12.207 10.065l3.258-3.238L3.45.195a1.466 1.466 0 0 0-.946-.179l11.04 10.973zm0 2.067l-11 10.933c.298.036.612-.016.906-.183l13.324-7.54-3.23-3.21z"/></svg>;
const ICON_APPLE = <svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" aria-hidden="true"><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/></svg>;

const playUrl = (pkg) => `https://play.google.com/store/apps/details?id=${pkg}`;

function StoreBadge({ href, kind, variant = 'solid', small = false }) {
  const t = useT();
  const cls = `store store-${variant} ${small ? 'store-sm' : ''}`;
  const apple = kind === 'apple';
  return (
    <a href={href} target="_blank" rel="noopener noreferrer" className={cls}>
      {apple ? ICON_APPLE : ICON_PLAY}
      <span><small>{apple ? t.ui.badgeAppleSmall : t.ui.badgePlaySmall}</small>{apple ? t.ui.badgeApple : t.ui.badgePlay}</span>
    </a>
  );
}

// Uygulamanın yayında olduğu mağazaların rozetleri. Olmayan mağaza için rozet çıkmaz;
// `pending` verilirse yerine "yakında" çipi durur (Tenax'in Play'i, PatissTray).
function StoreButtons({ app, variant = 'solid', small = false, pending }) {
  if (!app.play && !app.ios) return pending ? <span className="chip chip-c">{pending}</span> : null;
  return (
    <div className="stores">
      {app.play && <StoreBadge href={playUrl(app.play)} kind="play" variant={variant} small={small} />}
      {app.ios && <StoreBadge href={app.ios} kind="apple" variant={variant} small={small} />}
      {pending && <span className="chip">{pending}</span>}
    </div>
  );
}

// Tekil Play düğmesi (Noctavia fiyat kartları)
function PlayButton({ appId, children, variant = 'solid' }) {
  return (
    <a href={playUrl(appId)} target="_blank" rel="noopener noreferrer" className={'btn btn-' + variant}>
      <span>{children}</span><span className="btn-ar">↗</span>
    </a>
  );
}

// ─── Theme ───────────────────────────────────────────────────────
function switchTheme(e, next, set) {
  const apply = () => { ReactDOM.flushSync(() => set(next)); document.documentElement.setAttribute('data-theme', next); };
  if (!document.startViewTransition || window.matchMedia('(prefers-reduced-motion: reduce)').matches) { apply(); return; }
  const r = e.currentTarget.getBoundingClientRect();
  const x = r.left + r.width / 2, y = r.top + r.height / 2;
  const end = Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y));
  const tr = document.startViewTransition(apply);
  tr.ready.then(() => document.documentElement.animate(
    { clipPath: [`circle(0px at ${x}px ${y}px)`, `circle(${end}px at ${x}px ${y}px)`] },
    { duration: 900, easing: 'cubic-bezier(.76,0,.24,1)', pseudoElement: '::view-transition-new(root)' }
  ));
}

// ─── Nav ─────────────────────────────────────────────────────────
function Nav({ current, theme, setTheme }) {
  const t = useT();
  const [open, setOpen] = useState(false);
  const [mob, setMob] = useState(false);
  const [scrolled, setScrolled] = useState(false);
  useEffect(() => {
    const on = () => setScrolled(window.scrollY > 40);
    on(); window.addEventListener('scroll', on, { passive: true });
    return () => window.removeEventListener('scroll', on);
  }, []);
  useEffect(() => { setOpen(false); setMob(false); }, [current]);
  const onApp = APPS.some(a => current === a.route || current.startsWith(a.route + '/'));
  return (
    <header className={`nav ${scrolled ? 'nav-s' : ''}`} onMouseLeave={() => setOpen(false)}>
      <div className="nav-in">
        <Link to="/" className="logo">kolabs<span className="logo-dot">.</span></Link>
        <nav className="nav-links">
          <Link to="/" className={current === '/' ? 'on' : ''}>{t.nav.home}</Link>
          <button className={'nav-dd ' + (open || onApp ? 'on' : '')} onMouseEnter={() => setOpen(true)} onClick={() => setOpen(o => !o)}>{t.nav.apps} <span className="nav-plus">{open ? '−' : '+'}</span></button>
          <a href="mailto:info@kolabs.tr">{t.nav.contact}</a>
          <LanguageSwitcher />
        </nav>
        <div className="nav-r">
          <button className={'theme-tg ' + theme} onClick={(e) => switchTheme(e, theme === 'dark' ? 'light' : 'dark', setTheme)} aria-label={t.ui.themeToggle}><span className="tg-knob"><svg className="tg-sun" viewBox="0 0 24 24" width="14" height="14"><circle cx="12" cy="12" r="4.5" fill="currentColor"/><g stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M12 1.5v2.5M12 20v2.5M1.5 12h2.5M20 12h2.5M4.6 4.6l1.8 1.8M17.6 17.6l1.8 1.8M4.6 19.4l1.8-1.8M17.6 6.4l1.8-1.8"/></g></svg><svg className="tg-moon" viewBox="0 0 24 24" width="14" height="14"><path fill="currentColor" d="M20.5 14.5A8.5 8.5 0 0 1 9.5 3.5a8.5 8.5 0 1 0 11 11z"/></svg></span></button>
          <a className="btn btn-line btn-sm nav-cta" href={PLAY_DEV} target="_blank" rel="noopener">{t.nav.playStore} ↗</a>
          <a className="btn btn-line btn-sm nav-cta" href={APPLE_DEV} target="_blank" rel="noopener">{t.nav.appStore} ↗</a>
          <button className="burger" onClick={() => setMob(m => !m)} aria-label={t.nav.menu}><span></span><span></span></button>
        </div>
      </div>
      <div className={'mega ' + (open ? 'open' : '')}>
        <div className="mega-in">
          {APPS.map((a, i) => (
            <Link key={a.key} to={a.route} className="mega-item" style={{ '--c': a.color }}>
              <span className="mega-n">{String(i + 1).padStart(2, '0')}</span>
              <img src={a.logo} alt="" className="mega-logo" />
              <span className="mega-name">{t.appsMeta[a.key].name}</span>
              <span className="mega-desc">{a.soon ? t.home.statusSoon : t.appsMeta[a.key].desc}</span>
            </Link>
          ))}
        </div>
      </div>
      {mob && (
        <div className="mob">
          <Link to="/">{t.nav.home}</Link>
          {APPS.map(a => <Link key={a.key} to={a.route} style={{ '--c': a.color }} className="mob-app"><i></i>{t.appsMeta[a.key].name}</Link>)}
          <a href="mailto:info@kolabs.tr">{t.nav.contact}</a>
          <div className="mob-row">
            <LanguageSwitcher />
            <a className="btn btn-line btn-sm" href={PLAY_DEV} target="_blank" rel="noopener">{t.nav.playStore} ↗</a>
            <a className="btn btn-line btn-sm" href={APPLE_DEV} target="_blank" rel="noopener">{t.nav.appStore} ↗</a>
          </div>
        </div>
      )}
    </header>
  );
}

// ─── Footer ──────────────────────────────────────────────────────
function Footer() {
  const t = useT();
  return (
    <footer className="foot">
      <div className="foot-top">
        <div className="foot-col">
          <div className="foot-h">{t.footer.appsTitle}</div>
          {APPS.map(a => <Link key={a.key} to={a.route}>{t.appsMeta[a.key].name}</Link>)}
        </div>
        <div className="foot-col">
          <div className="foot-h">{t.footer.noctaviaTitle}</div>
          <Link to="/noctavia/sesli-yorum">{t.footer.sesliYorum}</Link>
          <Link to="/noctavia/ruya-sozlugu">{t.footer.ruyaSozlugu}</Link>
          <Link to="/noctavia/tema-analizi">{t.footer.temaAnalizi}</Link>
          <Link to="/noctavia/ruya-gunlugu">{t.footer.ruyaGunlugu}</Link>
          <Link to="/noctavia/premium">{t.footer.premium}</Link>
        </div>
        <div className="foot-col">
          <div className="foot-h">{t.footer.legalTitle}</div>
          <a href="mailto:info@kolabs.tr">info@kolabs.tr</a>
          <a href={PLAY_DEV} target="_blank" rel="noopener">Google Play ↗</a>
          <a href={APPLE_DEV} target="_blank" rel="noopener">App Store ↗</a>
          <Link to="/gizlilik">{t.footer.privacy}</Link>
          <Link to="/kullanim-sartlari">{t.footer.terms}</Link>
          <Link to="/veri-silme">{t.footer.dataDeletion}</Link>
        </div>
        <p className="foot-about">{t.footer.intro}</p>
      </div>
      <div className="foot-word">kolabs<span className="logo-dot">.</span></div>
      <div className="foot-bot"><span>{t.footer.rights}</span><span>{t.footer.tagline}</span></div>
    </footer>
  );
}

// Crumbs (yasal ve veri silme sayfaları)
function Crumbs({ items }) {
  return (
    <div className="crumbs">
      {items.map((it, i) => (
        <React.Fragment key={i}>
          {i > 0 && <span className="sep">/</span>}
          {it.to ? <Link to={it.to}>{it.label}</Link> : <span className="current">{it.label}</span>}
        </React.Fragment>
      ))}
    </div>
  );
}

Object.assign(window, {
  PLAY_DEV, APPLE_DEV, TENAX_APP_STORE, VAKIT_APP_STORE, ZIKIRMATIK_APP_STORE,
  APPS, appByKey, shotSrc, shotsOf, appText, clamp01, easeOut,
  usePathRoute, navigate, applyLang, Link, scrollToId, useScrollProgress, Reveal, SplitWord, Phone, SectionLabel,
  StoreBadge, StoreButtons, PlayButton, playUrl, switchTheme, Nav, Footer, Crumbs,
});
