/* Shared UI — Header, Footer, TalkCard, icons, member store. Exposes to window. */
const { useState, useEffect, useRef } = React;

/* ---- membership store (backed by SK_API token; localStorage fallback) ---- */
const memberStore = {
  get: () => { try { return window.SK_API ? window.SK_API.isMember() : localStorage.getItem('sk-member') === '1'; } catch (e) { return false; } },
  set: (v) => {
    if (window.SK_API) { if (v) window.dispatchEvent(new Event('sk-member')); else window.SK_API.logout(); return; }
    try { localStorage.setItem('sk-member', v ? '1' : '0'); } catch (e) {}
    window.dispatchEvent(new Event('sk-member'));
  },
};
function useMember() {
  const [m, setM] = useState(memberStore.get());
  useEffect(() => { const h = () => setM(memberStore.get()); window.addEventListener('sk-member', h); return () => window.removeEventListener('sk-member', h); }, []);
  return [m, (v) => memberStore.set(v)];
}
const openModal = (name) => window.dispatchEvent(new CustomEvent('sk-modal', { detail: name }));

/* ---- inline icons ---- */
function Icon({ name, size = 20, stroke = 1.7, style }) {
  const p = { width: size, height: size, viewBox: '0 0 24 24', fill: 'none',
    stroke: 'currentColor', strokeWidth: stroke, strokeLinecap: 'round', strokeLinejoin: 'round', style };
  const paths = {
    search: <><circle cx="11" cy="11" r="7" /><path d="M21 21l-4.3-4.3" /></>,
    play: <path d="M7 4.5v15l12-7.5z" fill="currentColor" stroke="none" />,
    pause: <><rect x="6" y="5" width="4" height="14" rx="1" fill="currentColor" stroke="none"/><rect x="14" y="5" width="4" height="14" rx="1" fill="currentColor" stroke="none"/></>,
    headphones: <><path d="M4 14v-2a8 8 0 0116 0v2" /><rect x="3" y="13" width="4" height="7" rx="1.5" /><rect x="17" y="13" width="4" height="7" rx="1.5" /></>,
    video: <><rect x="3" y="6" width="13" height="12" rx="2" /><path d="M16 10l5-3v10l-5-3z" /></>,
    book: <><path d="M5 4h10a3 3 0 013 3v13H8a3 3 0 01-3-3z" /><path d="M5 4v13" /></>,
    arrow: <path d="M5 12h14M13 6l6 6-6 6" />,
    chevL: <path d="M15 6l-6 6 6 6" />,
    chevR: <path d="M9 6l6 6-6 6" />,
    chevD: <path d="M6 9l6 6 6-6" />,
    clock: <><circle cx="12" cy="12" r="8.5" /><path d="M12 7.5V12l3 2" /></>,
    bookmark: <path d="M6 4h12v16l-6-4-6 4z" />,
    bookmarkFill: <path d="M6 4h12v16l-6-4-6 4z" fill="currentColor" stroke="none" />,
    heart: <path d="M12 20s-7-4.6-9.2-9C1.3 8 2.6 5 5.6 5c1.9 0 3.1 1.1 3.9 2.3l1.5 2.2 1.5-2.2C13.3 6.1 14.5 5 16.4 5c3 0 4.3 3 2.8 6-2.2 4.4-9.2 9-9.2 9z" />,
    heartFill: <path d="M12 20s-7-4.6-9.2-9C1.3 8 2.6 5 5.6 5c1.9 0 3.1 1.1 3.9 2.3l1.5 2.2 1.5-2.2C13.3 6.1 14.5 5 16.4 5c3 0 4.3 3 2.8 6-2.2 4.4-9.2 9-9.2 9z" fill="currentColor" stroke="none" />,
    eye: <><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z"/><circle cx="12" cy="12" r="2.8"/></>,
    share: <><circle cx="6" cy="12" r="2.5"/><circle cx="17" cy="6" r="2.5"/><circle cx="17" cy="18" r="2.5"/><path d="M8.2 10.8l6.6-3.6M8.2 13.2l6.6 3.6"/></>,
    menu: <><path d="M4 7h16M4 12h16M4 17h16" /></>,
    close: <path d="M6 6l12 12M18 6L6 18" />,
    exit: <><path d="M14 4h3a2 2 0 012 2v12a2 2 0 01-2 2h-3" /><path d="M4 12h11M11 8l4 4-4 4" /></>,
    text: <><path d="M5 5h14M5 10h14M5 15h9" /></>,
    mail: <><rect x="3" y="5" width="18" height="14" rx="2.5" /><path d="M4 7.5l8 5.5 8-5.5" /></>,
    user: <><circle cx="12" cy="8" r="3.5" /><path d="M5 20a7 7 0 0114 0" /></>,
    quote: <path d="M9 7H5v6h4l-2 4h3l2-4V7zm10 0h-4v6h4l-2 4h3l2-4V7z" fill="currentColor" stroke="none"/>,
    grid: <><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></>,
    sparkle: <path d="M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z" />,
    globe: <><circle cx="12" cy="12" r="8.5" /><path d="M3.5 12h17M12 3.5c2.4 2.3 3.7 5.4 3.7 8.5s-1.3 6.2-3.7 8.5c-2.4-2.3-3.7-5.4-3.7-8.5s1.3-6.2 3.7-8.5z" /></>,
    sliders: <><path d="M4 7h11M19 7h1M4 12h1M9 12h11M4 17h7M15 17h5"/><circle cx="17" cy="7" r="2"/><circle cx="7" cy="12" r="2"/><circle cx="13" cy="17" r="2"/></>,
    lock: <><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 018 0v3"/></>,
    check: <path d="M5 12.5l4.5 4.5L19 7" />,
    star: <path d="M12 3l2.6 6.3 6.8.5-5.2 4.4 1.7 6.6L12 17.7 6.3 21.3l1.7-6.6L2.8 10.3l6.8-.5z" />,
    moon: <path d="M20 13.5A8 8 0 1110.5 4a6.5 6.5 0 009.5 9.5z" />,
    instagram: <><rect x="3.5" y="3.5" width="17" height="17" rx="5"/><circle cx="12" cy="12" r="3.6"/><circle cx="17" cy="7" r="0.6" fill="currentColor"/></>,
    facebook: <path d="M14.5 8.5H17V5h-2.5C12.6 5 11 6.6 11 8.5V11H9v3.5h2V21h3.5v-6.5H17l.5-3.5h-3V9c0-.3.2-.5.5-.5z"/>,
    x: <path d="M4 4l16 16M20 4L4 20"/>,
    telegram: <path d="M21 5L3 12l5 2 2 5 3-3.5 4 3z"/>,
    youtube: <><rect x="3" y="6" width="18" height="12" rx="3"/><path d="M11 9.5l4 2.5-4 2.5z" fill="currentColor" stroke="none"/></>,
  };
  return <svg {...p} aria-hidden="true">{paths[name]}</svg>;
}

