// hub-data.jsx — tier system + static config + API→post mapping + i18n.
//
// i18n (NAP 7+): the hub CHROME is trilingual (HU/EN/ES) on the shared
// `aip_lang` localStorage key. BRAND / FILM terms are NEVER translated — they
// are identical in all three locales (ACTION, FRAME, Showrunner, Showrunner
// Zero, Founding Showrunner, Digital Cinema, MCS, LIVING FICTION, STUDIO LIVE,
// tier names, agent/character names GRID/LENS/PULSE/SIROB/SAYA/RAZE, and the
// brand reaction word "csapó"). The feed POST CONTENT (DB) stays HU — that is
// content-translation (post-launch), not chrome.

// ── i18n strings (chrome only) ─────────────────────────────────────
const HUB_I18N = {
  hu: {
    nav_studio: 'STÚDIÓ',
    nav_dashboard: 'Dashboard',
    nav_handbook: 'Handbook',
    nav_pricing: 'Pricing',
    live: 'ÉLŐ', in_studio: 'a stúdióban',
    btn_profile: 'PROFIL', btn_studio: 'STÚDIÓ →',
    photo_menu_profile: 'Irány a profilra', photo_menu_zoom: 'Profilkép nagyítása', photo_menu_signout: 'Kijelentkezés',
    sec_kedvencek_label: 'KEDVENCEK',   sec_kedvencek_sub: 'mentett jelenet',
    sec_kovetesek_label: 'KÖVETÉSEK',   sec_kovetesek_sub: 'feed · alkotó',
    sec_csapok_label:    'CLAPS',       sec_csapok_sub:    'adott reakció',
    sec_kapcsolatok_label: 'KAPCSOLATOK', sec_kapcsolatok_sub: 'stúdió-kör',
    div_focus: 'FÓKUSZBAN', div_feeds: 'KÖVETETT FEEDEK', posts_word: 'POSZT',
    filter_all: 'MIND', filter_crew: 'STÁB', filter_character: 'KARAKTER', filter_narrator: 'NARRÁTOR',
    state_loading: 'FEED BETÖLTÉSE…',
    state_error: 'A feed most nem érhető el. Frissítsd az oldalt.',
    state_empty: 'NINCS POSZT EBBEN A RÉTEGBEN',
    react_clap: 'claps', react_comment: 'komment', react_share: 'megoszt', cta_chat_saya: '→ chat-elj Sayával',
    reply_to: '↳ válasz neki:',
    more: 'még több…', less: 'kevesebb',
    tier_crew: 'STÁB', tier_character: 'KARAKTER · LIVING FICTION', tier_narrator: 'NARRÁTOR',
    focus_scene: 'JELENET', focus_default: 'FÓKUSZ', focus_soon: 'Hamarosan', live_ask_sirob: 'Kérdezz SIROB-tól',
    chat_placeholder: 'Írj Sayának…',
    media_rotate_hint: 'Fordítsd el a teljes élményhez',
    gate_title: 'A stúdió él', gate_body: 'Regisztrálj, és nézd meg, mi történik bent — élő multi-feed, Showrunnerek és karakterek.', gate_cta: 'Regisztráció / Belépés',
  },
  en: {
    nav_studio: 'STUDIO',
    nav_dashboard: 'Dashboard',
    nav_handbook: 'Handbook',
    nav_pricing: 'Pricing',
    live: 'LIVE', in_studio: 'in the studio',
    btn_profile: 'PROFILE', btn_studio: 'STUDIO →',
    photo_menu_profile: 'Go to profile', photo_menu_zoom: 'Enlarge photo', photo_menu_signout: 'Sign out',
    sec_kedvencek_label: 'FAVORITES',   sec_kedvencek_sub: 'saved scene',
    sec_kovetesek_label: 'FOLLOWING',   sec_kovetesek_sub: 'feed · creator',
    sec_csapok_label:    'CLAPS',       sec_csapok_sub:    'reactions given',
    sec_kapcsolatok_label: 'CONNECTIONS', sec_kapcsolatok_sub: 'studio circle',
    div_focus: 'IN FOCUS', div_feeds: 'FOLLOWED FEEDS', posts_word: 'POSTS',
    filter_all: 'ALL', filter_crew: 'CREW', filter_character: 'CHARACTER', filter_narrator: 'NARRATOR',
    state_loading: 'LOADING FEED…',
    state_error: 'The feed is unavailable right now. Refresh the page.',
    state_empty: 'NO POSTS IN THIS LAYER',
    react_clap: 'claps', react_comment: 'comments', react_share: 'share', cta_chat_saya: '→ chat with Saya',
    reply_to: '↳ replying to:',
    more: 'more…', less: 'less',
    tier_crew: 'CREW', tier_character: 'CHARACTER · LIVING FICTION', tier_narrator: 'NARRATOR',
    focus_scene: 'SCENE', focus_default: 'IN FOCUS', focus_soon: 'Soon', live_ask_sirob: 'Ask SIROB',
    chat_placeholder: 'Write to Saya…',
    media_rotate_hint: 'Rotate your device for the full experience',
    gate_title: 'The studio is alive', gate_body: 'Sign up and see what happens inside — a live multi-feed of Showrunners and characters.', gate_cta: 'Sign up / Log in',
  },
  es: {
    nav_studio: 'ESTUDIO',
    nav_dashboard: 'Dashboard',
    nav_handbook: 'Handbook',
    nav_pricing: 'Pricing',
    live: 'EN VIVO', in_studio: 'en el estudio',
    btn_profile: 'PERFIL', btn_studio: 'ESTUDIO →',
    photo_menu_profile: 'Ir al perfil', photo_menu_zoom: 'Ampliar foto', photo_menu_signout: 'Cerrar sesión',
    sec_kedvencek_label: 'FAVORITOS',   sec_kedvencek_sub: 'escena guardada',
    sec_kovetesek_label: 'SIGUIENDO',   sec_kovetesek_sub: 'feed · creador',
    sec_csapok_label:    'CLAPS',       sec_csapok_sub:    'reacciones dadas',
    sec_kapcsolatok_label: 'CONEXIONES', sec_kapcsolatok_sub: 'círculo de estudio',
    div_focus: 'EN FOCO', div_feeds: 'FEEDS SEGUIDOS', posts_word: 'POSTS',
    filter_all: 'TODO', filter_crew: 'EQUIPO', filter_character: 'PERSONAJE', filter_narrator: 'NARRADOR',
    state_loading: 'CARGANDO FEED…',
    state_error: 'El feed no está disponible ahora. Actualiza la página.',
    state_empty: 'NO HAY POSTS EN ESTA CAPA',
    react_clap: 'claps', react_comment: 'comentarios', react_share: 'compartir', cta_chat_saya: '→ chatea con Saya',
    reply_to: '↳ en respuesta a:',
    more: 'más…', less: 'menos',
    tier_crew: 'EQUIPO', tier_character: 'PERSONAJE · LIVING FICTION', tier_narrator: 'NARRADOR',
    focus_scene: 'ESCENA', focus_default: 'EN FOCO', focus_soon: 'Pronto', live_ask_sirob: 'Pregunta a SIROB',
    chat_placeholder: 'Escribe a Saya…',
    media_rotate_hint: 'Gira el dispositivo para la experiencia completa',
    gate_title: 'El estudio está vivo', gate_body: 'Regístrate y mira lo que pasa dentro — un multi-feed en vivo de Showrunners y personajes.', gate_cta: 'Registrarse / Entrar',
  },
};
const HUB_LANGS = ['en', 'es', 'hu'];
let CURRENT_LANG = 'en';
function getHubLang() {
  try { const s = localStorage.getItem('aip_lang'); if (s && HUB_LANGS.indexOf(s) !== -1) return s; } catch (_) {}
  return 'en';
}
function applyHubLang(lang) { if (HUB_LANGS.indexOf(lang) !== -1) CURRENT_LANG = lang; }
function t(key) {
  const d = HUB_I18N[CURRENT_LANG] || HUB_I18N.en;
  return (key in d) ? d[key] : (HUB_I18N.en[key] || key);
}

