// ═══════════════════════════════════════════════════════════════
// RINTANA — DESKTOP SHELL
// Chrome para viewports >= 1024px. MOBILE NO SE TOCA.
//
// Arquitectura:
//   - useIsDesktop() hook + listener de resize.
//     También setea la clase rt-desktop en <html> para que CSS
//     pueda anular el letterbox de phone-frame.
//   - DesktopShell: header + sidebar nav + área central.
//     Acepta prop `frame`:
//       * 'phone'    → 440px (solo VV — su layout está tuneado ahí)
//       * 'reader'   → 720px (IB reader, ED reader, DB)
//       * 'freeform' → full width (Home, IB index, ED index)
//   - DesktopHome: layout 2×2 propio.
//   - DesktopIBIndex / DesktopEDIndex: grids desktop para los
//     listados de IB/ED. Rompen el frame mobile para aprovechar el
//     ancho desktop. Al abrir un item caen al reader mobile dentro
//     del frame 'reader'.
//
// Versión desktop = opción alternativa. La primaria es mobile.
// ═══════════════════════════════════════════════════════════════

// ─── Hook ─────────────────────────────────────────────────────
function useIsDesktop(minWidth = 1024) {
  const get = () => typeof window !== 'undefined' && window.matchMedia(`(min-width: ${minWidth}px)`).matches;
  const [isDesktop, set] = React.useState(get);

  React.useEffect(() => {
    const mq = window.matchMedia(`(min-width: ${minWidth}px)`);
    const onChange = () => set(mq.matches);
    // Safari < 14 uses addListener; modern browsers use addEventListener
    if (mq.addEventListener) mq.addEventListener('change', onChange);
    else mq.addListener(onChange);
    return () => {
      if (mq.removeEventListener) mq.removeEventListener('change', onChange);
      else mq.removeListener(onChange);
    };
  }, [minWidth]);

  // Sync <html class="rt-desktop"> so CSS can override the phone letterbox
  // without a FOUC flash (inline script in index.astro sets this pre-mount).
  React.useEffect(() => {
    const root = document.documentElement;
    if (isDesktop) root.classList.add('rt-desktop');
    else root.classList.remove('rt-desktop');
  }, [isDesktop]);

  return isDesktop;
}

// ─── DESKTOP SHELL ────────────────────────────────────────────
// props:
//   section: current section id | null (home)
//   onPick(id): navigate to section
//   onHome(): navigate to home
//   frame: 'phone' | 'reader' | 'freeform' — tamaño del contenedor
//   children: contenido a renderizar en el área central
function DesktopShell({ section, onPick, onHome, frame = 'phone', children }) {
  const secs = window.RT_SECTIONS || [];

  const frameCls =
    frame === 'phone'  ? 'rtd-frame rtd-frame--phone'  :
    frame === 'reader' ? 'rtd-frame rtd-frame--reader' :
                         'rtd-freeform';

  return (
    <div className="rtd-app">
      {/* HEADER */}
      <header className="rtd-header">
        <button className="rtd-wordmark" onClick={onHome} aria-label="Inicio">
          <span className="rtd-wordmark-text">RINTANA</span>
          <span className="rtd-wordmark-dot" aria-hidden="true"/>
        </button>
        <div className="rtd-meta">
          Crítica de cine · por Nicolás Barak
        </div>
      </header>

      {/* BODY = sidebar + content */}
      <div className="rtd-body">
        <aside className="rtd-nav">
          <div className="rtd-nav-kick">Secciones</div>

          <button
            className={`rtd-nav-item ${section === null ? 'is-current' : ''}`}
            style={{ '--cellAccent': '#8a7d6b' }}
            onClick={onHome}>
            <span className="rtd-nav-num">00</span>
            <span className="rtd-nav-name">Inicio</span>
          </button>

          {secs.map((s, i) => (
            <button
              key={s.id}
              className={`rtd-nav-item ${section === s.id ? 'is-current' : ''}`}
              style={{ '--cellAccent': s.accent }}
              aria-current={section === s.id ? 'page' : undefined}
              onClick={() => onPick(s.id)}>
              <span className="rtd-nav-num">{String(i+1).padStart(2,'0')}</span>
              <span className="rtd-nav-name">
                {s.id === 'vv' && (<>Vamos <em>Viendo</em></>)}
                {s.id === 'ib' && (<>Inmenso <em>Bastardo</em></>)}
                {s.id === 'ed' && (<>Edi<em>Barak</em></>)}
                {s.id === 'about' && (<><em>Detrás</em> de escenas</>)}
              </span>
            </button>
          ))}
        </aside>

        <main className="rtd-main">
          <div className={frameCls}>
            {children}
          </div>
        </main>
      </div>
    </div>
  );
}

