// i18n — multilingual strings + tiny t() helper
// Strings are keyed by language code, e.g. { de, en }. The current language is
// read from window.__LANG. To add another language: add its code to LANGUAGES
// below and provide that code's value on each string in STRINGS (any string
// missing it falls back to German). Day-name arrays live in data.jsx.

const STRINGS = {
  // Heute
  servus:           { de: n => `Servus, ${n}.`,  en: n => `Hey, ${n}.` },
  heute_abend:      { de: 'Heute Abend',          en: 'Tonight' },
  bin_dabei:        { de: 'Bin dabei',            en: "I'm in" },
  bin_dabei_arrow:  { de: 'Bin dabei →',          en: "I'm in →" },
  dabei:            { de: 'dabei',                en: 'in' },
  wochenplan:       { de: 'Wochenplan',           en: 'Weekly plan' },
  wochenplan_desc:  { de: 'Zeiten setzen',        en: 'Set times' },
  freie_tage:       { de: 'Freie Tage',           en: 'Free days' },
  freie_tage_desc:  { de: 'Termine markieren',    en: 'Mark dates' },
  jetzt_online:     { de: 'Jetzt online',         en: 'Online now' },
  vorschlaege:      { de: 'Vorschläge',           en: 'Suggestions' },
  von_label:        { de: 'Von',                  en: 'From' },
  bis_label:        { de: 'Bis',                  en: 'To' },
  zeit_hinzufuegen: { de: '+ Zeit hinzufügen',    en: '+ Add time' },
  zeit_entfernen:   { de: 'Zeit entfernen',       en: 'Remove time' },
  heute:            { de: 'Heute',                en: 'Today' },
  morgen:           { de: 'Morgen',               en: 'Tomorrow' },
  noch_kein_pick:   { de: 'Noch kein Pick',       en: 'No pick yet' },
  stimmen:          { de: 'Stimmen',              en: 'votes' },
  raid_nights:      { de: 'Raid Nights',          en: 'Raid nights' },
  declined_by:      { de: g => `${g} hat Vorrang`, en: g => `${g} has priority` },
  auto_declined:    { de: 'Abgesagt',             en: 'Declined' },
  reactivate:       { de: 'Trotzdem dabei',       en: 'Join anyway' },
  recurring:        { de: 'wöchentlich',          en: 'weekly' },
  confirmed:        { de: 'bestätigt',            en: 'confirmed' },

  // Tabs
  tab_heute:        { de: 'Heute',                en: 'Today' },
  tab_kalender:     { de: 'Kalender',             en: 'Calendar' },
  tab_spiele:       { de: 'Spiele',               en: 'Games' },
  tab_crew:         { de: 'Crew',                 en: 'Crew' },

  // Kalender
  diese_woche:      { de: 'Diese Woche',          en: 'This week' },
  naechste_woche:   { de: 'Nächste Woche',        en: 'Next week' },
  kw:               { de: 'KW',                   en: 'Week' },
  crew_kalender:    { de: 'Crew-Kalender',        en: 'Crew calendar' },
  woche:            { de: 'Woche',                en: 'Week' },
  heatmap:          { de: 'Heatmap',              en: 'Heatmap' },
  wie_viele_frei:   { de: 'Wie viele aus der Gruppe sind frei?', en: 'How many in the group are free?' },
  weniger:          { de: 'weniger',              en: 'less' },
  mehr_label:       { de: 'mehr',                 en: 'more' },

  // Groups
  alle_gruppen:     { de: 'Alle Gruppen',         en: 'All groups' },
  alle:             { de: 'Alle',                 en: 'All' },
  gruppe:           { de: 'Gruppe',               en: 'Group' },
  gruppen:          { de: 'Gruppen',              en: 'Groups' },
  meine_gruppen:    { de: 'Meine Gruppen',        en: 'My groups' },
  neue_gruppe:      { de: '+ Neue Gruppe',        en: '+ New group' },
  einladen:         { de: '+ Einladen',           en: '+ Invite' },
  mitglieder:       { de: 'Mitglieder',           en: 'Members' },
  freund_einladen:  { de: 'Freund einladen',      en: 'Invite a friend' },

  // New group sheet
  neue_gruppe_title:{ de: 'Neue Gruppe',          en: 'New group' },
  gruppe_name:      { de: 'Gruppenname',          en: 'Group name' },
  gruppe_name_ph:   { de: 'z.B. Die Crew',        en: 'e.g. The Crew' },
  gruppe_icon:      { de: 'Symbol',               en: 'Icon' },
  gruppe_farbe:     { de: 'Farbe',                en: 'Color' },
  gruppe_erstellen: { de: 'Gruppe erstellen',     en: 'Create group' },

  // Crew/Stats
  die_crew:         { de: 'Die Crew',             en: 'The Crew' },
  online:           { de: 'Online',               en: 'Online' },
  offline:          { de: 'Offline',              en: 'Offline' },
  frei_heute:       { de: 'Frei heute',           en: 'Free today' },
  sessions_mo:      { de: 'Sessions / Mo',        en: 'Sessions / mo' },
  picks:            { de: 'Picks',                en: 'picks' },
  du:               { de: 'du',                   en: 'you' },
  squad_n_members:  { de: n => `${n} Mitglieder`, en: n => `${n} members` },
  n_dabei:          { de: n => `${n} dabei`,      en: n => `${n} in` },
  n_frei:           { de: n => `${n} aus der Crew frei`, en: n => `${n} of crew free` },
  wochenplan_btn:   { de: 'Meinen Wochenplan bearbeiten', en: 'Edit my weekly plan' },

  // Spiele
  spiele:           { de: 'Spiele',               en: 'Games' },
  deine_bibliothek: { de: 'Deine Bibliothek',     en: 'Your library' },
  meine_picks:      { de: 'Meine Picks',          en: 'My picks' },
  bock_worauf:      { de: 'Worauf hast du gerade Bock?', en: 'What are you in the mood for?' },
  verbinden:        { de: 'verbinden',            en: 'connect' },
  spiele_n:         { de: n => `${n} Spiele`,     en: n => `${n} games` },

  // Filters
  filter_all:       { de: 'Alle',                 en: 'All' },
  filter_steam:     { de: 'Steam',                en: 'Steam' },
  filter_epic:      { de: 'Epic',                 en: 'Epic' },
  filter_coop:      { de: 'Co-op',                en: 'Co-op' },
  filter_comp:      { de: 'Comp',                 en: 'Comp' },
  filter_multi:     { de: 'Multiplayer',          en: 'Multiplayer' },
  filter_single:    { de: 'Solo',                 en: 'Single' },
  mode_single:      { de: 'Einzelspieler',        en: 'Single-player' },
  mode_multi:       { de: 'Mehrspieler',          en: 'Multiplayer' },
  mode_coop:        { de: 'Koop',                 en: 'Co-op' },

  // Game-group assignment
  game_groups:      { de: 'Gruppen',               en: 'Groups' },
  game_groups_exclude: { de: 'Gruppen ausschließen', en: 'Exclude groups' },
  add_to_group:     { de: 'Zur Gruppe',            en: 'Add to group' },
  in_n_groups:      { de: n => `in ${n} Gruppen`,  en: n => `in ${n} groups` },
  in_no_group:      { de: 'in keiner Gruppe',      en: 'in no group' },
  games_in:         { de: g => `Spiele in ${g}`,   en: g => `Games in ${g}` },
  tap_to_add:       { de: 'Tippe Gruppen an, um Spiele zu teilen', en: 'Tap groups to share a game' },
  tap_to_exclude:   { de: 'Standardmäßig für alle Gruppen verfügbar – tippe eine Gruppe an, um dieses Spiel dort auszuschließen', en: 'Available for all groups by default – tap a group to exclude this game there' },
  excluded:         { de: 'ausgeschlossen',         en: 'excluded' },

  // Wochenplan sheet
  wochenplan_intro_a: { de: 'Markiere die Zeiten, an denen du', en: 'Mark the times you' },
  wochenplan_intro_b: { de: 'regelmäßig',          en: 'regularly' },
  wochenplan_intro_c: { de: 'zocken kannst. Wiederholt sich jede Woche.', en: 'can game. Repeats every week.' },
  speichern:        { de: 'Speichern',             en: 'Save' },
  fuer_gruppen:     { de: 'Für welche Gruppen?',   en: 'For which groups?' },

  // Termine sheet
  freie_termine:    { de: 'Freie Termine',         en: 'Free dates' },
  termine_intro_a:  { de: 'Einmalige freie Tage – tippe Daten an, an denen du', en: 'One-off free days – tap dates when you have' },
  termine_intro_b:  { de: 'zusätzlich',            en: 'extra' },
  termine_intro_c:  { de: 'Zeit hast.',            en: 'time.' },
  du_frei:          { de: 'du frei',               en: 'you free' },
  crew_frei:        { de: 'Gruppe frei',           en: 'group free' },
  termine_recurring:{ de: 'Wochenplan-Tag',        en: 'Weekly plan day' },
  termine_zeit:     { de: 'Zeit',                  en: 'Time' },
  mood_multi:       { de: 'Lust auf (mehrfach)',   en: 'Mood (multi)' },
  termine_uebernehmen: { de: 'Übernehmen',         en: 'Apply' },
  tag_entfernen:    { de: 'Tag entfernen',         en: 'Remove day' },
  termine_ganzer_tag:{ de: 'Ganzer Tag',           en: 'All day' },

  // Session detail
  session:          { de: 'Session',               en: 'Session' },
  deine_antwort:    { de: 'Deine Antwort',         en: 'Your answer' },
  teilnehmer:       { de: 'Teilnehmer',            en: 'Participants' },
  game_vote:        { de: 'Game-Vote',             en: 'Game vote' },
  gewaehlt_von:     { de: 'Gewählt von',           en: 'Picked by' },
  niemand_gewaehlt: { de: 'Noch niemand aus dieser Runde', en: 'Nobody in this session yet' },
  dabei_rsvp:       { de: 'Dabei',                 en: 'In' },
  maybe:            { de: 'Maybe',                 en: 'Maybe' },
  kann_nicht:       { de: 'Kann nicht',            en: "Can't" },
  voice_channel:    { de: 'Voice-Channel',         en: 'Voice channel' },
  beitreten:        { de: 'Beitreten',             en: 'Join' },
  top:              { de: 'Top',                   en: 'Top' },
  speichern_dabei:  { de: 'Bin dabei – speichern', en: "I'm in – save" },
  speichern_maybe:  { de: 'Maybe – speichern',     en: 'Maybe – save' },
  speichern_save:   { de: 'Antwort speichern',     en: 'Save answer' },
  vote_hint:        { de: 'Tipp ein Spiel an – deine Stimme zählt zusätzlich zu deinen Picks.', en: 'Tap a game – your vote counts on top of your picks.' },
  auto_saved:       { de: 'Automatisch gespeichert', en: 'Saved automatically' },
  vote_label:       { de: 'Vote',                   en: 'Vote' },
  pick_label:       { de: 'Pick',                   en: 'Pick' },

  // Onboarding
  ob_welcome_title:    { de: 'Bock zu zocken?',           en: 'Wanna game?' },
  ob_welcome_desc:     { de: 'Plan deine Sessions mit deinen Gruppen – einmal Zeiten setzen, automatisch matchen.', en: 'Plan your sessions with your groups – set your times once, get matched automatically.' },
  ob_start:            { de: 'Los geht\'s',               en: "Let's go" },
  ob_login:            { de: 'Schon dabei? Einloggen',    en: 'Already a member? Sign in' },
  ob_name_title:       { de: 'Wie heißt du?',             en: 'What\'s your name?' },
  ob_name_desc:        { de: 'So sehen dich deine Crew-Mitglieder.', en: 'How your crew will see you.' },
  ob_name_placeholder: { de: 'Dein Gamertag',             en: 'Your gamertag' },
  ob_link_title:       { de: 'Verknüpfe deine Bibliothek', en: 'Link your library' },
  ob_link_desc:        { de: 'Damit deine Spiele direkt für die Abstimmung auftauchen. Du kannst das später ändern.', en: 'So your games show up for voting. You can change this later.' },
  ob_link_steam:       { de: 'Mit Steam verbinden',       en: 'Link with Steam' },
  ob_link_epic:        { de: 'Mit Epic Games verbinden',  en: 'Link with Epic Games' },
  ob_skip:             { de: 'Überspringen',              en: 'Skip' },
  ob_group_title:      { de: 'Wähle deine Crew',          en: 'Choose your crew' },
  ob_group_desc:       { de: 'Trete einer Gruppe bei oder erstelle eine neue. Du kannst in mehreren sein.', en: 'Join a group or create a new one. You can be in several.' },
  ob_create_group:     { de: 'Neue Gruppe erstellen',     en: 'Create new group' },
  ob_join_via_link:    { de: 'Einladungslink einfügen',   en: 'Paste invite link' },
  ob_done_title:       { de: 'Fertig. Setz deine Zeiten.', en: 'Ready. Set your times.' },
  ob_done_desc:        { de: 'Markiere wann du regelmäßig zocken kannst – dann finden wir Sessions für dich.', en: 'Mark when you can regularly play – then we find sessions for you.' },
  ob_set_times:        { de: 'Zeiten setzen',             en: 'Set times' },
  ob_finish:           { de: 'App öffnen',                en: 'Open app' },
  ob_step:             { de: n => `Schritt ${n} von 4`,   en: n => `Step ${n} of 4` },
  connected:           { de: 'verbunden',                 en: 'connected' },

  // Profile
  profile:             { de: 'Profil',                   en: 'Profile' },
  account:             { de: 'Konto',                    en: 'Account' },
  gamertag:            { de: 'Gamertag',                 en: 'Gamertag' },
  gamertag_placeholder:{ de: 'z.B. xX_Sniper_Xx',        en: 'e.g. xX_Sniper_Xx' },
  no_gamertag:         { de: 'Kein Gamertag',            en: 'No gamertag' },
  change_photo:        { de: 'Bild ändern',              en: 'Change photo' },
  upload_photo:        { de: 'Bild hochladen',           en: 'Upload photo' },
  remove_photo:        { de: 'Bild entfernen',           en: 'Remove photo' },
  photo_uploading:     { de: 'Wird hochgeladen…',        en: 'Uploading…' },
  photo_error:         { de: 'Bild konnte nicht verarbeitet werden.', en: 'Could not process the image.' },
  hide_single_section: { de: 'Spiele',                   en: 'Games' },
  hide_single_label:   { de: 'Single-Player-Spiele ausblenden', en: 'Hide single-player games' },
  hide_single_desc:    { de: 'Zeigt überall nur noch Multiplayer- und Co-op-Spiele.', en: 'Shows only multiplayer and co-op games everywhere.' },
  logout:              { de: 'Abmelden',                 en: 'Log out' },
  leave_group:         { de: 'Verlassen',                en: 'Leave' },
  leave_group_confirm: { de: g => `Gruppe „${g}" wirklich verlassen?`, en: g => `Really leave the group "${g}"?` },
  delete_group:        { de: 'Gruppe löschen',           en: 'Delete group' },
  delete_group_confirm:{ de: g => `Die Gruppe „${g}" wirklich löschen? Das lässt sich nicht rückgängig machen und entfernt sie für alle Mitglieder.`,
                         en: g => `Really delete the group "${g}"? This can't be undone and removes it for all members.` },
  cancel:              { de: 'Abbrechen',                en: 'Cancel' },
  admin_badge:         { de: 'Admin',                    en: 'Admin' },
  my_groups_section:   { de: 'Meine Gruppen',            en: 'My groups' },
  no_groups_yet:       { de: 'Noch in keiner Gruppe.',   en: 'Not in any group yet.' },
  crew_priority_desc:  { de: 'Reihenfolge bestimmt den Vorrang: Bei zeitlich überlappenden Sessions gewinnt die obere Crew, die anderen werden automatisch abgesagt.',
                         en: 'Order sets priority: when sessions overlap in time, the crew on top wins and the others are auto-declined.' },
  move_up:             { de: 'Nach oben',                en: 'Move up' },
  move_down:           { de: 'Nach unten',               en: 'Move down' },
  prioritize_groups:   { de: 'Vorrang festlegen',        en: 'Set priority' },
  prioritize_done:     { de: 'Reihenfolge speichern',    en: 'Save order' },
  push_section:        { de: 'Benachrichtigungen',       en: 'Notifications' },
  push_label:          { de: 'Push-Benachrichtigungen',  en: 'Push notifications' },
  push_desc:           { de: 'Werde benachrichtigt, wenn deine Crew frei ist oder dich jemand einlädt.', en: 'Get notified when your crew is free or someone invites you.' },
  push_blocked:        { de: 'Push ist im Browser blockiert. Bitte in den Browser-Einstellungen erlauben.', en: 'Push is blocked in your browser. Please allow it in your browser settings.' },

  // Group detail
  num_games:           { de: n => `${n} Spiele`,         en: n => `${n} games` },
  members_count:       { de: n => `${n} Mitglieder`,     en: n => `${n} members` },
  back:                { de: 'Zurück',                   en: 'Back' },

  // Empty / invite banner (Heute)
  no_matches_title:    { de: 'Lade deine Crew ein',      en: 'Invite your crew' },
  no_matches_body:     { de: 'Noch keine Matches. Sobald du Freunde in eine Gruppe einlädst, zeigen dieser Bereich und der Kalender, wann ihr zusammen zocken könnt.', en: 'No matches yet. Once you invite friends into a group, this area and the calendar will show when you can play together.' },
  invite_now:          { de: 'Freunde einladen',         en: 'Invite friends' },

  // Notification
  notif_title:         { de: '3 aus deiner Crew sind heute Abend frei', en: '3 of your crew are free tonight' },
  notif_body:          { de: 'Helldivers 2 hat alle Stimmen – los um 20:00?', en: 'Helldivers 2 has every vote – kick off at 20:00?' },
  notif_app:           { de: 'Zocker · jetzt',            en: 'Zocker · now' },

  // Ready check ("Seid ihr bereit?")
  ready_check:         { de: 'Bereitschafts-Check',       en: 'Ready check' },
  ready_check_btn:     { de: 'Seid ihr bereit?',          en: 'Ready check?' },
  ready_check_asking:  { de: 'Frage läuft …',             en: 'Asking …' },
  ready_check_again:   { de: 'Nochmal fragen',            en: 'Ask again' },
  ready_sent_title:    { de: 'Bereitschafts-Check gesendet', en: 'Ready check sent' },
  ready_sent_body:     { de: n => `${n} ${n === 1 ? 'Person wurde' : 'Personen wurden'} gefragt, ob sie bereit ${n === 1 ? 'ist' : 'sind'}.`, en: n => `Asked ${n} ${n === 1 ? 'player' : 'players'} if they're ready.` },
  ready_ask_title:     { de: 'Bist du bereit?',           en: 'Are you ready?' },
  ready_ask_body:      { de: who => `${who} fragt, ob du für die Session bereit bist.`, en: who => `${who} is asking if you're ready for the session.` },
  ready_yes:           { de: 'Bereit',                    en: 'Ready' },
  ready_coming:        { de: 'Komme gleich',              en: 'On my way' },
  ready_status_yes:    { de: 'Bereit',                    en: 'Ready' },
  ready_status_coming: { de: 'Kommt gleich',              en: 'On the way' },
  ready_status_pending:{ de: 'Keine Antwort',             en: 'No reply' },
  ready_your_status:   { de: 'Deine Antwort',             en: 'Your answer' },
  ready_count:         { de: (r, n) => `${r}/${n} bereit`, en: (r, n) => `${r}/${n} ready` },

  // Notifications screen
  notif_title_screen:  { de: 'Benachrichtigungen',        en: 'Notifications' },
  notif_empty:         { de: 'Keine Benachrichtigungen. Sobald sich etwas tut, findest du es hier.', en: "Nothing yet. Once something happens, you'll find it here." },

  // Push lead time (Profile)
  push_lead_label:     { de: 'Erinnerung vor Spieleabend', en: 'Reminder before game night' },
  push_lead_desc:      { de: 'Wie lange vorher du eine Push-Benachrichtigung bekommst.', en: 'How long before you get a push reminder.' },
  push_lead_min:       { de: n => `${n} Min`,             en: n => `${n} min` },

  // Language (Profile)
  language_section:    { de: 'Sprache',                   en: 'Language' },
  language_label:      { de: 'App-Sprache',               en: 'App language' },
  language_desc:       { de: 'Gilt für die ganze App – jederzeit umschaltbar.', en: 'Applies across the whole app – switch anytime.' },

  // Install as app (Profile)
  install_section:     { de: 'App',                       en: 'App' },
  install_label:       { de: 'Als App installieren',      en: 'Install as app' },
  install_desc:        { de: 'Leg Zocker als Icon auf deinen Startbildschirm.', en: 'Add Zocker as an icon on your home screen.' },
  install_btn:         { de: 'Installieren',              en: 'Install' },
  install_done:        { de: 'App ist installiert ✓',     en: 'App is installed ✓' },
  install_ios:         { de: 'In Safari: Teilen-Symbol antippen → „Zum Home-Bildschirm".', en: 'In Safari: tap the Share icon → "Add to Home Screen".' },

  // Invite modes (Add friend sheet)
  invite_mode_email:   { de: 'E-Mail',                    en: 'Email' },
  invite_mode_link:    { de: 'Link',                      en: 'Link' },
  invite_mode_share:   { de: 'Teilen',                    en: 'Share' },
  invite_link_desc:    { de: 'Teile diesen Link. Wer ihn öffnet, kommt direkt in die Gruppe – neue Nutzer treten nach der Registrierung automatisch bei.', en: 'Share this link. Whoever opens it joins the group directly – new users join automatically after signing up.' },
  invite_which_group:  { de: 'Für welche Gruppe?',        en: 'Which group?' },
  invite_link_create:  { de: 'Einladungslink erstellen',  en: 'Create invite link' },
  invite_link_creating:{ de: 'Erstelle…',                 en: 'Creating…' },
  invite_link_copy:    { de: 'Link kopieren',             en: 'Copy link' },
  invite_link_copied:  { de: 'Kopiert ✓',                 en: 'Copied ✓' },
  invite_share_btn:    { de: 'Link teilen',               en: 'Share link' },
  invite_share_fallback:{ de: 'Teilen wird hier nicht unterstützt – der Link wurde kopiert.', en: 'Sharing is not supported here – the link was copied instead.' },
  invite_share_text:   { de: g => `Komm in meine Zocker-Gruppe „${g}"!`, en: g => `Join my Zocker group "${g}"!` },

  // Person detail
  person_games:        { de: 'Spiele',                    en: 'Games' },
  person_no_games:     { de: 'Noch keine Spiele geteilt.', en: 'No games shared yet.' },
  person_picks_label:  { de: 'Aktuelle Picks',            en: 'Current picks' },
  person_library_label:{ de: 'Bibliothek',               en: 'Library' },
  person_online:       { de: 'Online',                    en: 'Online' },
  person_offline:      { de: 'Offline',                   en: 'Offline' },
};