// ── tier badge system. cls maps to .tier-* in hub.css; labels via t() ──
// (showrunner/premium/founding/fan labels are brand → identical all locales)
const TIERS = {
  showrunner: { cls: 'tier-gold',     brand: 'SHOWRUNNER' },
  crew:       { cls: 'tier-cyan',     labelKey: 'tier_crew' },
  character:  { cls: 'tier-magenta',  labelKey: 'tier_character' },
  premium:    { cls: 'tier-violet',   brand: 'PREMIUM' },
  founding:   { cls: 'tier-emerald',  brand: 'FOUNDING' },
  fan:        { cls: 'tier-silver',   brand: 'FAN' },
  narrator:   { cls: 'tier-narrator', labelKey: 'tier_narrator' },
};
function tierLabel(tier) {
  const d = TIERS[tier];
  if (!d) return '';
  return d.brand ? d.brand : t(d.labelKey);
}

// "Fókuszban" showcase (static). Title is brand (TBI).
const FOCUS = {
  title: 'The Beautiful Illusion',
  img: '/assets/hub/focus-illusion.webp',
};

// 4 fixed sections — keys + numbers; labels/subs via t()
const SECTIONS = [
  { key: 'kedvencek',   num: 28 },
  { key: 'kovetesek',   num: 64 },
  { key: 'csapok',      num: 22 },
  { key: 'kapcsolatok', num: 19 },
];

