export type Locale = { code: string; label: string };

// Sous-ensemble des marchés de l'agence, extensible ; libellés français en dur.
// Les codes doivent rester conformes aux contraintes de l'api
// (`^[A-Z]{2}$` / `^[a-z]{2}$`, `api/app/sites/schemas.py`).

// ISO 3166-1 alpha-2.
export const COUNTRIES: Locale[] = [
  { code: "FR", label: "France" },
  { code: "BE", label: "Belgique" },
  { code: "CH", label: "Suisse" },
  { code: "LU", label: "Luxembourg" },
  { code: "MC", label: "Monaco" },
  { code: "DE", label: "Allemagne" },
  { code: "AT", label: "Autriche" },
  { code: "GB", label: "Royaume-Uni" },
  { code: "IE", label: "Irlande" },
  { code: "ES", label: "Espagne" },
  { code: "PT", label: "Portugal" },
  { code: "IT", label: "Italie" },
  { code: "NL", label: "Pays-Bas" },
  { code: "PL", label: "Pologne" },
  { code: "CZ", label: "Tchéquie" },
  { code: "SE", label: "Suède" },
  { code: "NO", label: "Norvège" },
  { code: "DK", label: "Danemark" },
  { code: "FI", label: "Finlande" },
  { code: "GR", label: "Grèce" },
  { code: "RO", label: "Roumanie" },
  { code: "TR", label: "Turquie" },
  { code: "US", label: "États-Unis" },
  { code: "CA", label: "Canada" },
  { code: "MX", label: "Mexique" },
  { code: "BR", label: "Brésil" },
  { code: "MA", label: "Maroc" },
  { code: "TN", label: "Tunisie" },
  { code: "DZ", label: "Algérie" },
  { code: "SN", label: "Sénégal" },
  // Marchés constatés sur un export KWFinder réel (`kwfinder_multi_country.csv`) : ces six-là
  // manquaient tous à la table, et `knownCountry` remplaçait donc chacun d'eux, en silence, par
  // `FR`. Le wizard d'import nomme désormais un pays avec le libellé servi par l'api (§4.2) ;
  // ces entrées servent la création **manuelle** d'une cible (`TargetsManager`), qui n'a que
  // cette table pour peupler son sélecteur.
  { code: "AU", label: "Australie" },
  { code: "NZ", label: "Nouvelle-Zélande" },
  { code: "SG", label: "Singapour" },
  { code: "HK", label: "Hong Kong" },
  { code: "JP", label: "Japon" },
  { code: "IL", label: "Israël" },
];

// ISO 639-1.
export const LANGUAGES: Locale[] = [
  { code: "fr", label: "français" },
  { code: "en", label: "anglais" },
  { code: "de", label: "allemand" },
  { code: "es", label: "espagnol" },
  { code: "it", label: "italien" },
  { code: "pt", label: "portugais" },
  { code: "nl", label: "néerlandais" },
  { code: "pl", label: "polonais" },
  { code: "cs", label: "tchèque" },
  { code: "sv", label: "suédois" },
  { code: "no", label: "norvégien" },
  { code: "da", label: "danois" },
  { code: "fi", label: "finnois" },
  { code: "el", label: "grec" },
  { code: "ro", label: "roumain" },
  { code: "tr", label: "turc" },
  { code: "ar", label: "arabe" },
  { code: "ru", label: "russe" },
  { code: "ja", label: "japonais" },
  { code: "zh", label: "chinois" },
  // Langue que CLDR propose pour IL : sans elle, la cible israélienne d'un export réel n'était
  // créable ni depuis l'écran des sites, ni depuis le wizard d'import.
  { code: "he", label: "hébreu" },
];

export const DEFAULT_COUNTRY = "FR";
export const DEFAULT_LANGUAGE = "fr";

// La suggestion du preflight vient du site lui-même (TLD, `<html lang>`) : elle peut
// porter un code absent de nos tables. Un select ne doit jamais valoir un code sans
// option correspondante — on retombe alors sur le défaut (amendement §5).
//
// ATTENTION : ces deux fonctions **remplacent** un code inconnu, elles ne le signalent pas.
// Elles n'ont donc leur place que là où une valeur de repli est acceptable — le formulaire de
// création d'une cible. Jamais pour **nommer** un pays lu ailleurs : le recensement d'un import
// (§4.2) fait passer 249 codes ISO, et `knownCountry` transformerait chaque code absent de la
// table en « FR ». Un pays servi par l'api s'affiche avec le libellé que l'api en donne.
export function knownCountry(code: string): string {
  return COUNTRIES.some((country) => country.code === code) ? code : DEFAULT_COUNTRY;
}

export function knownLanguage(code: string): string {
  return LANGUAGES.some((language) => language.code === code) ? code : DEFAULT_LANGUAGE;
}

export function formatTarget(target: { country: string; language: string }): string {
  const country = COUNTRIES.find((c) => c.code === target.country)?.label ?? target.country;
  const language = LANGUAGES.find((l) => l.code === target.language)?.label ?? target.language;
  return `${country} · ${language}`;
}
