$(document).on("click", ".conferma-riga-investimenti", function () {
    var tr = $(this).closest('tr');
    var id_riga = tr.attr("id");
    $("#" + id_riga).attr("data-errori-riga", 0);
    var categoria = tr.find("td:eq(0) select");
    var descrizione_interventi = tr.find("td:eq(1) textarea");
    var importo_previsto_imponibile = tr.find("td:eq(2) input");
    var aliquota_contributo = tr.find("td:eq(3) input");
    var contributo_richiesto = tr.find("td:eq(4) input");

    var regex = /^\d+(\.\d{1,2})?$/;
    valida_campo_categoria_interventi(categoria);
    valida_campo_descrizione_interventi(descrizione_interventi);
    valida_campo_importo_previsto_imponibile(importo_previsto_imponibile, regex);
    calcola_aliquota_e_contributo();
    valida_campo_aliquota_contributo(aliquota_contributo, regex);
    valida_campo_contributo_richiesto(contributo_richiesto, regex);

    var errori_riga = calcola_errori_singola_riga(id_riga, tr.children('td'));
    $("#" + id_riga).attr("data-errori-riga", errori_riga);
    if (errori_riga === 0) {
        calcola_totale();
    }
});

function calcola_aliquota_e_contributo() {
    const MAX_CONTRIBUTO = 30000;
    const $msgCap = $("#msg_cap_30000");
    $msgCap.addClass("d-none");    // reset visibilità

    const parseNum = (s) => Number(String(s || ""));
    const fmt2 = (n) => (isNaN(n) ? "" : n.toFixed(2));

    // 1) Sommo l’imponibile di tutte le righe valide
    let totImponibile = 0;
    $('#investimenti tbody tr[id^="categoria_interventi_"]').each(function () {
        const imp = parseNum($(this).find('input[name="importo_previsto_imponibile"]').val() || "");
        if (!isNaN(imp) && imp > 0) totImponibile += imp;
    });

    // 2) Calcolo aliquota reale (non arrotondata, non approssimata)
    let aliquotaReale = 50;
    if (totImponibile * 0.5 > MAX_CONTRIBUTO) {
        aliquotaReale = (MAX_CONTRIBUTO / totImponibile) * 100;
    }

    // 3) Applico aliquota alle righe (mostrando solo la parte intera)
    let totaleContributo = 0;
    $('#investimenti tbody tr[id^="categoria_interventi_"]').each(function () {
        const $row = $(this);
        const $imp = $row.find('input[name="importo_previsto_imponibile"]');
        const $aliq = $row.find('input[name="aliquota_contributo"]');     // campo Aliquota
        const $contr = $row.find('input[name="contributo_richiesto"]');

        const imp = parseNum($imp.val() || "");
        console.log(imp);
        if (!isNaN(imp) && imp > 0) {
            // Mostro la parte intera ma uso il valore reale nei calcoli
            $aliq.val(fmt2(aliquotaReale)).removeClass("is-invalid");
            $row.find(".error_aliquota_contributo").removeClass("invalid-feedback").text("");

            const contr = imp * (aliquotaReale / 100);
            $contr.val(fmt2(contr))
                .attr("title", `${fmt2(aliquotaReale)}% di ${fmt2(imp)}`)
                .removeClass("is-invalid");
            $row.find(".error_contributo_richiesto").removeClass("invalid-feedback").text("");

            totaleContributo += contr;
        }
    });

    // 4) Calcolo totale contributo corretto
    let totaleFinale = totaleContributo;

    // Se l'imponibile supera 60.000 €, il contributo finale deve essere 30.000 €
    if (totImponibile > 60000) {
        totaleFinale = MAX_CONTRIBUTO;
        $msgCap.removeClass("d-none");
    }

    // Aggiorno riquadri totali
    $("#contributo_richiesto")
        .attr("valore", totaleFinale)       // valore numerico
        .text(fmt2(totaleFinale));          // testo formattato

    $("#aliquota_contributo")
        .attr("valore", aliquotaReale)
        .text(fmt2(aliquotaReale));
}

function valida_campo_categoria_interventi(categoria) {
    var valore_categoria = categoria.val();
    var errore_categoria = categoria.next('.error_categoria_interventi');
    if (valore_categoria == "") {
        categoria.addClass("is-invalid");
        errore_categoria.addClass("invalid-feedback");
        errore_categoria.text("Seleziona la categoria per l'intervento.");
        aggiungi_errore_tabella_investimenti();
    }
    else {
        categoria.removeClass("is-invalid");
        errore_categoria.removeClass("invalid-feedback");
        errore_categoria.text("");
        togli_errore_tabella_investimenti();
    }
}

function valida_campo_descrizione_interventi(descrizione_interventi) {
    var valore_descrizione = descrizione_interventi.val();
    var errore_descrizione = descrizione_interventi.next('.error_descrizione_interventi');
    if (valore_descrizione == "" || valore_descrizione.length == 0) {
        descrizione_interventi.addClass("is-invalid");
        errore_descrizione.addClass("invalid-feedback");
        errore_descrizione.text("Inserisci una breve descrizione per l'intervento.");
        aggiungi_errore_tabella_investimenti();
    }
    else {
        descrizione_interventi.removeClass("is-invalid");
        errore_descrizione.removeClass("invalid-feedback");
        errore_descrizione.text("");
        togli_errore_tabella_investimenti();
    }
}

