function isValidEmail(email) {
  const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailPattern.test(email);
}

function validateField(fieldId, showErrors = true) {
  const inputElement = document.getElementById(fieldId);

  if (!inputElement) {
    return true;
  }

  const value = document.getElementById(fieldId).value.trim();
  const rule = validationRules[fieldId]; // Importé de js/json/json-verif-form.js
  const errorElement = document.getElementById(`${fieldId}-error`);

  let isValid = true;
  let errorMessage = "";

  // Vérifie si le champ est requis et vide

  if (rule.required && (!value || value == '')) {
    errorMessage = "Ce champ est obligatoire.";
    isValid = false;
  }

  // Vérifie la longueur de la saisie si spécifié et nécessaire
  if (isValid && value && rule.length && value.length !== rule.length) {
    errorMessage = `Veuillez saisir ${rule.length} caractères, il y en a actuellement ${value.length}.`;
    isValid = false;
  }

  // Vérifie si la saisie est un nombre sans décimale ou avec un maximum de deux chiffres après la virgule
  if (isValid && value && rule.numberFormat) {
    const isNumberFormatValid = /^(?:\d+|\d+\.\d{1,2})$/.test(value);

    if (!isNumberFormatValid) {
      errorMessage = "Le champ doit être nombre de deux décimal maximum '00.00' ou entier '00'";
      isValid = false;
    }
  }

  // Vérifie si la saisie est un taux sans décimale ou avec un maximum de trois chiffres après la virgule
  if (isValid && value && rule.tauxFormat) {
    const isTauxFormatValid = /^(?:\d+|\d+\.\d{1,3})$/.test(value);

    if (!isTauxFormatValid) {
      errorMessage = "Le champ doit être un nombre avec un maximum de trois décimales '00.000' ou entier '00'";
      isValid = false;
    }
  }

  // Vérifie si le champ doit être compris dans un certain intervalle
  if (isValid && value && rule.range) {
    const numberValue = parseFloat(value);

    if (isNaN(numberValue) || numberValue < rule.range.min || numberValue > rule.range.max) {
      errorMessage = rule.errorMsg;
      isValid = false;
    }
  }

  // Valide l'adresse e-mail seulement si le champ n'est pas vide
  if (isValid && value && rule.email) {
    if (!isValidEmail(value)) {
      errorMessage = rule.errorMsg;
      isValid = false;
    }
  }

  // Vérifie la présence de caractères potentiellement problématiques
  const specialCharsPattern = /[;">&<]/g;
  let invalidChars = value.match(specialCharsPattern);

  if (isValid && value && invalidChars) {
    invalidChars = [...new Set(invalidChars)];
    errorMessage = `Caractère(s) invalide(s) détecté(s) [ ${invalidChars.join("  ")} ].`;
    isValid = false;
  }

  // Vérifie si le champ commence par le caractère spécifié
  if (isValid && value && rule.startsWith && !value.startsWith(rule.startsWith)) {
    errorMessage = `Le champ doit commencer par '${rule.startsWith}' majuscule.`;
    isValid = false;
  }

  // Vérifie si le champ date est correct
  if (isValid && value && rule.dateFormat) {
    const isDateFormatValid = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/\d{4}$|^00\/00\/0000$/.test(value);

    if (!isDateFormatValid) {
      errorMessage = "Le champ doit être au format JJ//MM/AAAA ou 00/00/0000.";
      isValid = false;
    }
  }

  // Vérifie si la saisie ne contient pas d'espace
  if (isValid && value && rule.noSpace) {
    const isNoSpaceValid = /^\S*$/.test(value);

    if (!isNoSpaceValid) {
      errorMessage = "La saisie ne doit pas contenir d'espaces.";
      isValid = false;
    }
  }

  // Vérifie si le champ date est correct au format JJ/MM
  if (isValid && value && rule.dateFormatShort) {
    const isDateFormatShortValid = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])$|^00\/00$/.test(value);

    if (!isDateFormatShortValid) {
      errorMessage = "Le champ doit être au format JJ/MM ou 00/00.";
      isValid = false;
    }
  }

  // Vérifie la casse des caractères si spécifié
  if (isValid && value && rule.case) {
    if (rule.case === "upper" && value !== value.toUpperCase()) {
      errorMessage = "Le champ doit être en majuscules.";
      isValid = false;
    } else if (rule.case === "lower" && value !== value.toLowerCase()) {
      errorMessage = "Le champ doit être en minuscules.";
      isValid = false;
    }
  }

  // Vérifie si le champ doit être numérique
  if (isValid && value && rule.digit) {
    const isNumeric = /^\d+$/.test(value); // Vérifie si la chaîne est un nombre entier

    if (!isNumeric) {
      errorMessage = "Le champ doit contenir uniquement des chiffres.";
      isValid = false;
    }
  }

  // Affiche ou cache le message d'erreur selon la validité du champ
  if (showErrors) {
    errorElement.textContent = errorMessage;
    errorElement.style.display = isValid ? 'none' : 'block';
  }

  return isValid;
}

function updateSubmitButtonState(formId) {
  
  let allFieldsValid = true;
  const form = document.querySelector(`#${formId}`);

  if (!form) {
    console.error('Formulaire non trouvé:', formId);
    return;
  }

  for (const fieldId in validationRules) {
    const inputElement = form.querySelector(`#${fieldId}`);

    if (inputElement && !validateField(fieldId, false)) {
      allFieldsValid = false;
    }
  }

  const submitButtons = form.querySelectorAll('button[type="submit"], input[type="submit"]');

  if (submitButtons && submitButtons.length > 0) {
    submitButtons.forEach((button) => {
      button.disabled = !allFieldsValid;
    })
  }
}