function Monogram({ person, size = 40, initialsOnly = false }) {
  if (person.photo && !initialsOnly) {
    return <img className="mono mono-photo" src={person.photo} alt={person.name} loading="lazy"
      style={{ width: size, height: size }} />;
  }
  return <span className="mono" style={{ width: size, height: size, fontSize: size * 0.4 }}>{person.initials}</span>;
}

/* ---- Language switcher ---- */
function LanguageSwitcher({ compact }) {
  const { lang, setLang, meta, LANGS } = window.SK_I18N.useLang();
  const [open, setOpen] = useState(false);
  const ref = useRef(null);
  useEffect(() => {
    const h = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); };
    window.addEventListener('mousedown', h); return () => window.removeEventListener('mousedown', h);
  }, []);
  return (
    <div className={'lang' + (compact ? ' lang-compact' : '')} ref={ref}>
      <button className="lang-btn" onClick={() => setOpen(o => !o)} aria-label={window.SK_I18N.t('language')} aria-expanded={open}>
        <Icon name="globe" size={18} />
        <span className="lang-cur">{meta.native}</span>
        <Icon name="chevD" size={13} />
      </button>
      {open && (
        <div className="lang-menu" role="listbox">
          {LANGS.map(l => (
            <button key={l.code} role="option" aria-selected={l.code === lang}
              className={'lang-opt' + (l.code === lang ? ' is-sel' : '')}
              dir="ltr" onClick={() => { setLang(l.code); setOpen(false); }}>
              <span className="lang-native">{l.native}</span>
              {l.code === lang && <Icon name="check" size={15} />}
            </button>
          ))}
        </div>
      )}
    </div>
  );
}

function Brand({ place = 'header' }) {
  const LIGHT = 'assets/logo-light.png', DARK = 'assets/logo-dark.png';
  if (place === 'footer') {
    return <a className="hd-brand" href="index.html" aria-label="Server Kürsü ana sayfa"><img src={LIGHT} alt="Server Kürsü" className="hd-logo" /></a>;
  }
  return (
    <a className="hd-brand" href="index.html" aria-label="Server Kürsü ana sayfa">
      <img src={LIGHT} alt="Server Kürsü" className="hd-logo hd-logo-onlight" />
      <img src={DARK} alt="" aria-hidden="true" className="hd-logo hd-logo-ondark" />
    </a>
  );
}