function valida_campo_importo_previsto_imponibile(importo_previsto_imponibile, regex) {
    var valore_importo = importo_previsto_imponibile.val();
    var errore_importo = importo_previsto_imponibile.next('.error_importo_previsto_imponibile');
    if (valore_importo == "" || valore_importo.length == 0) {
        importo_previsto_imponibile.addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Inserisci l'importo.");
        aggiungi_errore_tabella_investimenti();
    }
    else if (!regex.test(valore_importo)) {
        $(this).addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Importo non valido.");
    }
    else {
        importo_previsto_imponibile.removeClass("is-invalid");
        errore_importo.removeClass("invalid-feedback");
        errore_importo.text("");
        togli_errore_tabella_investimenti();
    }
}

function valida_campo_aliquota_contributo(aliquota_contributo, regex) {
    var valore_importo = aliquota_contributo.val();
    var errore_importo = aliquota_contributo.next('.error_aliquota_contributo');
    if (valore_importo == "" || valore_importo.length == 0) {
        aliquota_contributo.addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Inserisci l'aliquota.");
        aggiungi_errore_tabella_investimenti();
    }
    else if (!regex.test(valore_importo)) {
        $(this).addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Aliquota non valida.");
    }
    else {
        aliquota_contributo.removeClass("is-invalid");
        errore_importo.removeClass("invalid-feedback");
        errore_importo.text("");
        togli_errore_tabella_investimenti();
    }
}

function valida_campo_contributo_richiesto(contributo_richiesto, regex) {
    var valore_importo = contributo_richiesto.val();
    var errore_importo = contributo_richiesto.next('.error_contributo_richiesto');
    if (valore_importo == "" || valore_importo.length == 0) {
        contributo_richiesto.addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Inserisci l'importo.");
        aggiungi_errore_tabella_investimenti();
    }
    else if (!regex.test(valore_importo)) {
        $(this).addClass("is-invalid");
        errore_importo.addClass("invalid-feedback");
        errore_importo.text("Importo non valido.");
    }
    else {
        contributo_richiesto.removeClass("is-invalid");
        errore_importo.removeClass("invalid-feedback");
        errore_importo.text("");
        togli_errore_tabella_investimenti();
    }
}

function aggiungi_errore_tabella_investimenti() {
    var errori_prev = $("#count_errori_tabella_investimenti").val();
    var errori = errori_prev * 1 + 1 * 1;
    $("#count_errori_tabella_investimenti").val(errori);
}

function togli_errore_tabella_investimenti() {
    var errori_prev = $("#count_errori_tabella_investimenti").val();
    var errori = errori_prev * 1 - 1 * 1;
    $("#count_errori_tabella_investimenti").val(errori);
}

function calcola_errori_singola_riga(id, tds) {
    var errors = 0;
    var td_error = tds.find('div');
    td_error.each(function () {
        if ($(this).hasClass("invalid-feedback")) {
            errors++;
        }
    });
    return errors;
}


function validaRigaInvestimenti($tr) {

    var regex = /^\d+(\.\d{1,2})?$/;
    var id_riga = $tr.attr("id");

    // Campi
    var categoria = $tr.find("td:eq(0) select");
    var descrizione_interventi = $tr.find("td:eq(1) textarea");
    var importo_previsto_imponibile = $tr.find("td:eq(2) input");
    var aliquota_contributo = $tr.find("td:eq(3) input");
    var contributo_richiesto = $tr.find("td:eq(4) input");

    // Validazioni singole (le tue funzioni già esistenti)
    valida_campo_categoria_interventi(categoria);
    valida_campo_descrizione_interventi(descrizione_interventi);
    valida_campo_importo_previsto_imponibile(importo_previsto_imponibile, regex);

    // ricalcolo totale + aliquote
    calcola_aliquota_e_contributo();

    valida_campo_aliquota_contributo(aliquota_contributo, regex);
    valida_campo_contributo_richiesto(contributo_richiesto, regex);

    // calcolo errori riga
    var errori_riga = calcola_errori_singola_riga(id_riga, $tr.children("td"));
    $tr.attr("data-errori-riga", errori_riga);

    // Se tutto ok aggiorna totale
    if (errori_riga === 0) {
        calcola_totale();
    }
}

$(document).on(
    "input change",
    '#investimenti tbody tr[id^="categoria_interventi_"] input, ' +
    '#investimenti tbody tr[id^="categoria_interventi_"] select, ' +
    '#investimenti tbody tr[id^="categoria_interventi_"] textarea',
    function () {
        var $tr = $(this).closest('tr');
        validaRigaInvestimenti($tr);   // 🔥 valida e ricalcola ad ogni modifica
    }
);