function t(key, ...args) {
  const lang = window.__LANG || 'de';
  const v = STRINGS[key];
  if (!v) return key;
  const out = v[lang] ?? v.de;
  return typeof out === 'function' ? out(...args) : out;
}

function dayLabelsShort() {
  return (window.__LANG || 'de') === 'en' ? window.DAY_LABELS_SHORT_EN : window.DAY_LABELS_SHORT_DE;
}
function dayLabelsLong() {
  return (window.__LANG || 'de') === 'en' ? window.DAY_LABELS_LONG_EN : window.DAY_LABELS_LONG_DE;
}
function todayDateLabel() {
  const lang = window.__LANG || 'de';
  const dayShort = dayLabelsShort()[window.TODAY_DOW];
  const month = lang === 'en' ? window.TODAY_MONTH_EN : window.TODAY_MONTH_DE;
  return lang === 'en'
    ? `${dayShort}, ${month} ${window.TODAY_DATE}`
    : `${dayShort}, ${window.TODAY_DATE}. ${month}`;
}
function groupName(g) {
  return (window.__LANG || 'de') === 'en' ? g.nameEn : g.nameDe;
}
function moodLabel(m) {
  return (window.__LANG || 'de') === 'en'
    ? window.MOODS[m].en : window.MOODS[m].de;
}