/* ---- Header with person-based dropdowns ---- */
function Header() {
  const D = window.SK_DATA;
  const { t } = window.SK_I18N.useLang();
  const [open, setOpen] = useState(false);
  const [drop, setDrop] = useState(null);
  const [macc, setMacc] = useState(null);
  const [isMember] = useMember();

  // mobil menü açıkken arka plandaki sayfa kaymasın
  useEffect(() => {
    document.body.style.overflow = open ? 'hidden' : '';
    return () => { document.body.style.overflow = ''; };
  }, [open]);

  const goSearch = () => { window.location.href = 'search.html'; };
  const closeMobile = () => { setOpen(false); setMacc(null); };

  return (
    <header className="hd">
      <div className="wrap hd-in">
        <Brand />
        <nav className="hd-nav" onMouseLeave={() => setDrop(null)}>
          {D.nav.map((g, i) => (
            <div key={g.tag} className="hd-item" onMouseEnter={() => setDrop(i)}>
              <button className={'hd-link' + (drop === i ? ' is-open' : '')} onClick={() => setDrop(drop === i ? null : i)}>
                {g.person.short} <Icon name="chevD" size={14} />
              </button>
              {drop === i && (
                <div className="hd-drop">
                  <div className="hd-drop-head">
                    <Monogram person={g.person} size={38} />
                    <div><b>{g.person.name}</b>{g.person.role && <span>{g.person.role}</span>}</div>
                  </div>
                  <div className="hd-drop-list">
                    {g.cats.map(c => c === 'Hakkında'
                      ? <a key={c} href={`about.html?p=${g.tag.toLowerCase()}`}>{c}</a>
                      : <a key={c} href="index.html">{c}</a>)}
                  </div>
                </div>
              )}
            </div>
          ))}
          <a className="hd-link" href="search.html">{t('nav_all')}</a>
          <a className="hd-link" href="iletisim.html">{t('contact')}</a>
        </nav>
        <div className="hd-actions">
          <LanguageSwitcher />
          <button className="hd-iconbtn" onClick={goSearch} aria-label={t('search_title')} title={t('search_title')}>
            <Icon name="search" size={19} />
          </button>
          {isMember
            ? <button className="btn btn-ghost hd-logout" onClick={() => memberStore.set(false)}>{t('logout')}</button>
            : <button className="btn btn-primary hd-join" onClick={() => openModal('join')}>{t('join')}</button>}
          <button className="hd-iconbtn hd-authbtn" onClick={() => isMember ? memberStore.set(false) : openModal('join')}
            aria-label={isMember ? t('logout') : t('join')} title={isMember ? t('logout') : t('join')}>
            <Icon name={isMember ? 'exit' : 'user'} size={19} />
          </button>
          <button className="hd-burger" onClick={() => setOpen(o => !o)} aria-label="Menu"><Icon name={open ? 'close' : 'menu'} /></button>
        </div>
      </div>
      {open && (
        <div className="hd-mobile">
          {D.nav.map((g, i) => (
            <div className="hd-macc" key={g.tag}>
              <button className={'hd-macc-head' + (macc === i ? ' is-open' : '')}
                onClick={() => setMacc(macc === i ? null : i)} aria-expanded={macc === i}>
                <span>{g.person.name}</span><Icon name="chevD" size={16} />
              </button>
              {macc === i && (
                <div className="hd-macc-list">
                  {g.cats.map(c => c === 'Hakkında'
                    ? <a key={c} href={`about.html?p=${g.tag.toLowerCase()}`} onClick={closeMobile}>{c}</a>
                    : <a key={c} href="index.html" onClick={closeMobile}>{c}</a>)}
                </div>
              )}
            </div>
          ))}
          <a className="hd-mobile-link" href="search.html" onClick={closeMobile}>{t('nav_all')}</a>
          <a className="hd-mobile-link" href="iletisim.html" onClick={closeMobile}>{t('contact')}</a>
        </div>
      )}
    </header>
  );
}

