// Mapping central FR <-> EN <-> ES — source de vérité unique pour le routing
// localisé, le sélecteur de langue et les alternates hreflang.
//
// Les URLs FR sont les URLs de PRODUCTION réconciliées (cf. routes.ts) ; les
// colonnes EN/ES suivent le schéma localisé /en/* /es/*. Codes langue NEUTRES
// (fr/en/es), jamais liés à un pays.

export type Locale = 'fr' | 'en' | 'es';

export const SITE_URL = 'https://www.covalba.fr';

export const LOCALES: Locale[] = ['fr', 'en', 'es'];
export const DEFAULT_LOCALE: Locale = 'fr';

/** Language-selector landing page — target of the hreflang x-default. */
export const SELECT_LANGUAGE_PATH = '/select-language';

/** og:locale — code neutre (pas de language_TERRITORY). */
export const OG_LOCALE: Record<Locale, string> = {
  fr: 'fr',
  en: 'en',
  es: 'es',
};

/** Valeur <html lang> — code neutre. */
export const HTML_LANG: Record<Locale, string> = {
  fr: 'fr',
  en: 'en',
  es: 'es',
};

/** Code LanguageCodeEnum côté WPGraphQL/Polylang. */
export const POLYLANG_LANG: Record<Locale, 'FR' | 'EN' | 'ES'> = {
  fr: 'FR',
  en: 'EN',
  es: 'ES',
};

export interface RouteTriple {
  fr: string;
  en: string;
  es: string;
}

/** Les 26 pages traduites, équivalents FR/EN/ES (FR = URLs prod réconciliées). */
export const I18N_ROUTES: RouteTriple[] = [
  { fr: '/', en: '/en', es: '/es' },
  { fr: '/diagnostic', en: '/en/diagnostic', es: '/es/diagnostico' },
  { fr: '/estimation', en: '/en/estimation', es: '/es/presupuesto' },
  { fr: '/peinture-reflective-covatherm', en: '/en/solutions/covatherm', es: '/es/soluciones/covatherm' },
  { fr: '/laque-solaire-covatherm-light', en: '/en/solutions/covatherm-light', es: '/es/soluciones/covatherm-light' },
  { fr: '/covaseal', en: '/en/solutions/covaseal-20', es: '/es/soluciones/covaseal-20' },
  { fr: '/covametal', en: '/en/solutions/covametal-20', es: '/es/soluciones/covametal-20' },
  { fr: '/toitures/bac-acier', en: '/en/roofs/steel-deck', es: '/es/cubiertas/chapa-de-acero' },
  { fr: '/toitures/membrane-bitumineuse', en: '/en/roofs/bitumen-membrane', es: '/es/cubiertas/membrana-bituminosa' },
  { fr: '/toitures/toiture-plate', en: '/en/roofs/flat-roof', es: '/es/cubiertas/cubierta-plana' },
  { fr: '/toitures/fibrociment', en: '/en/roofs/fiber-cement', es: '/es/cubiertas/fibrocemento' },
  { fr: '/toitures/tuiles-ciment', en: '/en/roofs/concrete-tiles', es: '/es/cubiertas/tejas-de-cemento' },
  { fr: '/industrie', en: '/en/industry', es: '/es/industria' },
  { fr: '/logistique', en: '/en/industries/logistics', es: '/es/industrias/logistica' },
  { fr: '/distribution', en: '/en/industries/retail', es: '/es/industrias/distribucion' },
  { fr: '/tertiaire', en: '/en/industries/commercial', es: '/es/industrias/comercial' },
  { fr: '/collectivité', en: '/en/industries/public-sector', es: '/es/industrias/sector-publico' },
  { fr: '/industries/agricole', en: '/en/industries/agriculture', es: '/es/industrias/agricola' },
  { fr: '/industries/erp', en: '/en/industries/public-venues', es: '/es/industrias/publica-concurrencia' },
  { fr: '/qui-sommes-nous', en: '/en/about-us', es: '/es/quienes-somos' },
  { fr: '/contact', en: '/en/contact', es: '/es/contacto' },
  { fr: '/devenir-applicateur', en: '/en/become-a-partner', es: '/es/conviertete-en-aplicador' },
  { fr: '/guides', en: '/en/blog', es: '/es/blog' },
  { fr: '/guide-cool-roof', en: '/en/cool-roof-guide', es: '/es/guia-cool-roof' },
  { fr: '/simulateur-economie-energie', en: '/en/energy-savings-calculator', es: '/es/calculadora-ahorro-energia' },
  { fr: '/faq', en: '/en/faq', es: '/es/faq' },
  { fr: '/references', en: '/en/case-studies', es: '/es/casos-de-exito' },
];

const stripTrailingSlash = (p: string): string =>
  p.length > 1 ? p.replace(/\/+$/, '') : p;

/** Détecte la locale d'un pathname par son préfixe d'URL. */
export const detectLocale = (pathname: string): Locale => {
  const p = stripTrailingSlash(pathname);
  if (p === '/en' || p.startsWith('/en/')) return 'en';
  if (p === '/es' || p.startsWith('/es/')) return 'es';
  return 'fr';
};

/** Triple FR/EN/ES de la page courante, ou null si pas d'équivalent traduit. */
export const getAlternates = (pathname: string): RouteTriple | null => {
  const path = stripTrailingSlash(pathname);
  const locale = detectLocale(path);
  return I18N_ROUTES.find((r) => r[locale] === path) ?? null;
};

/** URI localisée pour `locale`, à partir de l'URI FR canonique. */
export const localizedUri = (locale: Locale, frUri: string): string => {
  const t = I18N_ROUTES.find((r) => r.fr === stripTrailingSlash(frUri));
  return t ? t[locale] : frUri;
};

/** URI FR canonique à partir d'une URI localisée (toute locale). null si inconnue. */
export const frUriFor = (localizedUriStr: string): string | null => {
  const p = stripTrailingSlash(localizedUriStr);
  const loc = detectLocale(p);
  if (loc === 'fr') return I18N_ROUTES.find((r) => r.fr === p)?.fr ?? null;
  return I18N_ROUTES.find((r) => r[loc] === p)?.fr ?? null;
};

/** URL absolue localisée (canonical / og:url / sitemap). */
export const localizedUrl = (locale: Locale, frUri: string): string =>
  `${SITE_URL}${localizedUri(locale, frUri)}`;