// ── Language registry + runtime switching ────────────────────────────────────
// Single source of truth for the languages the app offers. Add an entry here
// (and the matching strings in STRINGS) to ship a new language — the picker in
// Settings and all detection logic read from this list automatically.
const LANGUAGES = [
  { code: 'de', label: 'Deutsch', flag: '🇩🇪' },
  { code: 'en', label: 'English', flag: '🇬🇧' },
];
const LANG_STORAGE_KEY = 'zocker_lang';
const DEFAULT_LANG = 'de';

function availableLanguages() { return LANGUAGES; }
function isLangSupported(code) { return LANGUAGES.some(l => l.code === code); }

// Pick the startup language. Precedence (highest first):
//   1) the user's explicit saved choice (localStorage / cloud-synced into it)
//   2) the browser's preferred language, if we ship it
//   3) the provided fallback (the app default).
function detectInitialLang(fallback = DEFAULT_LANG) {
  try {
    const saved = localStorage.getItem(LANG_STORAGE_KEY);
    if (saved && isLangSupported(saved)) return saved;
  } catch (_) { /* ignore */ }
  try {
    const navLang = (navigator.languages && navigator.languages[0]) || navigator.language || '';
    const base = String(navLang).toLowerCase().split('-')[0];
    if (isLangSupported(base)) return base;
  } catch (_) { /* ignore */ }
  return isLangSupported(fallback) ? fallback : DEFAULT_LANG;
}

// Switch language at runtime. Persists locally (and to the cloud unless
// persistCloud is false — used when we're applying a value that just came FROM
// the cloud), then notifies React via an event so the whole tree re-renders.
function setLang(code, { persistCloud = true } = {}) {
  if (!isLangSupported(code)) return;
  window.__LANG = code;
  try { localStorage.setItem(LANG_STORAGE_KEY, code); } catch (_) { /* ignore */ }
  try { document.documentElement.lang = code; } catch (_) { /* ignore */ }
  if (persistCloud) window.fbSaveLang?.(code);
  window.dispatchEvent(new CustomEvent('zocker-lang-changed', { detail: code }));
}

// Resolve the active language at module load so the auth screen and any early
// render are already localized before MainApp mounts.
window.__LANG = detectInitialLang(window.__LANG || DEFAULT_LANG);
try { document.documentElement.lang = window.__LANG; } catch (_) { /* ignore */ }

Object.assign(window, {
  STRINGS, t, dayLabelsShort, dayLabelsLong, todayDateLabel, groupName, moodLabel,
  LANGUAGES, availableLanguages, isLangSupported, detectInitialLang, setLang,
});
