/* Track & Train — i18n (EN default, FR, ES) */

const LANGS = [
  { id: 'en', label: 'EN', name: 'English' },
  { id: 'fr', label: 'FR', name: 'Français' },
  { id: 'es', label: 'ES', name: 'Español' },
];

const STRINGS = {
  en: {
    tab_calendar: 'Calendar', tab_bytype: 'By type', tab_types: 'Types',
    cancel: 'Cancel', save: 'Save', delete: 'Delete',
    today: 'today', yesterday: 'yesterday', tomorrow: 'tomorrow',
    cal_today: 'Today',
    cal_hint: 'Tap a day to view or add a session.',
    day_no_session: 'No session that day.',
    add_workout: 'Add a workout',
    new_workout: 'New workout', edit_title: 'Edit',
    save_session: 'Save session', save_changes: 'Save changes',
    no_notes: 'No notes', deleted_type: 'Deleted type',
    confirm_del_session_title: 'Delete this session?',
    confirm_del_session_msg: 'This action is permanent.',
    f_type: 'Workout type', f_newtype: 'New type',
    f_feeling: 'Feeling', f_feeling_hint: 'Tap an emoji',
    f_notes: 'Session notes',
    f_notes_ph: 'Exercises, loads, feelings, distances…',
    feel1: 'Tough', feel2: 'Meh', feel3: 'Okay', feel4: 'Good', feel5: 'On fire',
    nt_name: 'Type name', nt_name_ph: 'e.g. Plyometrics',
    nt_color: 'Color', nt_create: 'Create type',
    bt_eyebrow: 'Workout type',
    st_total: 'Total', st_month: 'This month', st_feeling: 'Feeling',
    st_permonth: 'Per month', all_time: 'All-time',
    history: 'History',
    bt_empty_title: 'No sessions yet',
    bt_empty_msg: 'Add a “{name}” session from the calendar and it’ll show up here.',
    notype_title: 'No types',
    notype_msg: 'Create a workout type from the calendar to get started.',
    types_title: 'Workout types',
    add_type: 'Add a type',
    data: 'Data', reset: 'Reset', reset_desc: 'Erase all sessions and types',
    export: 'Export', import: 'Import',
    export_desc: 'Download a backup file', import_desc: 'Load data from a file',
    export_done: 'Backup downloaded', import_done: 'Data imported', import_error: 'Invalid file',
    import_confirm_title: 'Replace all data?',
    import_confirm_msg: 'Importing replaces your current sessions and types. Export first if you want a copy.',
    reset_confirm_title: 'Reset everything?',
    reset_confirm_msg: 'All sessions and types will be erased.',
    reset_done: 'Data reset', data_local: 'Your data stays on this device.',
    newtype_title: 'New type', edittype_title: 'Edit type',
    name: 'Name', create_type: 'Create type',
    type_deleted: 'Type deleted',
    del_type_title: 'Delete “{name}”?',
    del_type_msg_with: '{n} session of this type will also be deleted.',
    del_type_msg_with_p: '{n} sessions of this type will also be deleted.',
    del_type_msg_none: 'This type will be removed.',
    language: 'Language',
    session_one: '{n} session', session_other: '{n} sessions',
  },
  fr: {
    tab_calendar: 'Calendrier', tab_bytype: 'Par type', tab_types: 'Types',
    cancel: 'Annuler', save: 'Enregistrer', delete: 'Supprimer',
    today: "aujourd'hui", yesterday: 'hier', tomorrow: 'demain',
    cal_today: "Aujourd'hui",
    cal_hint: 'Touche un jour pour voir ou ajouter une séance.',
    day_no_session: 'Aucune séance ce jour-là.',
    add_workout: 'Ajouter un entraînement',
    new_workout: 'Nouvel entraînement', edit_title: 'Modifier',
    save_session: 'Enregistrer la séance', save_changes: 'Enregistrer les modifications',
    no_notes: 'Pas de notes', deleted_type: 'Type supprimé',
    confirm_del_session_title: 'Supprimer cette séance ?',
    confirm_del_session_msg: 'Cette action est définitive.',
    f_type: "Type d'entraînement", f_newtype: 'Nouveau type',
    f_feeling: 'Ressenti', f_feeling_hint: 'Touche un emoji',
    f_notes: 'Notes de séance',
    f_notes_ph: 'Exercices, charges, sensations, distances…',
    feel1: 'Difficile', feel2: 'Bof', feel3: 'Correct', feel4: 'Bien', feel5: 'Au top',
    nt_name: 'Nom du type', nt_name_ph: 'ex. Pliométrie',
    nt_color: 'Couleur', nt_create: 'Créer le type',
    bt_eyebrow: "Type d'entraînement",
    st_total: 'Total', st_month: 'Ce mois', st_feeling: 'Ressenti',
    st_permonth: 'Par mois', all_time: 'Tout',
    history: 'Historique',
    bt_empty_title: 'Pas encore de séance',
    bt_empty_msg: 'Ajoute une séance « {name} » depuis le calendrier et elle apparaîtra ici.',
    notype_title: 'Aucun type',
    notype_msg: "Crée un type d'entraînement depuis le calendrier pour commencer.",
    types_title: "Types d'entraînement",
    add_type: 'Ajouter un type',
    data: 'Données', reset: 'Réinitialiser', reset_desc: 'Efface toutes les séances et types',
    export: 'Exporter', import: 'Importer',
    export_desc: 'Télécharger une sauvegarde', import_desc: 'Charger depuis un fichier',
    export_done: 'Sauvegarde téléchargée', import_done: 'Données importées', import_error: 'Fichier invalide',
    import_confirm_title: 'Remplacer toutes les données ?',
    import_confirm_msg: "L'import remplace tes séances et types actuels. Exporte d'abord pour garder une copie.",
    reset_confirm_title: 'Tout réinitialiser ?',
    reset_confirm_msg: 'Toutes les séances et tous les types seront effacés.',
    reset_done: 'Données réinitialisées', data_local: 'Tes données restent sur cet appareil.',
    newtype_title: 'Nouveau type', edittype_title: 'Modifier le type',
    name: 'Nom', create_type: 'Créer le type',
    type_deleted: 'Type supprimé',
    del_type_title: 'Supprimer « {name} » ?',
    del_type_msg_with: '{n} séance de ce type sera supprimée également.',
    del_type_msg_with_p: '{n} séances de ce type seront supprimées également.',
    del_type_msg_none: 'Ce type sera retiré.',
    language: 'Langue',
    session_one: '{n} séance', session_other: '{n} séances',
  },
  es: {
    tab_calendar: 'Calendario', tab_bytype: 'Por tipo', tab_types: 'Tipos',
    cancel: 'Cancelar', save: 'Guardar', delete: 'Eliminar',
    today: 'hoy', yesterday: 'ayer', tomorrow: 'mañana',
    cal_today: 'Hoy',
    cal_hint: 'Toca un día para ver o añadir una sesión.',
    day_no_session: 'Ninguna sesión ese día.',
    add_workout: 'Añadir un entrenamiento',
    new_workout: 'Nuevo entrenamiento', edit_title: 'Editar',
    save_session: 'Guardar sesión', save_changes: 'Guardar cambios',
    no_notes: 'Sin notas', deleted_type: 'Tipo eliminado',
    confirm_del_session_title: '¿Eliminar esta sesión?',
    confirm_del_session_msg: 'Esta acción es definitiva.',
    f_type: 'Tipo de entrenamiento', f_newtype: 'Nuevo tipo',
    f_feeling: 'Sensación', f_feeling_hint: 'Toca un emoji',
    f_notes: 'Notas de la sesión',
    f_notes_ph: 'Ejercicios, cargas, sensaciones, distancias…',
    feel1: 'Difícil', feel2: 'Regular', feel3: 'Normal', feel4: 'Bien', feel5: 'Increíble',
    nt_name: 'Nombre del tipo', nt_name_ph: 'ej. Pliometría',
    nt_color: 'Color', nt_create: 'Crear tipo',
    bt_eyebrow: 'Tipo de entrenamiento',
    st_total: 'Total', st_month: 'Este mes', st_feeling: 'Sensación',
    st_permonth: 'Por mes', all_time: 'Todo',
    history: 'Historial',
    bt_empty_title: 'Aún no hay sesiones',
    bt_empty_msg: 'Añade una sesión «{name}» desde el calendario y aparecerá aquí.',
    notype_title: 'Sin tipos',
    notype_msg: 'Crea un tipo de entrenamiento desde el calendario para empezar.',
    types_title: 'Tipos de entrenamiento',
    add_type: 'Añadir un tipo',
    data: 'Datos', reset: 'Restablecer', reset_desc: 'Borra todas las sesiones y tipos',
    export: 'Exportar', import: 'Importar',
    export_desc: 'Descargar una copia de seguridad', import_desc: 'Cargar datos desde un archivo',
    export_done: 'Copia descargada', import_done: 'Datos importados', import_error: 'Archivo no válido',
    import_confirm_title: '¿Reemplazar todos los datos?',
    import_confirm_msg: 'La importación reemplaza tus sesiones y tipos actuales. Exporta primero si quieres una copia.',
    reset_confirm_title: '¿Restablecer todo?',
    reset_confirm_msg: 'Todas las sesiones y tipos se borrarán.',
    reset_done: 'Datos restablecidos', data_local: 'Tus datos permanecen en este dispositivo.',
    newtype_title: 'Nuevo tipo', edittype_title: 'Editar tipo',
    name: 'Nombre', create_type: 'Crear tipo',
    type_deleted: 'Tipo eliminado',
    del_type_title: '¿Eliminar «{name}»?',
    del_type_msg_with: '{n} sesión de este tipo también se eliminará.',
    del_type_msg_with_p: '{n} sesiones de este tipo también se eliminarán.',
    del_type_msg_none: 'Este tipo se eliminará.',
    language: 'Idioma',
    session_one: '{n} sesión', session_other: '{n} sesiones',
  },
};