// ─── DESKTOP HOME ─────────────────────────────────────────────
// Grid 2×2 de portales de sección. Ocupa el área central completa.
function DesktopHome({ onPick }) {
  return (
    <div className="rtd-home">
      <div className="rtd-home-intro">
        <div className="rtd-home-kicker">RINTANA · 2026</div>
        <h1 className="rtd-home-h1">
          Distintas<br/>
          maneras de ver<br/>
          <em>lo mismo.</em>
        </h1>
        <p className="rtd-home-sub">Elegí por dónde entrar.</p>
      </div>

      <div className="rtd-home-grid">
        {/* VV */}
        <button
          className="rtd-tile rtd-tile--vv"
          onClick={() => onPick('vv')}
          aria-label="Vamos Viendo">
          <span className="rtd-tile-num">01</span>
          <span className="rtd-tile-kick">
            <span className="rtd-tile-rec" aria-hidden="true"/> EN CARTEL
          </span>
          <span className="rtd-tile-title">
            Vamos<br/><em>Viendo</em>
          </span>
          <span className="rtd-tile-desc">
            Críticas sueltas. Una película, un análisis, una opinión. A veces todo eso mezclado.
          </span>
          <span className="rtd-tile-cta">Entrar al feed →</span>
        </button>

        {/* IB */}
        <button
          className="rtd-tile rtd-tile--ib"
          onClick={() => onPick('ib')}
          aria-label="Inmenso Bastardo">
          <span className="rtd-tile-num">02</span>
          <span className="rtd-tile-kick">CUADERNOS · VOL II</span>
          <span className="rtd-tile-title">
            Inmenso<br/><em>Bastardo.</em>
          </span>
          <span className="rtd-tile-desc">
            Historia de lo épico en el séptimo arte. Capítulos largos sobre películas largas.
          </span>
          <span className="rtd-tile-cta">Abrir cuaderno →</span>
        </button>

        {/* ED */}
        <button
          className="rtd-tile rtd-tile--ed"
          onClick={() => onPick('ed')}
          aria-label="EdiBarak">
          <span className="rtd-tile-num">03</span>
          <span className="rtd-tile-kick">EDI · BARAK</span>
          <span className="rtd-tile-title">
            Edi<em>Barak</em>
          </span>
          <span className="rtd-tile-desc">
            Columnas de opinión. A veces no es solo hablar de cine.
          </span>
          <span className="rtd-tile-cta">Leer columnas →</span>
        </button>

        {/* Detrás */}
        <button
          className="rtd-tile rtd-tile--about"
          onClick={() => onPick('about')}
          aria-label="Detrás de escenas">
          <span className="rtd-tile-num">04</span>
          <span className="rtd-tile-kick">EL AUTOR</span>
          <span className="rtd-tile-title">
            Detrás<br/><em>de escenas.</em>
          </span>
          <span className="rtd-tile-desc">
            Quién escribe, cómo, por qué. Un poco de contexto sobre Rintana y Nico Barak.
          </span>
          <span className="rtd-tile-cta">Ver →</span>
        </button>
      </div>

      <div className="rtd-home-foot">
        <span>RINTANA · CINE · 2026</span>
        <span>Versión desktop · experimental</span>
      </div>
    </div>
  );
}

