// Construction des noms de fichiers pour le référencement (F6).

const REMPLACEMENTS = {
  à: 'a', â: 'a', ä: 'a', á: 'a', ã: 'a', å: 'a',
  ç: 'c',
  è: 'e', é: 'e', ê: 'e', ë: 'e',
  ì: 'i', í: 'i', î: 'i', ï: 'i',
  ñ: 'n',
  ò: 'o', ó: 'o', ô: 'o', ö: 'o', õ: 'o', ø: 'o',
  ù: 'u', ú: 'u', û: 'u', ü: 'u',
  ý: 'y', ÿ: 'y',
  æ: 'ae', œ: 'oe', ß: 'ss',
  '°': '', '€': 'eur', '&': 'et', "'": '-', '’': '-',
};

/** Transforme un texte libre en segment d'URL propre. */
export function slug(texte) {
  if (texte == null) return '';
  return String(texte)
    .toLowerCase()
    .replace(/[À-ɏ°€&'’ß]/g, (c) => REMPLACEMENTS[c] ?? c)
    .normalize('NFD')
    .replace(/[̀-ͯ]/g, '')
    .replace(/[^a-z0-9]+/g, '-')
    .replace(/^-+|-+$/g, '');
}

const VARIABLES = ['mot-cle', 'detail', 'ville', 'departement', 'marque', 'original', 'index'];

/**
 * Applique un modèle de nom du type {mot-cle}-{ville}-{index}.
 * Les variables vides disparaissent sans laisser de tirets en double.
 */
export function appliquerModele(modele, valeurs, { longueurMax = 70 } = {}) {
  let nom = String(modele || '{original}');

  for (const cle of VARIABLES) {
    const brut = valeurs[cle];
    const remplacement = cle === 'index' ? (brut ?? '') : slug(brut);
    nom = nom.replaceAll(`{${cle}}`, remplacement);
  }

  nom = nom
    .replace(/[^a-zA-Z0-9-]+/g, '-')
    .replace(/-{2,}/g, '-')
    .replace(/^-+|-+$/g, '')
    .toLowerCase();

  if (!nom) nom = 'image';
  if (nom.length > longueurMax) {
    nom = nom.slice(0, longueurMax).replace(/-+[^-]*$/, '').replace(/-+$/, '') || nom.slice(0, longueurMax);
  }
  return nom;
}

/** Numérote l'index sur deux chiffres minimum : 1 -> 01, 12 -> 12, 100 -> 100. */
export function formaterIndex(n) {
  return String(n).padStart(2, '0');
}

/** Ajoute -2, -3… tant que le nom est déjà pris dans le lot en cours. */
export function eviterDoublon(nom, dejaPris) {
  if (!dejaPris.has(nom)) {
    dejaPris.add(nom);
    return nom;
  }
  let n = 2;
  while (dejaPris.has(`${nom}-${n}`)) n += 1;
  const unique = `${nom}-${n}`;
  dejaPris.add(unique);
  return unique;
}

export const variablesDisponibles = VARIABLES;