/* ---- simple likes store (persisted) ---- */
const likesStore = {
  all: () => { try { return new Set(JSON.parse(localStorage.getItem('sk-likes')) || []); } catch (e) { return new Set(); } },
  has: (slug) => likesStore.all().has(slug),
  toggle: (slug) => { const s = likesStore.all(); const on = !s.has(slug); on ? s.add(slug) : s.delete(slug); try { localStorage.setItem('sk-likes', JSON.stringify([...s])); } catch (e) {} if (window.SK_API) window.SK_API.like(slug, on); window.dispatchEvent(new Event('sk-likes')); return on; },
};
function useLiked(slug) {
  const [on, setOn] = useState(() => likesStore.has(slug));
  useEffect(() => { const h = () => setOn(likesStore.has(slug)); window.addEventListener('sk-likes', h); return () => window.removeEventListener('sk-likes', h); }, [slug]);
  return [on, () => setOn(likesStore.toggle(slug))];
}

/* ---- Talk card ---- */
function TalkCard({ talk, variant }) {
  const D = window.SK_DATA;
  const { t } = window.SK_I18N.useLang();
  const href = `watch.html?v=${talk.slug}`;
  const kindIcon = talk.kind === 'audio' ? 'headphones' : 'video';
  const [liked, toggleLike] = useLiked(talk.slug);
  const likeCount = talk.views ? Math.round(talk.views * 0.06) + (liked ? 1 : 0) : 0;
  return (
    <a className={'card ' + (variant || '')} href={href}>
      <div className="card-thumb">
        <div className="card-thumb-bg" data-cat={talk.category}></div>
        <span className="card-kind"><Icon name={kindIcon} size={14} /> {talk.kind === 'audio' ? 'Sesli' : 'Video'}</span>
        <span className="card-dur">{talk.durLabel}</span>
        <span className="card-play"><Icon name="play" size={20} /></span>
      </div>
      <div className="card-body">
        <span className="tag">{talk.category}</span>
        <h3 className="card-title">{talk.title}</h3>
        <div className="card-meta">
          <span>{talk.speaker.short}</span>
          {talk.greg && talk.greg !== '—' && <><span className="dot">·</span><span>{talk.greg}</span></>}
        </div>
        <div className="card-stats">
          <button className={'card-like' + (liked ? ' on' : '')}
            onClick={e => { e.preventDefault(); e.stopPropagation(); toggleLike(); }}
            aria-pressed={liked} aria-label={t('like')} title={t('like')}>
            <Icon name={liked ? 'heartFill' : 'heart'} size={15} />
            <span>{D.fmtCount(likeCount)}</span>
          </button>
          <span className="card-views"><Icon name="eye" size={15} /> {D.fmtCount(talk.views)} <em>{t('views')}</em></span>
        </div>
      </div>
    </a>
  );
}

/* ---- Footer (mirrors real site structure) ---- */
function Footer() {
  const D = window.SK_DATA;
  const { t } = window.SK_I18N.useLang();
  const socials = ['instagram','facebook','x','telegram','youtube'];
  return (
    <footer className="ft">
      <div className="wrap ft-top">
        <Brand place="footer" />
        <div className="ft-social">
          {socials.map(s => <a key={s} href="#" aria-label={s}><Icon name={s} size={18} /></a>)}
        </div>
      </div>
      <div className="wrap ft-cols">
        {D.nav.map(g => {
          let cats = g.cats;
          if (g.tag === 'MEC') { const i = cats.indexOf('Tefsir Dersleri'); if (i !== -1) cats = cats.slice(0, i + 1); }
          return (
            <div key={g.tag} className="ft-col">
              <h4><a href={`about.html?p=${g.tag.toLowerCase()}`}>{g.person.name}</a></h4>
              {cats.map(c => <a key={c} href="index.html">{c}</a>)}
            </div>
          );
        })}
        <div className="ft-col">
          <h4>{t('footer_corp')}</h4>
          <a href="index.html">{t('footer_about')}</a>
          <a href="iletisim.html">{t('contact')}</a>
          <a href="https://serveryayinlari.com" target="_blank" rel="noopener">{t('footer_pub')}</a>
          <a href="#" onClick={e => { e.preventDefault(); openModal('join'); }}>{t('footer_membership')}</a>
          <a href="#">{t('footer_feedback')}</a>
        </div>
      </div>
      <div className="wrap ft-bottom">
        <span>{t('copyright')}</span>
        <span className="ft-mini">Designed with <Icon name="heartFill" size={13} style={{ color: '#d6455d', verticalAlign: '-2px' }} /> by <a href="https://srv.studio" target="_blank" rel="noopener">SRV Studio</a>.</span>
      </div>
    </footer>
  );
}

Object.assign(window, { Icon, Monogram, Brand, Header, TalkCard, Footer, LanguageSwitcher, useMember, memberStore, likesStore, openModal });