// Localized date names
const I18N_MONTHS = {
  en: ['January','February','March','April','May','June','July','August','September','October','November','December'],
  fr: ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'],
  es: ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre'],
};
const I18N_MONTHS_SHORT = {
  en: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
  fr: ['janv','févr','mars','avr','mai','juin','juil','août','sept','oct','nov','déc'],
  es: ['ene','feb','mar','abr','may','jun','jul','ago','sep','oct','nov','dic'],
};
const I18N_DOW = { // Monday-first, for calendar header
  en: ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'],
  fr: ['lun','mar','mer','jeu','ven','sam','dim'],
  es: ['lun','mar','mié','jue','vie','sáb','dom'],
};
const I18N_DOW_LONG = { // indexed by getDay() — 0=Sun..6=Sat
  en: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
  fr: ['dimanche','lundi','mardi','mercredi','jeudi','vendredi','samedi'],
  es: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
};

// Current language (module-level, set during App render)
let CURRENT_LANG = 'en';
const setCurrentLang = (l) => { if (STRINGS[l]) CURRENT_LANG = l; };
const getLang = () => CURRENT_LANG;

const t = (key, vars) => {
  let s = (STRINGS[CURRENT_LANG] && STRINGS[CURRENT_LANG][key]);
  if (s == null) s = STRINGS.en[key];
  if (s == null) return key;
  if (vars) for (const k in vars) s = s.split('{' + k + '}').join(vars[k]);
  return s;
};