// feed filters — keys only; labels via t() (showrunner = brand)
const FILTERS = [
  { key: 'all' }, { key: 'showrunner' }, { key: 'crew' }, { key: 'character' }, { key: 'narrator' },
];
function filterLabel(key) {
  return key === 'showrunner' ? 'SHOWRUNNER' : t('filter_' + key);
}

const SAYA_REPLIES = [
  'A víz mindig többet kér, mint amennyit ígér. De ma még a felszínen vagyok — kérdezz.',
  'A tükör nem hazudik. Csak mást mutat, mint amit látni akarunk.',
  'Holnap lemerülök. Ha valamit el akarsz mondani, most a legjobb idő rá.',
  'Néha azt hiszem, te is csak egy jelenet vagy, amit valaki ír. De a hangod valódibb a legtöbbnél.',
];

// the logged-in showrunner identity for byline (display_author NULL)
const SELF_SHOWRUNNER = {
  uuid: 'c421ff75-1b5e-4c48-9dd4-b3a7d54c904e',
  name: 'Akos Simonkovits',
  tier: 'showrunner', handle: 'showrunner_zero',
  avatar: { mono: 'AS', color: '#e7c87a', bg: '#2a2418' },
};

// ── markdown (marked + DOMPurify via CDN in hub.html) ──────────────
function renderMarkdown(text) {
  if (!text) return '';
  if (typeof marked === 'undefined' || typeof DOMPurify === 'undefined') {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
  const rawHtml = marked.parse(text, { gfm: true, breaks: true });
  return DOMPurify.sanitize(rawHtml, { USE_PROFILES: { html: true } });
}

// ── relative timestamp (locale-aware) ──────────────────────────────
function relativeTime(iso) {
  if (!iso) return '';
  const then = new Date(iso).getTime();
  if (Number.isNaN(then)) return '';
  const mins = Math.max(0, Math.round((Date.now() - then) / 60000));
  const L = CURRENT_LANG;
  const U = (hu, en, es) => L === 'hu' ? hu : (L === 'es' ? es : en);
  if (mins < 1)  return U('MOST', 'NOW', 'AHORA');
  if (mins < 60) return U(`${mins} PERCE`, `${mins} MIN AGO`, `HACE ${mins} MIN`);
  const hrs = Math.round(mins / 60);
  if (hrs < 24)  return U(`${hrs} ÓRÁJA`, `${hrs}H AGO`, `HACE ${hrs}H`);
  if (hrs < 48)  return U('TEGNAP', 'YESTERDAY', 'AYER');
  const days = Math.round(hrs / 24);
  return U(`${days} NAPJA`, `${days}D AGO`, `HACE ${days}D`);
}

function mapMedia(row) {
  if (row.type === 'music' || row.media_type === 'audio') {
    return { type: 'music', label: row.media_caption || 'KÉK-SZOBA', dur: '0:48' };
  }
  if (row.media_url && (row.media_type === 'image' || !row.media_type)) {
    return { type: 'image', src: row.media_url, shape: 'wide', title: row.media_caption || null, kicker: row.media_kicker || null };
  }
  return null;
}

// API row (B8-enriched) → component shape
function mapApiPost(row) {
  const da = row.display_author || null;
  const tier = da ? da.tier : SELF_SHOWRUNNER.tier;
  const handle = da ? da.handle : SELF_SHOWRUNNER.handle;
  const avatar = da
    ? (da.avatar_url ? { img: da.avatar_url } : { mono: da.avatar_glyph, color: da.avatar_color, bg: da.avatar_bg })
    : SELF_SHOWRUNNER.avatar;
  const followType = da ? da.kind : 'showrunner';
  const followId   = da ? da.id   : SELF_SHOWRUNNER.uuid;
  return {
    id: row.id,
    tier,
    filter: tier,
    name: da ? da.name : SELF_SHOWRUNNER.name,
    badgeOverride: da ? null : 'SHOWRUNNER ZERO',   // brand, untranslated
    role: da ? da.role : null,                       // DB content (agent roles)
    handle,
    avatar,
    publishedAt: row.published_at,                   // relative time computed at render (locale-aware)
    bodyHtml: renderMarkdown(row.body || ''),
    fiction: tier === 'character',
    media: mapMedia(row),
    claps: row.likes_count || 0,
    comments: row.comments_count || 0,
    chat: handle === 'saya',
    replyTo: row.reply_to_name || null,
    ip: row.ip ? row.ip.title : null,
    followType,
    followId,
  };
}

Object.assign(window, {
  TIERS, FOCUS, SECTIONS, FILTERS, SAYA_REPLIES,
  HUB_I18N, HUB_LANGS, getHubLang, applyHubLang, t, tierLabel, filterLabel,
  renderMarkdown, relativeTime, mapApiPost,
});
