/*==== VALIDAZIONI SEZIONE DATI BANCARI ====*/

// Regex IBAN Italia: IT + 2 cifre + 1 lettera + 5 cifre (ABI) + 5 cifre (CAB) + 12 alfanumerici
const reg_iban_IT = /^IT\d{2}[A-Z]\d{5}\d{5}[0-9A-Z]{12}$/;

/* ---------------- Helper per Modulo 97 ----------------- */

// Normalizza IBAN: rimuove spazi e forza maiuscolo
function normalizeIban(s) {
  return (s || "").toString().replace(/\s+/g, "").toUpperCase();
}

// Verifica Modulo 97 (ISO 13616)
// 1) sposta le prime 4 cifre in fondo
// 2) converte lettere in numeri (A=10 ... Z=35)
// 3) calcola il resto in modo incrementale
function ibanModulo97Ok(iban) {
  const clean = normalizeIban(iban);
  if (clean.length < 4) return false;

  const rearranged = clean.slice(4) + clean.slice(0, 4);

  let remainder = 0;
  for (let i = 0; i < rearranged.length; i++) {
    const ch = rearranged.charAt(i);
    const code = rearranged.charCodeAt(i);

    let chunk;
    if (code >= 65 && code <= 90) {       // A-Z
      chunk = String(code - 55);          // 'A' -> 10 ... 'Z' -> 35
    } else if (code >= 48 && code <= 57) { // 0-9
      chunk = ch;
    } else {
      return false; // carattere non valido
    }

    // integra il chunk cifra per cifra (evita overflow)
    for (let j = 0; j < chunk.length; j++) {
      remainder = (remainder * 10 + (chunk.charCodeAt(j) - 48)) % 97;
    }
  }
  return remainder === 1;
}

/* -------------------------------------------------
   VALIDAZIONE LIVE IBAN
-------------------------------------------------- */

$(document).on("input", "#iban", function () {
  const ibanRaw = $(this).val();
  const iban = normalizeIban(ibanRaw);  // normalizzo qui
  $(this).val(iban);                    // lo riscrivo normalizzato

  const $label = $("label[for='iban']");

  // salvo il testo originale la prima volta
  if (!$label.data("originale")) $label.data("originale", $label.text());

  if (iban.length === 0) {
    // campo vuoto → obbligatorio
    $(this).addClass("is-invalid");
    $("#errore_iban").addClass("invalid-feedback").text("IBAN obbligatorio.");
    $label.text($label.data("originale") + " (obbligatorio)").css("color", "red");
  } 
  else if (!reg_iban_IT.test(iban)) {
    // formato errato (lunghezza/struttura)
    $(this).addClass("is-invalid");
    $("#errore_iban").addClass("invalid-feedback")
      .text("IBAN non valido. Esempio corretto: IT60X0542811101000000123456");
    $label.text($label.data("originale") + " (formato errato)").css("color", "red");
  }
  else if (!ibanModulo97Ok(iban)) {
    // ❌ fallisce il controllo Modulo 97
    $(this).addClass("is-invalid");
    $("#errore_iban").addClass("invalid-feedback")
      .text("IBAN formalmente corretto ma non supera il controllo Modulo 97.");
    $label.text($label.data("originale") + " (controllo IBAN non superato)").css("color", "red");
  }
  else {
    // ✅ tutto ok
    $(this).removeClass("is-invalid");
    $("#errore_iban").removeClass("invalid-feedback").text("");
    $label.text($label.data("originale")).css("color", "");
  }
});

// (opzionale) normalizza anche su blur/incolla
$(document).on("blur paste", "#iban", function () {
  const iban = normalizeIban($(this).val());
  $(this).val(iban);
});