const nSessions = (n) => t(n === 1 ? 'session_one' : 'session_other', { n });

// Localized date helpers (use CURRENT_LANG)
const monthName = (m) => I18N_MONTHS[CURRENT_LANG][m];
const monthShort = (m) => I18N_MONTHS_SHORT[CURRENT_LANG][m];
const dowHeader = () => I18N_DOW[CURRENT_LANG];
const dowLong = (dayIdx) => I18N_DOW_LONG[CURRENT_LANG][dayIdx];

const formatLongDate = (key) => {
  const d = parseKey(key);
  const dn = dowLong(d.getDay());
  const day = d.getDate();
  const mn = monthName(d.getMonth());
  if (CURRENT_LANG === 'en') return `${dn}, ${mn} ${day}`;
  if (CURRENT_LANG === 'es') return `${dn} ${day} de ${mn}`;
  return `${dn} ${day} ${mn}`; // fr
};
const relativeDay = (key) => {
  const tk = todayKey();
  if (key === tk) return t('today');
  const diff = Math.round((parseKey(key) - parseKey(tk)) / 86400000);
  if (diff === -1) return t('yesterday');
  if (diff === 1) return t('tomorrow');
  return null;
};

// Storage for language
const LANG_KEY = 'track-train-lang';
const loadLang = () => { try { return localStorage.getItem(LANG_KEY) || 'en'; } catch (e) { return 'en'; } };
const saveLang = (l) => { try { localStorage.setItem(LANG_KEY, l); } catch (e) {} };

Object.assign(window, {
  LANGS, STRINGS, t, nSessions,
  setCurrentLang, getLang,
  monthName, monthShort, dowHeader, dowLong,
  formatLongDate, relativeDay,
  loadLang, saveLang,
});
