import type { ZoneData } from '@/data/zones';

/**
 * Source de vérité unique pour les libellés géographiques des pages locales.
 * Évite que des composants génériques répètent une logique fausse
 * (ex. « dans le Suisse » au lieu de « en Suisse », « à Roissy » en dur).
 *
 * Gère ville / département / région (+ pays Suisse, Belgique traités comme régions).
 * La préposition des départements est irrégulière en français : on couvre les cas
 * sûrs (pluriels + « en » féminins) et on retombe sur « dans le » par défaut.
 * À terme, idéalement piloté par la donnée (colonne préposition) pour 100 % de justesse.
 */

type GeoZone = Pick<ZoneData, 'pageType' | 'ville' | 'departementNom' | 'region'>;

// Zones d'activité traitées comme des lieux nommés, mais qui ne prennent pas « à ».
const VILLE_IN_PHRASE = new Map<string, string>([
  ['Couloir de la chimie', 'dans la Vallée de la chimie'],
  ['Courtabœuf', 'dans la zone de Courtabœuf'],
  ['Garonor', 'sur la plateforme Garonor'],
  ['Saint-Charles', 'dans la zone Saint-Charles'],
]);

const DEPT_IN_PHRASE = new Map<string, string>([
  ['Ain', "dans l'Ain"],
  ['Aisne', "dans l'Aisne"],
  ['Allier', "dans l'Allier"],
  ['Ariège', 'en Ariège'],
  ['Aube', "dans l'Aube"],
  ['Aude', "dans l'Aude"],
  ['Aveyron', "dans l'Aveyron"],
  ['Eure', "dans l'Eure"],
  ['Eure-et-Loir', 'en Eure-et-Loir'],
  ['Hérault', "dans l'Hérault"],
  ['Indre-et-Loire', 'en Indre-et-Loire'],
  ['Loire', 'dans la Loire'],
  ['Loir-et-Cher', 'dans le Loir-et-Cher'],
  ['Lot-et-Garonne', 'dans le Lot-et-Garonne'],
  ['Oise', "dans l'Oise"],
  ['Orne', "dans l'Orne"],
  ['Yonne', "dans l'Yonne"],
]);

const DEPT_ELISION_FEMININ = new Set(['Aisne', 'Aube', 'Aude', 'Eure', 'Oise', 'Orne', 'Yonne']);

// Départements qui prennent « dans les … » (pluriels)
const DEPT_PLURIEL = new Set([
  'Bouches-du-Rhône', 'Hauts-de-Seine', 'Yvelines', 'Landes', 'Vosges', 'Ardennes',
  'Alpes-Maritimes', 'Hautes-Alpes', 'Alpes-de-Haute-Provence', "Côtes-d'Armor",
  'Deux-Sèvres', 'Pyrénées-Atlantiques', 'Pyrénées-Orientales', 'Hautes-Pyrénées',
]);

// Départements qui prennent « en … » (féminins / commençant par voyelle au féminin)
const DEPT_EN = new Set([
  'Seine-Saint-Denis', 'Seine-Maritime', 'Seine-et-Marne', 'Gironde', 'Loire-Atlantique',
  'Haute-Garonne', 'Savoie', 'Haute-Savoie', 'Vendée', 'Dordogne', 'Charente',
  'Charente-Maritime', 'Corrèze', 'Creuse', 'Vienne', 'Haute-Vienne', 'Sarthe', 'Mayenne',
  'Manche', 'Marne', 'Haute-Marne', 'Meuse', 'Moselle', 'Meurthe-et-Moselle', 'Drôme',
  'Isère', 'Ardèche', 'Saône-et-Loire', 'Haute-Saône', "Côte-d'Or", 'Loire', 'Haute-Loire',
  'Corse-du-Sud', 'Haute-Corse', 'Essonne', 'Gard', // Gard est « dans le Gard » → retiré ci-dessous si besoin
]);
DEPT_EN.delete('Gard'); // « dans le Gard »

/** Préposition + nom d'un département : « dans le Rhône » / « dans les Bouches-du-Rhône » / « en Seine-Saint-Denis ». */
export function departementInPhrase(departementNom: string): string {
  const custom = DEPT_IN_PHRASE.get(departementNom);
  if (custom) return custom;
  if (DEPT_PLURIEL.has(departementNom)) return `dans les ${departementNom}`;
  if (DEPT_EN.has(departementNom)) return `en ${departementNom}`;
  return `dans le ${departementNom}`;
}

/** Préposition + nom d'une ville : « à Roissy », « aux Ulis », « au Havre », « à La Plaine ». */
export function villeInPhrase(ville: string): string {
  const custom = VILLE_IN_PHRASE.get(ville);
  if (custom) return custom;
  if (ville.startsWith('Les ')) return `aux ${ville.slice(4)}`;
  if (ville.startsWith('Le ')) return `au ${ville.slice(3)}`;
  return `à ${ville}`;
}

/** « à Roissy » / « dans le Rhône » / « dans les Bouches-du-Rhône » / « en Suisse ». */
export function zoneInPhrase(z: GeoZone): string {
  if (z.pageType === 'region') return `en ${z.region}`;
  if (z.pageType === 'departement') return departementInPhrase(z.departementNom);
  return villeInPhrase(z.ville ?? '');
}

/** Variante capitalisée pour un début de phrase : « À Roissy », « En Suisse ». */
export function zoneInPhraseCap(z: GeoZone): string {
  const p = zoneInPhrase(z);
  return p.charAt(0).toUpperCase() + p.slice(1);
}

/** Phrase de couverture : « à Roissy et ses environs » / « dans tout le Rhône » / « partout en Suisse ». */
export function zoneInterventionPhrase(z: GeoZone): string {
  if (z.pageType === 'region') return `partout en ${z.region}`;
  if (z.pageType === 'departement') {
    const d = z.departementNom;
    const phrase = departementInPhrase(d);
    if (phrase.startsWith('en ')) return `partout ${phrase}`;
    if (phrase.startsWith('dans les ')) return `dans tous les ${phrase.slice('dans les '.length)}`;
    if (phrase.startsWith('dans la ')) return `dans toute la ${phrase.slice('dans la '.length)}`;
    if (phrase.startsWith("dans l'")) {
      const article = DEPT_ELISION_FEMININ.has(d) ? 'toute' : 'tout';
      return `dans ${article} l'${phrase.slice("dans l'".length)}`;
    }
    if (phrase.startsWith('dans le ')) return `dans tout le ${phrase.slice('dans le '.length)}`;
    return phrase;
  }
  return `${villeInPhrase(z.ville ?? '')} et ses environs`;
}

/** Nom affichable simple de la zone. */
export function zoneName(z: GeoZone): string {
  if (z.pageType === 'region') return z.region;
  if (z.pageType === 'departement') return z.departementNom;
  return z.ville ?? '';
}