// ─── DESKTOP IB INDEX ─────────────────────────────────────────
// Grid de capítulos de Inmenso Bastardo. Cada tile = poster + numeral
// romano + title + meta (año · director) + excerpt.
// Click → onOpen(slug), que en RintanaApp dispara el reader.
function DesktopIBIndex({ onOpen }) {
  const CAPS = window.IB_CAPITULOS || [];

  return (
    <div className="rtd-ibx">
      <header className="rtd-ibx-head">
        <div className="rtd-ibx-kicker">CUADERNOS · VOL II</div>
        <h1 className="rtd-ibx-title">
          Inmenso <em>Bastardo</em>
        </h1>
        <p className="rtd-ibx-sub">
          Historia de lo épico en el séptimo arte. {CAPS.length} capítulos largos sobre películas largas.
        </p>
      </header>

      <ul className="rtd-ibx-grid">
        {CAPS.map((c) => (
          <li key={c.slug} className="rtd-ibx-card">
            <button
              type="button"
              className="rtd-ibx-card-btn"
              onClick={() => onOpen && onOpen(c.slug)}
              aria-label={`Abrir capítulo ${c.num} — ${c.filmTitle}`}>

              <div className="rtd-ibx-card-poster">
                {c.poster ? (
                  <img src={c.poster} alt={`Poster de ${c.filmTitle}`} loading="lazy"/>
                ) : c.cover ? (
                  <img src={c.cover} alt="" loading="lazy"/>
                ) : (
                  <div className="rtd-ibx-card-poster-empty">{c.num}</div>
                )}
                <span className="rtd-ibx-card-num">{c.num}</span>
              </div>

              <div className="rtd-ibx-card-body">
                <div className="rtd-ibx-card-kick">{c.kicker || `Capítulo ${c.num}`}</div>
                <div className="rtd-ibx-card-title">{c.filmTitle || c.title}</div>
                <div className="rtd-ibx-card-meta">
                  {c.year}{c.director ? ` · Dir. ${c.director}` : ''}
                </div>
                {c.excerpt && (
                  <p className="rtd-ibx-card-excerpt">{c.excerpt}</p>
                )}
                <div className="rtd-ibx-card-cta">Leer capítulo →</div>
              </div>
            </button>
          </li>
        ))}
      </ul>
    </div>
  );
}

// ─── DESKTOP ED INDEX ─────────────────────────────────────────
// Grid de columnas de EdiBarak. No tienen poster — typography-first.
// Cada tile: N°XX grande a la izquierda, columna con topic/title/excerpt/fecha.
function DesktopEDIndex({ onOpen }) {
  const EDS = window.EDITORIALES || [];
  const fmtDate = (iso) => {
    if (!iso) return '';
    const [y, m] = iso.split('-');
    const months = ['ENE','FEB','MAR','ABR','MAY','JUN','JUL','AGO','SEP','OCT','NOV','DIC'];
    const mi = Math.max(0, Math.min(11, parseInt(m, 10) - 1));
    return `${months[mi]} · ${y}`;
  };

  return (
    <div className="rtd-edx">
      <header className="rtd-edx-head">
        <div className="rtd-edx-kicker">EDI · BARAK</div>
        <h1 className="rtd-edx-title">
          Edi<em>Barak</em>
        </h1>
        <p className="rtd-edx-sub">
          Columnas de opinión. A veces no es solo hablar de cine. {EDS.length} entradas.
        </p>
      </header>

      <ul className="rtd-edx-grid">
        {EDS.map((e, i) => (
          <li key={e.slug} className="rtd-edx-card">
            <button
              type="button"
              className="rtd-edx-card-btn"
              onClick={() => onOpen && onOpen(e.slug)}
              aria-label={`Abrir columna ${e.title}`}>

              <div className="rtd-edx-card-num">
                N°{String(i + 1).padStart(2, '0')}
              </div>

              <div className="rtd-edx-card-body">
                <div className="rtd-edx-card-kick">
                  {e.topic && <span className="rtd-edx-card-topic">{e.topic}</span>}
                  <span className="rtd-edx-card-date">{fmtDate(e.published)}</span>
                </div>
                <div className="rtd-edx-card-title">{e.title}</div>
                {e.excerpt && (
                  <p className="rtd-edx-card-excerpt">{e.excerpt}</p>
                )}
                <div className="rtd-edx-card-cta">Leer columna →</div>
              </div>
            </button>
          </li>
        ))}
      </ul>
    </div>
  );
}

// Expose
window.useIsDesktop = useIsDesktop;
window.DesktopShell = DesktopShell;
window.DesktopHome = DesktopHome;
window.DesktopIBIndex = DesktopIBIndex;
window.DesktopEDIndex = DesktopEDIndex;
