var EXCEL_ATTACHMENT_DESCRIPTION = "Planilha de Itens Excel";
var EXCEL_ATTACHMENT_INPUT_ID = "fnAnexo_PlanilhaItens";

function updateExcelImportUi(filename) {
    var name = String(filename || "").trim();
    if (name) {
        $("#nomeArquivoExcel").text("Arquivo selecionado: " + name);
        $("#btnAdicionarExcel").hide();
        $("#btnRemoverExcel").show();
        return;
    }
    $("#nomeArquivoExcel").text("Nenhum arquivo selecionado");
    $("#btnAdicionarExcel").show();
    $("#btnRemoverExcel").hide();
}

function getExcelAttachmentField() {
    var $field = $("#" + EXCEL_ATTACHMENT_INPUT_ID);
    if ($field.length) return $field;
    return $("#_" + EXCEL_ATTACHMENT_INPUT_ID);
}

$(document).ready(function () {

    // Quando clicar em "Adicionar arquivo"
    $('#btnAdicionarExcel').on('click', function () {
        if (typeof uploadFile === "function" && getExcelAttachmentField().length) {
            uploadFile(EXCEL_ATTACHMENT_DESCRIPTION, EXCEL_ATTACHMENT_INPUT_ID);
            return;
        }
        $('#excelUpload').click(); // fallback: aciona o input escondido
    });

    // Quando um arquivo for selecionado
    $('#excelUpload').on('change', function () {
        const file = this.files[0];

        if (file) {
            updateExcelImportUi(file.name);
            carregarItensDoExcel('excelUpload'); // chama sua função
        }
    });

    // Quando clicar em "Remover arquivo"
    $('#btnRemoverExcel').on('click', function () {
        $('#excelUpload').val('');
        updateExcelImportUi("");
        getExcelAttachmentField().val("");

        try {
            removeFile(EXCEL_ATTACHMENT_DESCRIPTION);
            if (typeof setFilePhisicalName === "function") {
                setFilePhisicalName(EXCEL_ATTACHMENT_INPUT_ID, "");
            }
        } catch (e) {
            console.error("Falha ao remover anexo da planilha:", e);
        }
    });

    $('#chaveNfe').on('input', function () {
        var key = normalizeNfeKey($(this).val());
        $(this).val(key);
        clearNfeConsultaFields();
        setNfeFeedback("", "hidden");
    });

    $('#btnConsultarChaveNfe').on('click', function () {
        consultarChaveNfe();
    });

    $(document).on("change", "input[name='tipoMotoristaEntrega']", function () {
        applyMotoristaEntregaMode($(this).val(), false);
    });

    $(document).on("change", "#motoristaEntregaSelecionado", function () {
        applySelectedMotoristaEntregaOption();
    });

    $(document).on("input", "input[name^='quantidadeItem___'], input[name^='_quantidadeItem___'], input[name='quantidadeItem'], input[name='_quantidadeItem'], input[id^='quantidadeItem___'], input[id^='_quantidadeItem___'], #quantidadeItem, #_quantidadeItem", function () {
        syncQuantidadeAprovadaFromSolicitada(this);
        processarConferenciaNfe();
        toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
    });

    $(document).on("input", ".input-qtd-aprov-gestor-view", function () {
        var linha = String($(this).attr("data-linha") || "");
        var indice = String($(this).attr("data-indice") || "");
        if (!linha) return;

        var normalized = normalizeQuantidadeCampo($(this).val());
        $(this).val(normalized);
        var $row = $("#tabelaAprovacaoGestorItensBody tr[data-linha='" + linha + "']");
        var $hidden = getCampoItem("quantidadeAprovadaGestor", indice, $row);
        if (!$hidden.length) {
            $hidden = getCampoItem("quantidadeAprovadaGestor", indice);
        }
        if ($hidden.length) {
            $hidden.val(normalized);
        }
        atualizarStatusLinhaAprovacaoGestor(linha);
    });

    var activity = String($("#activity").val() || "");
    applyTransferStatus(activity);

    if ($("#formMode").val() == "VIEW") {
        showAndBlock(["all"]);
        $("#btnConsultarChaveNfe").prop("disabled", true).hide();
        updateConferenciaNfeVisibility(activity);
    } else {
        //show the right fields
        var requestDate = getCurrentDate();

        if (String(activity) !== "6") {
            $("#btnConsultarChaveNfe").prop("disabled", true).hide();
        }

        $(".activity").hide();

        $(".activity-" + activity).show();

        if (activity == 0 || activity == 1) {
            //primeira atividade
            //$("#dataAbertura").val(requestDate[0] + " - " + requestDate[1]);
            $("#dataAbertura").val(requestDate[0]);
            // add_new_row("tabelaItens");
        } else if (activity == 4) {
            showAndBlock([0]);
            $("#userValidacaoGestor").val($("#currentUserName").val());
            $("#dataValidacaoGestor").val(
                requestDate[0] + " - " + requestDate[1]
            );
            updt_line();
        } else if (activity == 6) {
            showAndBlock([0, 4]);
            if ($("#usuarioEmissorNfe").val() == "") {
                $("#usuarioEmissorNfe").val($("#currentUserName").val());
            }
            if ($("#dataEmissaoNfe").val() == "") {
                $("#dataEmissaoNfe").val(
                    requestDate[0] + " - " + requestDate[1]
                );
            }

            if ($("#justificativaDecisaoGestor").val() == "") {
                $(".justificativa-activity-4").hide();
            }
            updt_line();
        
        } else if (activity == 57) {
            $("#userCotacaoGestor").val($("#currentUserName").val());
            $("#dataAprovCompras").val(
                requestDate[0] + " - " + requestDate[1]
            );
            $("#blocoTipoMotoristaEntrega, #blocoOutroMotoristaEntrega").hide();
            $("input[name='tipoMotoristaEntrega']").prop("disabled", true);
            $("#motoristaEntregaSelecionado").prop("disabled", true);
            showAndBlock([0, 4, 6]);

            if ($("#justificativaDecisaoGestor").val() == "") {
                $(".justificativa-activity-4").hide();
            }
            if ($("#justificativaDecisaoCompras").val() == "") {
                $(".justificativa-activity-6").hide();
            }
            updt_line();

        } else if (activity == 31) {
            $("#userRealizacaoCompras").val($("#currentUserName").val());
            $("#dataRealizacaoCompras").val(
                requestDate[0] + " - " + requestDate[1]
            );
            if ($("#motoristaColetaNome").val() == "") {
                $("#motoristaColetaNome").val($("#currentUserName").val());
            }
            if ($("#motoristaColetaLogin").val() == "") {
                $("#motoristaColetaLogin").val($("#currentUserId").val());
            }
            if ($("#dataColeta").val() == "") {
                $("#dataColeta").val(requestDate[0] + " " + requestDate[1]);
            }
            initMotoristaEntregaEscolha();
            $("#blocoTipoMotoristaEntrega").show();
            $("input[name='tipoMotoristaEntrega']").prop("disabled", false);
            $("#motoristaEntregaSelecionado").prop("disabled", false);
            // Mantem apenas etapas anteriores bloqueadas; card de coleta e entrega estao separados.
            showAndBlock([0, 4, 6]);

            if ($("#justificativaDecisaoGestor").val() == "") {
                $(".justificativa-activity-4").hide();
            }
            if ($("#justificativaDecisaoCompras").val() == "") {
                $(".justificativa-activity-6").hide();
            }
            updt_line();
        } else if (activity == 18) {
            var campoJustificativaProblema = $("#justificativaValidaProblema");
            if (campoJustificativaProblema.length && campoJustificativaProblema.val() != "") {
                showAndBlock([0, 4, 6, 24, 31, 57]);
            } else {
                showAndBlock([0, 4, 6, 31, 57]);
            }
            $("#userValidacaoItens").val($("#currentUserName").val());
            $("#dataValidacaoItens").val(requestDate[0] + " - " + requestDate[1]);

            if ($("#justificativaDecisaoGestor").val() == "") {
               $(".justificativa-activity-4").hide();
            } 
            if ($("#justificativaDecisaoCompras").val() == "") {
                $(".justificativa-activity-6").hide();
            }
            if ($("#consideracoesCompras").val() == "") {
                $(".justificativa-activity-31").hide();
            }

            $("input[name=validacaoItens]").on("change", function () {
                $(".justificativaDecisaoItens").hide();
                var validacaoItensSelecionada = $("input[name=validacaoItens]:checked").val();
                if (
                    validacaoItensSelecionada == "divergencia" ||
                    validacaoItensSelecionada == "incorreto" ||
                    validacaoItensSelecionada == "naoEntregue"
                ) {
                    $(".justificativaDecisaoItens").show();
                }
            });
            $("input[name=validacaoItens]").trigger("change");

            updt_line();
        } else if (activity == 24) {
            showAndBlock([0, 4, 6, 31, 18]);

            if ($("#justificativaDecisaoGestor").val() == "") {
                $(".justificativa-activity-4").hide();
            }
            if ($("#justificativaDecisaoCompras").val() == "") {
                $(".justificativa-activity-6").hide();
            }
            if ($("#consideracoesCompras").val() == "") {
                $(".justificativa-activity-31").hide();
            }
            updt_line();
        }

        updateConferenciaNfeVisibility(activity);
    }

    syncQuantidadeAprovadaAllRows();
    toggleQuantidadeAprovadaGestorByActivity(activity);
    agendarRefreshTabelaAprovacao(activity);
    updateExcelImportUi(getExcelAttachmentField().val());

    formatarMoedasTabela("preco___");
    //formatarMoedasTabela("precoIndica___");
    formatarMoedasTabela("ValorTotal");

    displayBtnFiles();
    invisibleBtnUpload("fnAnexo_PlanilhaItens");
    invisibleBtnUpload("fnAnexo_Nfe");
    invisibleBtnUpload("fdAnexo_Coleta");
    invisibleBtnUpload("fdAnexo_Entrega");
    invisibleBtnUpload("fdAnexo_recebimento");
    initAttachmentPlugins();
    processarConferenciaNfe();

    // gerarTabelaCotacaoIndica("tabelaCotacaoIndica", "tabelaItens");

    
});

function agendarRefreshTabelaAprovacao(activity) {
    var state = String(activity || $("#activity").val() || "");
    var retries = [250, 800, 1800];

    for (var i = 0; i < retries.length; i++) {
        (function (delay) {
            setTimeout(function () {
                syncQuantidadeAprovadaAllRows();
                toggleQuantidadeAprovadaGestorByActivity(state);
            }, delay);
        })(retries[i]);
    }
}

function applyTransferStatus(activity) {
    var current = String(activity || "");
    var pills = $("#transferStatus .status-pill");
    if (!pills.length) return;

    pills.removeClass("is-active is-done");

    var activeOrder = -1;
    pills.each(function () {
        var pill = $(this);
        var activities = String(pill.attr("data-activities") || "").split(",");
        for (var i = 0; i < activities.length; i++) {
            if ($.trim(activities[i]) === current) {
                pill.addClass("is-active");
                var order = parseInt(pill.attr("data-order"), 10);
                if (!isNaN(order)) {
                    activeOrder = order;
                }
                break;
            }
        }
    });

    if (activeOrder < 0) return;

    pills.each(function () {
        var pill = $(this);
        var order = parseInt(pill.attr("data-order"), 10);
        if (!isNaN(order) && order < activeOrder) {
            pill.addClass("is-done");
        }
    });
}

function resolveFormModeFallback() {
    var mode = ($("#formMode").val() || "").toUpperCase();
    if (mode) return mode;
    try {
        if (window.parent && window.parent.WCMAPI && typeof window.parent.WCMAPI.getFormMode === "function") {
            return String(window.parent.WCMAPI.getFormMode() || "").toUpperCase();
        }
    } catch (e) {}
    return "ADD";
}

if (typeof window.getFormMode !== "function") {
    window.getFormMode = resolveFormModeFallback;
}

function formatarMoedasTabela(ids) {
    $(document).on('input', `[id^="${ids}"]`, function() {
        let valor = $(this).val();

        // Remove tudo que não for número
        valor = valor.replace(/\D/g, '');

        // Converte para número decimal
        let numero = parseFloat(valor) / 100;

        // Formata para Real Brasileiro
        if (!isNaN(numero)) {
            valor = numero.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
        }

        // Atualiza o campo com a formatação correta
        $(this).val(valor);
    });
}


//show the activity and then block the fields
function showAndBlock(activity) {
    for (var i = 0, l = activity.length; i < l; i++) {
        $(".activity-" + activity[i]).show();
        $(".hideButton").hide();
        $(".activity-" + activity[i] + " :input").each(function () {
            $(this).attr("readonly", "readonly");
            $(this)
                .css("background-color", "#eee")
                .children("option:not(:selected)")
                .prop("disabled", true);
            $(this).on("mousedown", function (e) {
                this.blur();
                window.focus();
            });
            if ($(this).is(":checkbox")) {
                $(this).attr("disabled", true);
            } else if ($(this).is(":radio")) {
                $(this).on("click", function () {
                    return false;
                });
            }
        });
    }
}

function getCurrentDate() {
    var newDate = new Date();
    var h = newDate.getHours();
    if (h < 10) {
        h = "0" + h;
    }
    var m = newDate.getMinutes();
    if (m < 10) {
        m = "0" + m;
    }
    var hour = h + ":" + m; // + ":" + s;
    var day = newDate.getDate();
    if (day < 10) {
        day = "0" + day;
    }
    var month = newDate.getMonth() + 1;
    if (month < 10) {
        month = "0" + month;
    }
    newDate = day + "/" + month + "/" + newDate.getFullYear();
    var currentDate = [newDate, hour];
    return currentDate;
}

function normalizeQuantidadeCampo(value) {
    var txt = String(value == null ? "" : value).trim();
    if (txt === "") return "";

    txt = txt.replace(",", ".");
    var n = parseFloat(txt);
    if (isNaN(n) || n < 0) return "";

    if (Math.floor(n) === n) return String(parseInt(n, 10));
    return String(n);
}

function toNumberQuantidade(value) {
    var txt = normalizeQuantidadeCampo(value);
    if (txt === "") return NaN;
    return parseFloat(txt);
}

function getIndiceCampoPaiFilho($el) {
    var raw = String($el.attr("name") || $el.attr("id") || "");
    if (raw.indexOf("___") < 0) return "";
    return String(raw.split("___")[1] || "");
}

function collectQuantidadeItemFields() {
    var out = [];
    var seen = {};
    var selector = [
        "input[name^='quantidadeItem___']",
        "input[name^='_quantidadeItem___']",
        "input[name='quantidadeItem']",
        "input[name='_quantidadeItem']",
        "input[id^='quantidadeItem___']",
        "input[id^='_quantidadeItem___']",
        "#quantidadeItem",
        "#_quantidadeItem"
    ].join(", ");

    $(selector).each(function () {
        var $field = $(this);
        var key = String($field.attr("name") || $field.attr("id") || "");
        if (!key) {
            key = "anon_" + out.length;
        }
        if (seen[key]) return;
        seen[key] = true;
        out.push(this);
    });

    return out;
}

function getCampoItem(baseName, indice, $scopeRow) {
    var idx = String(indice == null ? "" : indice).trim();
    var selectors = [];

    if (idx !== "") {
        selectors.push("#" + baseName + "___" + idx);
        selectors.push("#_" + baseName + "___" + idx);
        selectors.push("[name='" + baseName + "___" + idx + "']");
        selectors.push("[name='_" + baseName + "___" + idx + "']");
    }

    selectors.push("#" + baseName);
    selectors.push("#_" + baseName);
    selectors.push("[name='" + baseName + "']");
    selectors.push("[name='_" + baseName + "']");

    for (var i = 0; i < selectors.length; i++) {
        var selector = selectors[i];
        var $field = $();

        if ($scopeRow && $scopeRow.length) {
            $field = $scopeRow.find(selector).first();
        }

        if (!$field.length) {
            $field = $(selector).first();
        }

        if ($field.length) return $field;
    }

    return $();
}

function syncQuantidadeAprovadaFromSolicitada(inputSolicitada) {
    var $solicitada = $(inputSolicitada);
    var idx = getIndiceCampoPaiFilho($solicitada);
    var $row = $solicitada.closest("tr");

    var $aprovada = getCampoItem("quantidadeAprovadaGestor", idx, $row);
    if (!$aprovada.length) return;

    var currentAprovada = normalizeQuantidadeCampo($aprovada.val());
    if (currentAprovada !== "") return;

    var solicitada = normalizeQuantidadeCampo($solicitada.val());
    if (solicitada !== "") {
        $aprovada.val(solicitada);
    }
}

function syncQuantidadeAprovadaAllRows() {
    $(collectQuantidadeItemFields()).each(function () {
        syncQuantidadeAprovadaFromSolicitada(this);
    });
}

function toggleQuantidadeAprovadaGestorByActivity(activity) {
    var state = String(activity || "");
    var isGestorApproval = state === "4";
    var $tbody = $("#tabelaAprovacaoGestorItensBody");
    if (!$tbody.length) return;

    var html = [];
    var rowsFound = 0;

    $(collectQuantidadeItemFields()).each(function (idx, el) {
        var $qtdSolicitadaField = $(el);
        var $row = $qtdSolicitadaField.closest("tr");
        var linha = getIndiceCampoPaiFilho($qtdSolicitadaField);
        var linhaKey = linha !== "" ? linha : ("base_" + idx);

        var codigo = $.trim(String(getCampoItem("descricao", linha, $row).val() || ""));
        var descricao = $.trim(String(getCampoItem("codigoItem", linha, $row).val() || ""));
        var categoria = $.trim(String(getCampoItem("categoriaItem", linha, $row).val() || ""));
        var qtdSolicitadaNorm = normalizeQuantidadeCampo($qtdSolicitadaField.val());

        var hasData = qtdSolicitadaNorm !== "" || codigo !== "" || descricao !== "" || categoria !== "";
        if (!hasData) return;

        rowsFound++;
        var qtdSolicitadaLabel = qtdSolicitadaNorm || "-";

        var itemLabel = codigo || descricao || ("Item " + rowsFound);
        if (descricao && descricao !== codigo) itemLabel += " - " + descricao;
        if (categoria) itemLabel += " (" + categoria + ")";

        var $hiddenAprovada = getCampoItem("quantidadeAprovadaGestor", linha, $row);
        var qtdAprovadaAtual = normalizeQuantidadeCampo($hiddenAprovada.val());
        if (qtdAprovadaAtual === "" && qtdSolicitadaNorm !== "") {
            qtdAprovadaAtual = qtdSolicitadaNorm;
            $hiddenAprovada.val(qtdAprovadaAtual);
        }

        var status = "Sem divergência";
        var statusClass = "label label-success";
        if (qtdSolicitadaNorm === "" || qtdAprovadaAtual === "") {
            status = "Aprovado";
            statusClass = "label label-default";
        } else {
            var nSolicitada = toNumberQuantidade(qtdSolicitadaNorm);
            var nAprovada = toNumberQuantidade(qtdAprovadaAtual);
            if (isNaN(nSolicitada) || isNaN(nAprovada)) {
                status = "Inválido";
                statusClass = "label label-danger";
            } else if (nAprovada > nSolicitada) {
                status = "Maior que solicitada";
                statusClass = "label label-danger";
            } else if (nAprovada === 0) {
                status = "Sem estoque";
                statusClass = "label label-warning";
            } else if (nAprovada < nSolicitada) {
                status = "Divergente";
                statusClass = "label label-warning";
            }
        }

        var disabledAttr = isGestorApproval ? "" : " readonly disabled ";

        html.push(
            "<tr data-linha='" + escapeHtml(linhaKey) + "' data-indice='" + escapeHtml(linha) + "' data-qtd-solicitada='" + escapeHtml(qtdSolicitadaNorm) + "'>" +
                "<td>" + rowsFound + "</td>" +
                "<td>" + escapeHtml(itemLabel) + "</td>" +
                "<td>" + escapeHtml(qtdSolicitadaLabel) + "</td>" +
                "<td>" +
                    "<input type='number' min='0' " + disabledAttr +
                    " class='form-control transfer-input input-qtd-aprov-gestor-view' " +
                    " data-linha='" + escapeHtml(linhaKey) + "' data-indice='" + escapeHtml(linha) + "' " +
                    " id='quantidadeAprovadaGestorView___" + escapeHtml(linhaKey) + "' " +
                    " value='" + escapeHtml(qtdAprovadaAtual) + "' placeholder='Se diferente' />" +
                "</td>" +
                "<td><span class='" + statusClass + " status-aprov-gestor' data-linha='" + escapeHtml(linhaKey) + "'>" + escapeHtml(status) + "</span></td>" +
            "</tr>"
        );
    });

    if (!rowsFound) {
        html.push("<tr><td colspan='5'>Sem itens para validação.</td></tr>");
    }

    $tbody.html(html.join(""));
    $(".hint-qtd-aprov-gestor").toggle(isGestorApproval);
}

function atualizarStatusLinhaAprovacaoGestor(linha) {
    var rowSelector = "#tabelaAprovacaoGestorItensBody tr[data-linha='" + linha + "']";
    var $row = $(rowSelector);
    if (!$row.length) return;

    var $status = $row.find(".status-aprov-gestor");
    if (!$status.length) return;

    var qtdSolicitada = toNumberQuantidade($row.attr("data-qtd-solicitada"));
    var qtdAprovada = toNumberQuantidade($row.find(".input-qtd-aprov-gestor-view").val());

    $status.removeClass("label-success label-warning label-danger label-default");

    if (isNaN(qtdSolicitada) || isNaN(qtdAprovada)) {
        $status.addClass("label-default").text("Pendente");
        return;
    }

    if (qtdAprovada > qtdSolicitada) {
        $status.addClass("label-danger").text("Maior que solicitada");
        return;
    }

    if (qtdAprovada === 0) {
        $status.addClass("label-warning").text("Sem estoque");
        return;
    }

    if (qtdAprovada < qtdSolicitada) {
        $status.addClass("label-warning").text("Divergente");
        return;
    }

    $status.addClass("label-success").text("Sem divergência");
}

function validarQuantidadeAprovadaGestor() {
    var divergencias = 0;
    var itemContador = 0;

    $(collectQuantidadeItemFields()).each(function () {
        var $qtdSolicitada = $(this);
        var $row = $qtdSolicitada.closest("tr");
        var linha = getIndiceCampoPaiFilho($qtdSolicitada);

        var codigo = $.trim(String(getCampoItem("descricao", linha, $row).val() || ""));
        var descricao = $.trim(String(getCampoItem("codigoItem", linha, $row).val() || ""));
        var qtdSolicitadaRaw = $.trim(String($qtdSolicitada.val() || ""));

        if (qtdSolicitadaRaw === "" && !codigo && !descricao) {
            return;
        }

        itemContador++;

        var $qtdAprovada = getCampoItem("quantidadeAprovadaGestor", linha, $row);
        if (!$qtdAprovada.length) return;

        var qtdSolicitada = toNumberQuantidade(qtdSolicitadaRaw);
        if (isNaN(qtdSolicitada) || qtdSolicitada <= 0) {
            $qtdSolicitada.closest("td, div").addClass("errorValidate");
            throw "Quantidade solicitada inválida no item " + itemContador + ".";
        }

        var qtdAprovadaRaw = $.trim(String($qtdAprovada.val() || ""));
        if (qtdAprovadaRaw === "") {
            $qtdAprovada.val(normalizeQuantidadeCampo($qtdSolicitada.val()));
            qtdAprovadaRaw = $.trim(String($qtdAprovada.val() || ""));
        }

        var qtdAprovada = toNumberQuantidade(qtdAprovadaRaw);
        if (isNaN(qtdAprovada) || qtdAprovada < 0) {
            $qtdAprovada.closest("td, div").addClass("errorValidate");
            throw "Preencha a quantidade aprovada do item " + itemContador + " com valor maior ou igual a zero.";
        }

        if (qtdAprovada > qtdSolicitada) {
            $qtdAprovada.closest("td, div").addClass("errorValidate");
            throw "A quantidade aprovada do item " + itemContador + " não pode ser maior que a solicitada.";
        }

        if (qtdAprovada !== qtdSolicitada) {
            divergencias++;
        }
    });

    $("#qtdDivergenciasGestor").val(String(divergencias));

    if (divergencias > 0 && $.trim($("#justificativaDecisaoGestor").val()) === "") {
        $("#justificativaDecisaoGestor").parent("div").addClass("errorValidate");
        throw "Informe a justificativa da decisão quando houver divergência de quantidade.";
    }
}

function initMotoristaEntregaEscolha() {
    var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || "");
    if (!escolha) {
        var coletaLogin = String($("#motoristaColetaLogin").val() || "").trim();
        var entregaLogin = String($("#motoristaEntregaLogin").val() || "").trim();
        if (entregaLogin && coletaLogin && entregaLogin !== coletaLogin) {
            escolha = "outro";
        } else {
            escolha = $("#motoristaColetaNome").val() ? "mesmo" : "outro";
        }
        $("input[name='tipoMotoristaEntrega'][value='" + escolha + "']").prop("checked", true);
    }
    applyMotoristaEntregaMode(escolha, true);
}

function applyMotoristaEntregaMode(mode, keepValues) {
    var escolha = String(mode || "");
    var blocoOutro = $("#blocoOutroMotoristaEntrega");
    if (!blocoOutro.length) return;

    if (escolha === "outro") {
        blocoOutro.show();
        loadMotoristasEntregaSelect(false);
        if (!keepValues) {
            $("#motoristaEntregaNome").val("");
            $("#motoristaEntregaLogin").val("");
            clearZoomField("motoristaEntregaSelecionado");
        } else {
            syncMotoristaEntregaSelectFromHidden();
        }
        return;
    }

    blocoOutro.hide();
    if (escolha === "mesmo") {
        var coletaNome = String($("#motoristaColetaNome").val() || "").trim();
        var coletaLogin = String($("#motoristaColetaLogin").val() || "").trim();
        if (coletaNome) $("#motoristaEntregaNome").val(coletaNome);
        if (coletaLogin) $("#motoristaEntregaLogin").val(coletaLogin);
    }
}

function clearZoomField(fieldId) {
    try {
        if (window[fieldId] && typeof window[fieldId].clear === "function") {
            window[fieldId].clear();
        }
    } catch (e) {}

    try {
        if (window[fieldId] && typeof window[fieldId].setValue === "function") {
            window[fieldId].setValue("");
        }
    } catch (e2) {}

    $("#" + fieldId).val("");
}

var MOTORISTAS_GROUP_DEFAULT_ID = "Motoristas";
var MOTORISTAS_GROUP_BY_UF = {
    AL: "motoristaAL",
    BA: "motoristaBA",
    SE: "motoristaSE"
};
var motoristasEntregaCacheByGroup = {};
var motoristasEntregaLoadingByGroup = {};
var motoristaEntregaGroupAtual = "";

function normalizeUfCode(value) {
    return String(value || "").toUpperCase().replace(/[^A-Z]/g, "").substring(0, 2);
}

function resolveMotoristasGroupIdByUf(uf) {
    var ufCode = normalizeUfCode(uf);
    if (!ufCode) {
        return MOTORISTAS_GROUP_DEFAULT_ID;
    }
    if (MOTORISTAS_GROUP_BY_UF[ufCode]) {
        return String(MOTORISTAS_GROUP_BY_UF[ufCode] || "").trim() || MOTORISTAS_GROUP_DEFAULT_ID;
    }
    // Convencao para facilitar novos estados sem precisar alterar o JS.
    return "motorista" + ufCode;
}

function getMotoristasEntregaQueryContext() {
    var uf = normalizeUfCode($("#ufDestino").val());
    var groupId = resolveMotoristasGroupIdByUf(uf);
    return {
        uf: uf,
        groupId: groupId,
        cacheKey: groupId
    };
}

function loadMotoristasEntregaSelect(forceReload) {
    var select = $("#motoristaEntregaSelecionado");
    if (!select.length) return;

    var context = getMotoristasEntregaQueryContext();
    var cacheKey = context.cacheKey;
    motoristaEntregaGroupAtual = context.groupId;

    if (!forceReload && Object.prototype.hasOwnProperty.call(motoristasEntregaCacheByGroup, cacheKey)) {
        renderMotoristasEntregaOptions(motoristasEntregaCacheByGroup[cacheKey], context);
        return;
    }

    if (motoristasEntregaLoadingByGroup[cacheKey]) return;

    motoristasEntregaLoadingByGroup[cacheKey] = true;
    select.prop("disabled", true);

    var requestPayload = {
        name: "ds_motoristas_grupo",
        fields: null,
        constraints: [{
            _field: "GROUP_ID",
            _initialValue: context.groupId,
            _finalValue: context.groupId,
            _type: 1
        }],
        order: null
    };

    $.ajax({
        type: "POST",
        url: "/api/public/ecm/dataset/datasets/",
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(requestPayload)
    }).done(function (response) {
        var values = ((((response || {}).content || {}).values) || []);
        var rows = normalizeMotoristasEntregaRows(values);
        motoristasEntregaCacheByGroup[cacheKey] = rows;
        if (motoristaEntregaGroupAtual === context.groupId) {
            renderMotoristasEntregaOptions(rows, context);
        }
    }).fail(function (xhr) {
        console.error("Falha ao carregar motoristas do dataset (" + context.groupId + "):", xhr);
        motoristasEntregaCacheByGroup[cacheKey] = [];
        if (motoristaEntregaGroupAtual === context.groupId) {
            renderMotoristasEntregaOptions([], context);
        }
    }).always(function () {
        motoristasEntregaLoadingByGroup[cacheKey] = false;
        if (motoristaEntregaGroupAtual === context.groupId) {
            select.prop("disabled", false);
        }
    });
}

function normalizeMotoristasEntregaRows(values) {
    var out = [];
    var map = {};

    for (var i = 0; i < values.length; i++) {
        var row = values[i] || {};
        var colleagueId = String(row.COLLEAGUE_ID || row.colleagueId || row.colleagueid || "").trim();
        if (!colleagueId) continue;
        if (map[colleagueId]) continue;
        map[colleagueId] = true;

        out.push({
            COLLEAGUE_ID: colleagueId,
            NOME: String(row.NOME || row.colleagueName || row.nome || "").trim(),
            LOGIN: String(row.LOGIN || row.login || "").trim(),
            EMAIL: String(row.EMAIL || row.mail || row.email || "").trim()
        });
    }

    out.sort(function (a, b) {
        var aNome = (a.NOME || a.LOGIN || a.COLLEAGUE_ID).toLowerCase();
        var bNome = (b.NOME || b.LOGIN || b.COLLEAGUE_ID).toLowerCase();
        return aNome < bNome ? -1 : (aNome > bNome ? 1 : 0);
    });

    return out;
}

function renderMotoristasEntregaOptions(rows, context) {
    var select = $("#motoristaEntregaSelecionado");
    if (!select.length) return;

    var selectedValue = String($("#motoristaEntregaLogin").val() || select.val() || "").trim();
    var placeholder = "Selecione o motorista";
    if (context && context.uf) {
        placeholder = "Selecione o motorista da UF " + context.uf;
    }
    if ((rows || []).length === 0 && context && context.uf) {
        placeholder = "Sem motoristas cadastrados para UF " + context.uf;
    }

    select.empty();
    select.append($("<option></option>").val("").text(placeholder));

    for (var i = 0; i < rows.length; i++) {
        var row = rows[i];
        var nome = String(row.NOME || row.LOGIN || row.COLLEAGUE_ID);
        var label = row.LOGIN ? (nome + " (" + row.LOGIN + ")") : nome;
        var option = $("<option></option>")
            .val(row.COLLEAGUE_ID)
            .text(label)
            .attr("data-nome", nome)
            .attr("data-login", String(row.LOGIN || ""));
        select.append(option);
    }

    if (selectedValue) {
        select.val(selectedValue);
    }

    if (!select.val()) {
        // Limpa selecao visual quando o valor salvo nao existe mais no dataset.
        select.val("");
    }

    applySelectedMotoristaEntregaOption();
}

function refreshMotoristasEntregaByUf(forceReload) {
    var escolha = String($("input[name='tipoMotoristaEntrega']:checked").val() || "");
    if (escolha !== "outro") return;
    loadMotoristasEntregaSelect(forceReload === true);
}

function syncMotoristaEntregaSelectFromHidden() {
    var select = $("#motoristaEntregaSelecionado");
    if (!select.length) return;

    var storedId = String($("#motoristaEntregaLogin").val() || "").trim();
    if (!storedId) {
        select.val("");
        return;
    }

    select.val(storedId);
    if (select.val()) {
        applySelectedMotoristaEntregaOption();
    }
}

function applySelectedMotoristaEntregaOption() {
    var select = $("#motoristaEntregaSelecionado");
    if (!select.length) return;

    var selectedId = String(select.val() || "").trim();
    if (!selectedId) {
        if (String($("input[name='tipoMotoristaEntrega']:checked").val() || "") === "outro") {
            $("#motoristaEntregaNome").val("");
            $("#motoristaEntregaLogin").val("");
        }
        return;
    }

    var option = select.find("option:selected");
    var nome = String(option.attr("data-nome") || option.text() || "").trim();

    $("#motoristaEntregaLogin").val(selectedId);
    $("#motoristaEntregaNome").val(nome);
    $("#tipoMotoristaEntregaOutro").prop("checked", true);
}

function updateConferenciaNfeVisibility(activity) {
    var activityValue = String(activity || $("#activity").val() || "");
    var exibirConferencia = (activityValue === "6" || activityValue === "18");
    $("#blocoConferenciaNfe").toggle(exibirConferencia);

    // Na emissao (6), mostra apenas a tabela de conferencia.
    // Os campos de validacao de recebimento ficam apenas na atividade 18.
    var showOnlyConferencia = (activityValue === "6");
    $("input[name='validacaoItens']").closest(".row").toggle(!showOnlyConferencia);
    $("#fdAnexo_recebimento").closest(".row").toggle(!showOnlyConferencia);
    $(".justificativaDecisaoItens").toggle(!showOnlyConferencia);
}

var ATTACHMENT_PLUGIN_CONFIG = {
    fnAnexo_PlanilhaItens: {
        filename: EXCEL_ATTACHMENT_DESCRIPTION,
        accept: ".xlsx,.xls"
    },
    fnAnexo_Nfe: {
        filename: "Nota Fiscal",
        accept: ".pdf,.xml,image/*"
    },
    fdAnexo_Coleta: {
        filename: "Comprovante de Coleta",
        accept: ".pdf,image/*"
    },
    fdAnexo_Entrega: {
        filename: "Comprovante de Entrega",
        accept: ".pdf,image/*"
    },
    fdAnexo_recebimento: {
        filename: "Comprovante de Recebimento",
        accept: ".pdf,image/*"
    }
};

function initAttachmentPlugins() {
    var mode = getFormMode();
    var allowedInputs = getAllowedAttachmentInputs();
    var hasPlugin = typeof $.fn.fluigFormAttachment === "function";

    if (!hasPlugin) {
        console.warn("fluigFormAttachment.js nao carregado; campos de anexo sem botoes de upload.");
        return;
    }

    Object.keys(ATTACHMENT_PLUGIN_CONFIG).forEach(function (inputId) {
        var cfg = ATTACHMENT_PLUGIN_CONFIG[inputId];
        var input = $("#" + inputId);
        if (!input.length) return;
        var dynamicFilename = resolveAttachmentFilename(inputId, cfg.filename);

        var canUploadHere = (mode !== "VIEW" && allowedInputs.indexOf(inputId) >= 0);

        try {
            if (!input.data("fluigFormAttachment")) {
                input.fluigFormAttachment({
                    filename: dynamicFilename,
                    accept: cfg.accept,
                    showActionButton: canUploadHere
                });
            } else {
                input.fluigFormAttachment("filename", dynamicFilename);
            }

            if (canUploadHere) {
                input.fluigFormAttachment("showActionButton");
            } else {
                input.fluigFormAttachment("hideActionButton");
            }
        } catch (e) {
            console.error("Falha ao inicializar anexo '" + inputId + "':", e);
        }
    });
}

function resolveAttachmentFilename(inputId, fallback) {
    if (inputId === EXCEL_ATTACHMENT_INPUT_ID) {
        var numProcExcel = String($("#WKNumProces").val() || "").trim();
        return numProcExcel ? (EXCEL_ATTACHMENT_DESCRIPTION + " - " + numProcExcel) : EXCEL_ATTACHMENT_DESCRIPTION;
    }
    if (inputId !== "fnAnexo_Nfe") return fallback;
    var solicitacao = String($("#WKNumProces").val() || "").trim();
    if (!solicitacao) return "Nota Fiscal";
    return "Nota Fiscal - " + solicitacao;
}

function normalizeNfeKey(value) {
    return String(value == null ? "" : value).replace(/\D/g, "").substring(0, 44);
}

function clearNfeConsultaFields() {
    $("#numeroNfeConsulta").val("");
    $("#serieNfeConsulta").val("");
    $("#dataEmissaoApiNfe").val("");
    $("#situacaoNfeConsulta").val("");
    $("#fornecedorNfeConsulta").val("");
    $("#valorNfeConsulta").val("");
    $("#dataEntradaNfeConsulta").val("");
    $("#itensNfeConsulta").val("");
    $("#operacaoNfeConsulta").val("");
    $("#lojaNfeConsulta").val("");
    $("#invoiceIdNfeConsulta").val("");
    $("#storeIdNfeConsulta").val("");
    $("#itensNfeJson").val("[]");
    $("#qtdDivergenciasNfe").val("0");
    renderTabelaConferencia([], 0, 0, "Consulte a chave da NFe para gerar o confronto dos itens.", "info");
}

function setNfeFeedback(message, type) {
    var feedback = $("#consultaNfeFeedback");
    if (!feedback.length) {
        return;
    }

    feedback.removeClass("alert-success alert-danger alert-info alert-warning");

    if (!message || type === "hidden") {
        feedback.hide().text("");
        return;
    }

    if (type === "success") {
        feedback.addClass("alert-success");
    } else if (type === "warning") {
        feedback.addClass("alert-warning");
    } else if (type === "info") {
        feedback.addClass("alert-info");
    } else {
        feedback.addClass("alert-danger");
    }

    feedback.text(message).show();
}

function formatNfeCurrency(value) {
    var textValue = String(value == null ? "" : value).trim();
    if (textValue === "") {
        return "";
    }

    var numberValue = parseFloat(textValue.replace(",", "."));
    if (isNaN(numberValue)) {
        return textValue;
    }

    try {
        return numberValue.toLocaleString("pt-BR", { style: "currency", currency: "BRL" });
    } catch (e) {
        return textValue;
    }
}

function fillNfeConsultaFields(row) {
    var emissionDate = String(row.emissionDate || "");

    $("#numeroNfeConsulta").val(String(row.invoiceNumber || ""));
    $("#serieNfeConsulta").val(String(row.serie || ""));
    $("#dataEmissaoApiNfe").val(emissionDate);
    $("#situacaoNfeConsulta").val(String(row.situation || ""));
    $("#fornecedorNfeConsulta").val(String(row.supplierName || ""));
    $("#valorNfeConsulta").val(formatNfeCurrency(row.documentValue));
    $("#dataEntradaNfeConsulta").val(String(row.updatedAt || ""));
    $("#itensNfeConsulta").val(String(row.itemCount || ""));
    $("#operacaoNfeConsulta").val(String(row.fiscalOperationDescription || ""));
    $("#lojaNfeConsulta").val(String(row.storeId || ""));
    $("#invoiceIdNfeConsulta").val(String(row.invoiceId || ""));
    $("#storeIdNfeConsulta").val(String(row.storeId || ""));
    $("#itensNfeJson").val(String(row.itensJson || "[]"));

    if (emissionDate) {
        $("#dataEmissaoNfe").val(emissionDate);
    }

    processarConferenciaNfe();
}

function processarConferenciaNfe() {
    var nfeItems = parseItensNfeJson();
    if (nfeItems.length === 0) {
        $("#qtdDivergenciasNfe").val("0");
        renderTabelaConferencia([], 0, 0, "Consulte a chave da NFe para gerar o confronto dos itens.", "info");
        return;
    }

    var solicitacaoMap = buildSolicitacaoMap();
    var nfeMap = buildNfeMap(nfeItems);
    var allKeys = mergeKeys(solicitacaoMap, nfeMap);
    var rows = [];
    var divergencias = 0;

    for (var i = 0; i < allKeys.length; i++) {
        var key = allKeys[i];
        var req = solicitacaoMap[key] || { qty: 0, label: key };
        var nfe = nfeMap[key] || { qty: 0, label: key };

        var status = "OK";
        if (req.qty === 0 && nfe.qty > 0) {
            status = "Somente NFe";
        } else if (nfe.qty === 0 && req.qty > 0) {
            status = "Somente base";
        } else if (Math.abs(req.qty - nfe.qty) > 0.00001) {
            status = "Quantidade divergente";
        }

        if (status !== "OK") {
            divergencias++;
        }

        rows.push({
            key: req.label || nfe.label || key,
            requestedQty: req.qty,
            nfeQty: nfe.qty,
            status: status
        });
    }

    $("#qtdDivergenciasNfe").val(String(divergencias));

    var resumo = "Conferencia finalizada: " + rows.length + " item(ns), " + divergencias + " divergencia(s).";
    var resumoType = divergencias > 0 ? "warning" : "success";
    renderTabelaConferencia(rows, rows.length, divergencias, resumo, resumoType);
}

function parseItensNfeJson() {
    var raw = String($("#itensNfeJson").val() || "[]");
    try {
        var parsed = JSON.parse(raw);
        return parsed instanceof Array ? parsed : [];
    } catch (e) {
        return [];
    }
}

function buildSolicitacaoMap() {
    var out = {};
    $(collectQuantidadeItemFields()).each(function (i) {
        var $qtd = $(this);
        var $row = $qtd.closest("tr");
        var indice = getIndiceCampoPaiFilho($qtd);
        var rowKey = indice || ("BASE_" + (i + 1));

        var qty = getQuantidadeBaseConferencia($qtd, indice, $row);
        if (qty <= 0) return;

        var productId = String(getCampoItem("productIdItem", indice, $row).val() || "").trim();
        var code = resolveSolicitacaoItemCode(indice, $qtd);
        var descricao = String(getCampoItem("codigoItem", indice, $row).val() || "").trim();

        var key = resolveConferenciaKey(productId, code, "ROW:" + rowKey);
        var label = productId ? ("PID " + productId) : (code || descricao || ("Linha " + rowKey));

        if (!out[key]) {
            out[key] = { qty: 0, label: label };
        }
        out[key].qty += qty;
    });
    return out;
}

function getQuantidadeBaseConferencia($qtdSolicitada, indice, $row) {
    var qtdSolicitada = toFloatSafe($qtdSolicitada.val());
    var $qtdAprovada = getCampoItem("quantidadeAprovadaGestor", indice, $row);

    if ($qtdAprovada.length) {
        var qtdAprovadaRaw = String($qtdAprovada.val() == null ? "" : $qtdAprovada.val()).trim();
        // Regra: se o gestor preencheu, a conferencia da NFe usa a quantidade aprovada (inclusive 0).
        if (qtdAprovadaRaw !== "") {
            return toFloatSafe(qtdAprovadaRaw);
        }
    }

    return qtdSolicitada;
}

function resolveSolicitacaoItemCode(indice, qtyInput) {
    var code = String($("#codigoProdutoItem___" + indice).val() || "").trim();
    if (code) return normalizeCodigoComparacao(code);

    code = String($("#descricao___" + indice).val() || "").trim();
    if (code) return normalizeCodigoComparacao(code);

    var row = qtyInput && qtyInput.length ? qtyInput.closest("tr") : $();
    if (row.length) {
        var byName = findFirstFilledValue(row.find("input[name='descricao___" + indice + "']"));
        if (byName) return normalizeCodigoComparacao(byName);

        var anyDescricao = findFirstFilledValue(row.find("input[name^='descricao']"));
        if (anyDescricao) return normalizeCodigoComparacao(anyDescricao);

        var byIdLike = findFirstFilledValue(row.find("input[id*='descricao']"));
        if (byIdLike) return normalizeCodigoComparacao(byIdLike);

        var codigoCellInputs = row.find("td").eq(1).find("input,select,textarea");
        var fromCodigoCell = findFirstFilledValue(codigoCellInputs);
        if (fromCodigoCell) return normalizeCodigoComparacao(fromCodigoCell);

        // Em modo bloqueado/view, o Zoom pode renderizar apenas texto em span/div.
        var codigoCell = row.find("td").eq(1);
        var zoomRendered = findFirstFilledText(codigoCell.find(
            ".select2-selection__rendered, .select2-chosen, .zoom-value, .zoom-span, span, div"
        ));
        if (zoomRendered) return normalizeCodigoComparacao(zoomRendered);

        // Fallback final: texto bruto da célula.
        var rawCellText = String(codigoCell.text() || "").trim();
        if (rawCellText) return normalizeCodigoComparacao(rawCellText);
    }

    return "";
}

function findFirstFilledValue(elements) {
    if (!elements || !elements.length) return "";

    for (var i = 0; i < elements.length; i++) {
        var $el = $(elements[i]);
        var val = String($el.val() || "").trim();
        if (!val) {
            val = String($el.attr("value") || "").trim();
        }
        if (!val) {
            val = String($el.attr("data-value") || "").trim();
        }
        if (val) return val;
    }
    return "";
}

function findFirstFilledText(elements) {
    if (!elements || !elements.length) return "";

    for (var i = 0; i < elements.length; i++) {
        var txt = String($(elements[i]).text() || "").trim();
        if (txt) return txt;
    }
    return "";
}

function normalizeCodigoComparacao(value) {
    var raw = String(value || "").trim();
    if (!raw) return "";

    // Zoom pode trazer "75655 - DESCRICAO"; para conferencia usamos o primeiro token.
    var firstToken = raw.split(" - ")[0].split(" | ")[0].trim();
    return firstToken || raw;
}

function buildNfeMap(items) {
    var out = {};
    for (var i = 0; i < items.length; i++) {
        var item = items[i] || {};
        var qty = toFloatSafe(item.quantity);
        if (qty <= 0) continue;

        var productId = String(item.productId || "").trim();
        var code = String(item.code || "").trim();
        var key = resolveConferenciaKey(productId, code, "NFE:" + i);
        var label = productId ? ("PID " + productId) : (code || ("Item NFe " + (i + 1)));

        if (!out[key]) {
            out[key] = { qty: 0, label: label };
        }
        out[key].qty += qty;
    }
    return out;
}

function resolveConferenciaKey(productId, code, fallback) {
    var pid = String(productId || "").trim();
    if (pid) {
        return "ITEM:" + pid;
    }

    var cod = String(code || "").trim();
    if (cod) {
        return "ITEM:" + cod;
    }

    return String(fallback || "");
}

function mergeKeys(a, b) {
    var obj = {};
    for (var ka in a) obj[ka] = true;
    for (var kb in b) obj[kb] = true;
    return Object.keys(obj);
}

function renderTabelaConferencia(rows, totalItens, divergencias, mensagem, tipo) {
    var tbody = $("#tabelaConferenciaNfeBody");
    var resumo = $("#resumoConferenciaNfe");
    if (!tbody.length || !resumo.length) return;

    var html = "";
    if (!rows || rows.length === 0) {
        html = "<tr><td colspan='5'>Sem conferencia.</td></tr>";
    } else {
        for (var i = 0; i < rows.length; i++) {
            var row = rows[i];
            var rowClass = row.status === "OK" ? "" : " class='danger'";
            var itemSolicitado = row.key;
            var qtdSolicitada = formatConferenciaNumero(row.requestedQty);
            var itemNfe = row.key;
            var qtdNfe = formatConferenciaNumero(row.nfeQty);

            if (row.status === "Somente base") {
                itemNfe = "-";
                qtdNfe = "0";
            } else if (row.status === "Somente NFe") {
                itemSolicitado = "-";
                qtdSolicitada = "0";
            }

            html += "<tr" + rowClass + ">" +
                "<td>" + escapeHtml(itemSolicitado) + "</td>" +
                "<td>" + escapeHtml(qtdSolicitada) + "</td>" +
                "<td>" + escapeHtml(itemNfe) + "</td>" +
                "<td>" + escapeHtml(qtdNfe) + "</td>" +
                "<td>" + escapeHtml(row.status) + "</td>" +
                "</tr>";
        }
    }
    tbody.html(html);

    var typeClass = "alert-info";
    if (tipo === "success") typeClass = "alert-success";
    if (tipo === "warning") typeClass = "alert-warning";
    if (tipo === "danger" || tipo === "error") typeClass = "alert-danger";

    resumo.removeClass("alert-info alert-success alert-warning alert-danger");
    resumo.addClass(typeClass);
    resumo.text(mensagem || ("Conferencia: " + totalItens + " item(ns), " + divergencias + " divergencia(s)."));
}

function montarResumoDivergenciasConferencia(limit) {
    var max = parseInt(limit, 10);
    if (isNaN(max) || max <= 0) max = 5;

    var linhas = [];
    $("#tabelaConferenciaNfeBody tr.danger").each(function () {
        var cols = $(this).find("td");
        if (!cols || cols.length < 5) return;

        var itemSolicitado = String($(cols[0]).text() || "").trim();
        var qtdSolicitada = String($(cols[1]).text() || "").trim();
        var itemNfe = String($(cols[2]).text() || "").trim();
        var qtdNfe = String($(cols[3]).text() || "").trim();

        linhas.push("Item base: " + itemSolicitado + " / Quantidade: " + qtdSolicitada + " | Item emitido na nota: " + itemNfe + " / Quantidade: " + qtdNfe);
    });

    if (!linhas.length) return "";

    if (linhas.length > max) {
        var restantes = linhas.length - max;
        return linhas.slice(0, max).join("; ") + "; ... +" + restantes + " item(ns)";
    }

    return linhas.join("; ");
}

function listarProdutosDivergentes(limit) {
    var max = parseInt(limit, 10);
    if (isNaN(max) || max <= 0) max = 10;

    var items = [];
    var seen = {};

    $("#tabelaConferenciaNfeBody tr.danger").each(function () {
        var cols = $(this).find("td");
        if (!cols || cols.length < 5) return;

        var itemSolicitado = String($(cols[0]).text() || "").trim();
        var itemNfe = String($(cols[2]).text() || "").trim();

        if (itemSolicitado && itemSolicitado !== "-" && !seen[itemSolicitado]) {
            seen[itemSolicitado] = true;
            items.push(itemSolicitado);
        }
        if (itemNfe && itemNfe !== "-" && !seen[itemNfe]) {
            seen[itemNfe] = true;
            items.push(itemNfe);
        }
    });

    if (!items.length) return "";
    if (items.length > max) {
        return items.slice(0, max).join(", ") + " ... +" + (items.length - max);
    }
    return items.join(", ");
}

function toFloatSafe(value) {
    var text = String(value == null ? "" : value).replace(",", ".").trim();
    var n = parseFloat(text);
    return isNaN(n) ? 0 : n;
}

function formatConferenciaNumero(value) {
    var n = toFloatSafe(value);
    return String(n).indexOf(".") >= 0 ? n.toFixed(2) : String(n);
}

function escapeHtml(value) {
    return String(value == null ? "" : value)
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/\"/g, "&quot;")
        .replace(/'/g, "&#39;");
}

function consultarChaveNfe() {
    var key = normalizeNfeKey($("#chaveNfe").val());
    $("#chaveNfe").val(key);
    clearNfeConsultaFields();

    if (key.length !== 44) {
        setNfeFeedback("Informe uma chave com 44 digitos para consultar.", "warning");
        return;
    }

    setNfeFeedback("Consultando chave da NFe...", "info");

    try {
        var constraint = DatasetFactory.createConstraint("key", key, key, ConstraintType.MUST);
        var dataset = DatasetFactory.getDataset("ds_fiscal_invoice_by_keys", null, [constraint], null);

        if (!dataset || !dataset.values || dataset.values.length === 0) {
            setNfeFeedback("Nao foi possivel consultar a NFe no momento.", "error");
            return;
        }

        var row = dataset.values[0] || {};
        var success = String(row.success || "").toLowerCase() === "true";

        if (!success) {
            setNfeFeedback(String(row.message || "NFe nao encontrada para a chave informada."), "error");
            return;
        }

        fillNfeConsultaFields(row);

        if ($("#invoiceIdNfeConsulta").val() === "") {
            setNfeFeedback("A consulta retornou sem identificador tecnico da NFe.", "error");
            return;
        }

        setNfeFeedback("NFe localizada e vinculada a solicitacao.", "success");
    } catch (e) {
        setNfeFeedback("Erro ao consultar chave da NFe: " + e, "error");
    }
}
var beforeSendValidate = function (numState, nextState) {
    $(".errorValidate").removeClass("errorValidate");
    if (numState == 0 || numState == 1) {
        if ($("#estabelecimento ").val() == "") {
            $("#estabelecimento ").parent("div").addClass("errorValidate");
            throw "'Estabelecimento/filial ' é obrigatório.";
        } else if ($("#enderecoSolicitante").val() == "") {
            $("#enderecoSolicitante").parent("div").addClass("errorValidate");
            throw "'Endereço do solicitante' é obrigatório.";
        } else if ($("#complemento").val() == "") {
            $("#complemento").parent("div").addClass("errorValidate");
            throw "'Complemento' é obrigatório.";
        } else if ($("#justificativa").val() == "") {
            $("#justificativa").parent("div").addClass("errorValidate");
            throw "'Qual o motivo da transferência?' é obrigatório.";
        } else if (String($("#analistasup").val() || "").trim() == "") {
            $("#analistasup").parent("div").addClass("errorValidate");
            throw "'Analista solicitante' é obrigatório.";
        } else {
            $(collectQuantidadeItemFields()).each(function () {
                var $qtd = $(this);
                var $row = $qtd.closest("tr");
                var linha = getIndiceCampoPaiFilho($qtd);
                if (!linha) return;

                var $descricao = getCampoItem("descricao", linha, $row);
                var descricaoValor = $.trim(String($descricao.val() || ""));
                var qtdValor = $.trim(String($qtd.val() || ""));
                if (!descricaoValor && !qtdValor) {
                    var $btnRemove = $row.find("button[onclick*='remove_row']");
                    if ($btnRemove.length) {
                        remove_row($btnRemove.get(0));
                    }
                }
            });

            var itensInformados = 0;
            $(collectQuantidadeItemFields()).each(function () {
                var $qtd = $(this);
                var $row = $qtd.closest("tr");
                var linha = getIndiceCampoPaiFilho($qtd);
                var $descricao = getCampoItem("descricao", linha, $row);

                var descricaoValor = $.trim(String($descricao.val() || ""));
                var qtdValor = $.trim(String($qtd.val() || ""));
                if (!descricaoValor && !qtdValor) return;

                itensInformados++;

                if (!descricaoValor) {
                    $descricao.parent("div").addClass("errorValidate");
                    throw "Selecione o item " + itensInformados + ".";
                }

                if (!qtdValor) {
                    $qtd.parent("div").addClass("errorValidate");
                    throw "Preencha a quantidade do item " + itensInformados + ".";
                }
            });

            if (itensInformados === 0) {
                throw "Ao menos um item é necessário para iniciar a solicitação.";
            }
        }
    } else if (numState == 4) {
        if (String(nextState) == "39") {
            if ($("#justificativaDecisaoGestor").val() == "") {
                $("#justificativaDecisaoGestor").parent("div").addClass("errorValidate");
                throw "'Justificativa da decisão' é obrigatória para reprovar.";
            }
        } else {
            validarQuantidadeAprovadaGestor();
        }
    } else if (numState == 6) {
        var chaveNfe = normalizeNfeKey($("#chaveNfe").val());
        $("#chaveNfe").val(chaveNfe);

        if (chaveNfe == "") {
            $("#chaveNfe").parent("div").addClass("errorValidate");
            throw "'Chave de acesso da NFe' e obrigatoria.";
        }

        if (chaveNfe.length !== 44) {
            $("#chaveNfe").parent("div").addClass("errorValidate");
            throw "'Chave de acesso da NFe' deve conter 44 digitos.";
        }

        if ($("#invoiceIdNfeConsulta").val() == "") {
            $("#chaveNfe").parent("div").addClass("errorValidate");
            throw "Consulte a chave da NFe antes de enviar a etapa.";
        }
    } else if (numState == 31) {
        if ($("#motoristaColetaNome").val() == "") {
            throw "'Motorista responsável pela coleta' é obrigatório.";
        }
        if ($("#dataColeta").val() == "") {
            throw "'Data da coleta' é obrigatória.";
        }
        if ($("#fdAnexo_Coleta").val() == "") {
            throw "'Anexo da Coleta' é obrigatório.";
        }
        if (invalidFile("fdAnexo_Coleta")) {
            throw "O arquivo informado em 'Anexo da Coleta' não foi encontrado na aba de anexos.";
        }
        var tipoMotoristaEntrega31 = $("input[name='tipoMotoristaEntrega']:checked").val();
        if (!tipoMotoristaEntrega31) {
            throw "Informe quem vai fazer a entrega (mesmo motorista da coleta ou outro).";
        }
        if (tipoMotoristaEntrega31 === "mesmo") {
            if ($("#motoristaColetaLogin").val() == "") {
                throw "Nao foi encontrado login do motorista da coleta para enviar a etapa de entrega.";
            }
            $("#motoristaEntregaNome").val($("#motoristaColetaNome").val());
            $("#motoristaEntregaLogin").val($("#motoristaColetaLogin").val());
        } else if ($("#motoristaEntregaLogin").val() == "") {
            throw "Selecione o outro motorista responsavel pela entrega.";
        }
    } else if (numState == 57) {
        if ($("#motoristaEntregaLogin").val() == "") {
            throw "Motorista da entrega nao definido. Configure na etapa de coleta.";
        }

        if ($("#motoristaEntregaNome").val() == "") {
            throw "'Motorista responsável pela entrega' é obrigatório.";
        }
        if ($("#dataEntrega").val() == "") {
            var entregaNow = getCurrentDate();
            $("#dataEntrega").val(entregaNow[0] + " " + entregaNow[1]);
        }
        if ($("#dataEntrega").val() == "") {
            throw "'Data da entrega' é obrigatória.";
        }
        if (String($("#nomerecebedor").val() || "").trim() == "") {
            $("#nomerecebedor").parent("div").addClass("errorValidate");
            throw "'Nome de quem recebeu a mercadoria' é obrigatório.";
        }
    } else if (numState == 18) {
        var validacaoItens = $("input[name='validacaoItens']:checked").val();
        if (validacaoItens == "" || validacaoItens == undefined) {
            throw "'Validação do recebimento' é obrigatória.";
        } else if (
            validacaoItens == "divergencia" ||
            validacaoItens == "naoEntregue" ||
            validacaoItens == "incorreto"
        ) {
            if ($("#justificativaDecisaoItens").val() == "") {
                $("#justificativaDecisaoItens")
                    .parent("div")
                    .addClass("errorValidate");
                throw "'Justificativa' é obrigatório.";
            }
        }
    } else if (numState == 24) {
        $('#justificativaValidaProblema').parent().removeClass('has-error errorValidate');
        if ($('#justificativaValidaProblema').val() == "") {
            $('#justificativaValidaProblema').parent().addClass('has-error errorValidate');
            throw "Preencha os campos obrigatórios."
        }
    }
};

function setSelectedZoomItem(selectedItem) {
    var name_item = selectedItem.inputId;
    var ehItem = name_item.indexOf("___") >= 0;
	var indice = "";
	if (ehItem){
		var valores = name_item.split("___");
		name_item = valores[0];
		indice = valores[1];
	}

    // var dtsCentroCusto = DatasetFactory.getDataset(
    //     "ds_LojasTransf",
    //     null,
    //     null,
    //     null
    // ).values;

    // var nomeGestorComercial = dtsCentroCusto[0].gestorCentroCusto;
    // var emailGestorComercial = dtsCentroCusto[0].emailGestor;
    // var idGestorComercial = dtsCentroCusto[0].idGestor;

    // var nomeGestorOperacoes = dtsCentroCusto[2].gestorCentroCusto;
    // var emailGestorOperacoes = dtsCentroCusto[2].emailGestor;
    // var idGestorOperacoes = dtsCentroCusto[2].idGestor;

    // if (name_item == "estabelecimento") {
    //     let estabelecimento = selectedItem["estabelecimento"];
    
    //     if (estabelecimento.includes("ESCRITÓRIO")) {
    //     } else if (estabelecimento.includes("CD")) {
    //         window["centroCusto"].setValue("Operações");
    //         $("#gestorNome").val(nomeGestorOperacoes);
    //         $("#gestorEmail").val(emailGestorOperacoes);
    //         $("#gestor_cc").val(idGestorOperacoes);
    //     } else {
    //         window["centroCusto"].setValue("Comercial");
    //         $("#gestorNome").val(nomeGestorComercial);
    //         $("#gestorEmail").val(emailGestorComercial);
    //         $("#gestor_cc").val(idGestorComercial);
    //     }
    // }
    
    if (name_item == "centroCusto") {
        $("#gestorNome").val(selectedItem["RESPONSAVEL_LOJA"] || "");
        $("#gestorEmail").val(selectedItem["emailGestor"] || "");
        $("#gestor_cc").val(selectedItem["COLLEAGUE_ID"] || "");
        $("#ufDestino").val(selectedItem["UF"] || "");
        refreshMotoristasEntregaByUf(true);
    }

    if (name_item == "estabelecimento") {
        $("#gestorNomeE").val(selectedItem["RESPONSAVEL_LOJA"] || "");
        $("#gestorEmailE").val(selectedItem["emailGestor"] || "");
        $("#gestor_cce").val(selectedItem["COLLEAGUE_ID"] || "");
        $("#ufOrigem").val(selectedItem["UF"] || "");
    }

    if (name_item == "userSolicitante") {
        $("#emailSolicitante").val(selectedItem.mail);
    }

    if (name_item == "motoristaEntregaSelecionado") {
        var motoristaNome = selectedItem["NOME"] || selectedItem["colleagueName"] || selectedItem["LOGIN"] || selectedItem["login"] || "";
        var motoristaColleagueId = selectedItem["COLLEAGUE_ID"] || selectedItem["colleaguePK.colleagueId"] || "";
        $("#motoristaEntregaNome").val(String(motoristaNome || ""));
        $("#motoristaEntregaLogin").val(String(motoristaColleagueId || ""));
        $("#tipoMotoristaEntregaOutro").prop("checked", true);
        applyMotoristaEntregaMode("outro", true);
    }
    
    if (name_item == "descricao") {
        var itemDescricao = selectedItem["descricao"] || selectedItem["Description"] || "";
        var itemCode = selectedItem["Code"] || selectedItem["sku"] || "";
        var itemProductId = selectedItem["id"] || selectedItem["productId"] || "";
        var itemCategoria = selectedItem["categoria"] || selectedItem["strategicDescription"] || "";
        $("#codigoItem" + "___" + indice).val(itemDescricao);
        $("#codigoProdutoItem" + "___" + indice).val(itemCode);
        $("#productIdItem" + "___" + indice).val(itemProductId);
        $("#categoriaItem" + "___" + indice).val(itemCategoria);
        processarConferenciaNfe();
        toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
    }
    
}

function removedZoomItem(removedItem) {
    var name_item = removedItem.inputId;
    var ehItem = name_item.indexOf("___") >= 0;
	var indice = "";
	if (ehItem){
		var valores = name_item.split("___");
		name_item = valores[0];
		indice = valores[1];
	}

    if (name_item == "userSolicitante") {
        $("#emailSolicitante").val("");
    } else if (name_item == "centroCusto") {
        $("#gestorNome").val("");
        $("#gestorEmail").val("");
        $("#gestor_cc").val("");
        $("#ufDestino").val("");
        refreshMotoristasEntregaByUf(true);
    } else if (name_item == "estabelecimento") {
        $("#gestorNomeE").val("");
        $("#gestorEmailE").val("");
        $("#gestor_cce").val("");
        $("#ufOrigem").val("");
    } else if (name_item == "motoristaEntregaSelecionado") {
        if ($("input[name='tipoMotoristaEntrega']:checked").val() === "outro") {
            $("#motoristaEntregaNome").val("");
            $("#motoristaEntregaLogin").val("");
        }
    } else if (~name_item.indexOf("___")) {
        var linha = name_item.split("___");

        if (linha[0] == "descricao") {
            $("#codigoItem___" + linha[1]).val("");
            $("#codigoProdutoItem___" + linha[1]).val("");
            $("#productIdItem___" + linha[1]).val("");
            $("#categoriaItem___" + linha[1]).val("");
            $("#quantidadeItem___" + linha[1]).val("");
            $("#quantidadeAprovadaGestor___" + linha[1]).val("");
            processarConferenciaNfe();
            toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
        }
    }

    if (name_item == "descricao") {
        $("#codigoItem" + "___" + indice).val("");
        $("#codigoProdutoItem" + "___" + indice).val("");
        $("#productIdItem" + "___" + indice).val("");
        $("#categoriaItem" + "___" + indice).val("");
        $("#quantidadeAprovadaGestor" + "___" + indice).val("");
        processarConferenciaNfe();
        toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
    }
}

function add_new_row(table) {
    var row = wdkAddChild(table);
    updt_line();
    toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
    syncQuantidadeAprovadaAllRows();
}

function updt_line() {
    $(".tabela_itens_id").each(function (index, item) {
        if (index == 0) return;
        $(item)[0].innerHTML = index;
    });
}

function remove_row(element) {
    fnWdkRemoveChild(element);
    updt_line();
    processarConferenciaNfe();
    toggleQuantidadeAprovadaGestorByActivity($("#activity").val());
}



// Andrey, nao esqueca de ver isso
// function removedZoomItem(removedItem) {
// //     if (removedItem.inputId === "estabelecimento") {
// //         document.getElementById("setor-container").style.display = "none"; // Oculta ao remover
//         window["centroCusto"].setValue("")[0]
// //     }
// }

$(document).ready(function() {
    // $('#gerarTabela').click(function() {
    //     var numCotacoes = $('#numCotacoes').val();
    //     var tbody = $("#tabelaCotacao tbody");
    //     tbody.empty(); // Limpa a tabela antes de gerar novas linhas

    //     // Supondo que você já tenha uma tabela de origem com os produtos
    //     $('table.table[tablename="tabelaItens"] tbody tr:visible').each(function(index, element) {
    //         var nomeItem = $(element).find('input[name^="nomeItem"]').val();
    //         var quantidadeItem = $(element).find('input[name^="quantidadeItem"]').val();

    //         for (var i = 0; i < numCotacoes; i++) {
    //             var row = `<tr>
    //                 <td>${index + 1}.${i + 1}</td>
    //                 <td>${nomeItem}</td>
    //                 <td>${quantidadeItem}</td>
    //                 <td><input type="text" class="form-control" name="fornecedor_${index}_${i}" /></td>
    //                 <td><input type="number" class="form-control" name="preco_${index}_${i}" /></td>
    //                 <td><input type="date" class="form-control" name="dataEntrega_${index}_${i}" /></td>
    //                 <td><input type="email" class="form-control" name="email_${index}_${i}" /></td>
    //             </tr>`;
    //             tbody.append(row);
    //         }
    //     });
    // });

    $('#gerarTabela').click(function() {
        
    });
});

/**
 * Toda a lógica para o correto funcionamento desse componente foi feito em cima das classes abaixo:
 * .componentAnexo, .descAnexo, .inputAnexo, .btnUpFile, .btnViewerFile, .btnDownloadFile e o atributo data-acao
 * Sem elas o código não irá funcionar, então se por acaso você quiser alterar os nomes dessas classes
 * lembre-se de alterar nas funções desse arquivo e também no css
 */
 
/**
 * Direciona para cada função correspondente ao valor que esta no atributo data-acao do botão
 * @param {object} event Parâmetro obrigatório, o própio elemento que sofreu o evento click
 * @return {void}
 * @author Sérgio Machado
 */
function anexo(event){
    console.log("event")
    console.log(event)
    try{
        const acao = event.currentTarget.getAttribute("data-acao");
        const inputFile = $(event.currentTarget).parent().parent().find(".inputAnexo")[0]
        const fileDescription = $(event.currentTarget).parent().parent().find(".descAnexo").val()
        if(acao == "upload"){
            uploadFile(fileDescription, inputFile.id)
        }
        if(acao == "viewer"){
            viewerFile(fileDescription)
        }
        if(acao == "download"){
            downloadFile(fileDescription, inputFile.id)
        }
        if(acao == "delete"){
            removeFileConfirm(fileDescription, inputFile.id)
        }
    }catch(e){
        console.error("Houve um erro inesperado na função anexo")
        console.error(e)
    }
}
 
 
/**
 * Envia arquivos para a aba Anexos do Fluig
 * Função adaptada por Sérgio Machado
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do arquivo que ficará na aba anexos do Fluig
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @return {void}
 */
function uploadFile(fileDescription, idInput) {
    try{
        var tabAttachments = parent.document.getElementById("tab-attachments");
        if (tabAttachments) {
            //Verifica se o navegador é o Ie9 para realizar o devido tratamento
            if (parent.WCMAPI.isIe9()) {
                $(".ecm-navigation-silverlight", parent.document).show("fade").css("top", 0);
                $("#ecm-navigation-silverlight", parent.document).attr({
                    "data-on-camera": "true", "data-file-name-camera": fileDescription, "data-inputNameFile": idInput
                });
                $(parent.document).on("keyup", this.actionKeyup)
            } else {
                var element = parent.document.getElementById("ecm-navigation-inputFile-clone");
                if (element && document.createEvent) {
                    element.setAttribute("data-on-camera", "true");
                    if (fileDescription && idInput) {
                        element.setAttribute("data-file-name-camera", fileDescription)
                        element.setAttribute("data-inputNameFile", idInput)
                    }
                    //Realiza o click no botão "Carregar arquivos" que tem na aba de anexos
                    element.click();
                }
            }
        }
    }catch(e){
        console.error("Houve um erro inesperado na função uploadFile")
        console.error(e)
    }
}
 
 
 
/**
 * Função executada após a escolha do arquivo a ser enviado para o Fluig.
 * Verifica se o anexo já existe, seta o valor do arquivo fisico no campo e altera o estado dos botões
 * @return {void}
 */
$(function(){
    try{
        window.parent.$("#ecm-navigation-inputFile-clone").on('change', function(e) {
        const inputNameFile = this.getAttribute("data-inputNameFile");
        const fileDescription = this.getAttribute("data-file-name-camera");
        const filePhisical = this.files[0].name;
        if(fileDescription && fileDescription){
            /**
             * O trecho de código abaixo percorre os anexos do Fluig e caso já exista um anexo com a mesma descrição, ele será removido.
             * Em seguida limpa o campo onde é armazenado o nome fisico do arquivo
             */
            $.each(parent.ECM.attachmentTable.getData(), function(i, attachment) {
                var descricao = attachment.description;
                if (fileDescription == descricao) {
                    parent.WKFViewAttachment.removeAttach([i]);
                    setFilePhisicalName(inputNameFile, "");
                }
            });
            setFilePhisicalName(inputNameFile, filePhisical)
            if(getFormMode() == "ADD"){
                btnState(inputNameFile, 'delete', 'download');
            }
            if(getFormMode() == "MOD"){
                btnState(inputNameFile, 'delete', 'viewer');
            }
            if(getFormMode() == "VIEW"){
                btnState(inputNameFile, 'download', 'viewer');
            }
        }
    });
    }catch(e){
        console.error("Houve um erro inesperado ao selecionar o arquivo")
        console.error(e)
    }
});
 
 
/**
 * Visualizar arquivos que esta na aba Anexos do Fluig
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do anexo
 * @return {void}
 */
function viewerFile(fileDescription) {
    try{
        if(hasFileFluig(fileDescription)){
            const anexos = parent.ECM.attachmentTable.getData();
            for(let i = 0; i < anexos.length; i++){
                var descricao = anexos[i].description;
                if (fileDescription == descricao) {
                    parent.WKFViewAttachment.openAttachmentView('adm', anexos[i].documentId);
                    return
                }
            }
        }else{
            FLUIGC.toast({
                title: "Atenção",
                message: "Anexo não encontrado",
                type: "warning"
            });
        }
    }catch(e){
        console.error("Houve um erro inesperado na função viewerFile")
        console.error(e)
    }
}
 
 
/**
 * Realiza o download do arquivo que esta na aba Anexos do Fluig
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do arquivo que esta na aba anexos do Fluig
 * @return {void}
 */
function downloadFile(fileDescription, idInput) {
    try{
        const filename = getFormMode() == "VIEW" ? $(`#${idInput}`).text() : $(`#${idInput}`).val()
        FLUIGC.message.confirm({
            message: `Deseja baixar o anexo <b>${filename}</b>?`,
            title: 'Confirmação',
            labelYes: 'Sim, quero baixar',
            labelNo: 'Não, quero cancelar',
        }, function(result) {
            if (result) {
                $.each(parent.ECM.attachmentTable.getData(), function(i, attachment) {
                    var descricao = attachment.description;
                    if (fileDescription == descricao) {
                        parent.WKFViewAttachment.downloadAttach([i]);
                    }
                });
            }
        });
    }catch(e){
        console.error("Houve um erro inesperado na função downloadFile")
        console.error(e)
    }
}
 
/**
 * Confirmação para Remove arquivo que esta na aba Anexos do Fluig
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do arquivo que esta na aba anexos do Fluig
 * @return {void}
 * @author Sérgio Machado
 */
function removeFileConfirm(fileDescription, idInput) {
    try{
        const filename = $(`#${idInput}`).val()
        FLUIGC.message.confirm({
            message: `Deseja remover o anexo <b>${filename}</b>?`,
            title: 'Confirmação',
            labelYes: 'Sim, quero remover',
            labelNo: 'Não, quero cancelar',
        }, function(result) {
            if (result) {
                removeFile(fileDescription)
                setFilePhisicalName(idInput, "")
                btnState(idInput, "upload", "download")
            }
        });
    }catch(e){
        console.error("Houve um erro inesperado na função removeFileConfirm")
        console.error(e)
    }
}
 
/**
 * Remove arquivo que esta na aba Anexos do Fluig
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do arquivo que esta na aba anexos do Fluig
 * @return {void}
 * @author Sérgio Machado
 */
function removeFile(fileDescription) {
    try{
        $.each(parent.ECM.attachmentTable.getData(), function(i, attachment) {
            if (attachment.description == fileDescription) {
                parent.WKFViewAttachment.removeAttach([i]);
            }
        });
    }catch(e){
        console.error("Houve um erro inesperado na função removeFile")
        console.error(e)
    }
}
 
 
/**
 * Seta o nome do arquivo fisico no campo e realiza tratativa caso o campo esteja bloqueado pelo enableFields
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @param {String} filePhisical Parâmetro obrigatório, nome do arquivo fisico
 * @return {void}
 * @author Sérgio Machado
 */
function setFilePhisicalName(idInput, filePhisical){
    try{
        if(idInput.indexOf("_") == 0){
            $("#" + idInput.substring(1)).val(filePhisical);
        }
        $("#" + idInput).val(filePhisical);
    }catch(e){
        console.error("Houve um erro inesperado na função setFilePhisicalName")
        console.error(e)
    }
}
 
 
/**
 * Altera o estado e visibilidade dos botões de anexos
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @param {String} acao Parâmetro obrigatório, ação para ser executada no momento do click, se é delete ou upload
 * @param {String} btn Parâmetro obrigatório, botão secundário que deve sofrer ação de ficar visível ou não. Botão de Download ou Viewer
 * @return {void}
 * @author Sérgio Machado
 */
function btnState(idInput, acao, btn){
    try{
        let btnUpFile = $(`#${idInput}`).parent().parent().find(".btnUpFile");
        let btnDownloadFile = $(`#${idInput}`).parent().parent().find(".btnDownloadFile");
        let btnViewerFile = $(`#${idInput}`).parent().parent().find(".btnViewerFile");
        if(acao == "delete"){
            btnUpFile.removeClass("btn-success").addClass("btn-danger");
            btnUpFile.attr({'data-acao': acao, 'title': 'Excluir'});
            btnUpFile.find("i").removeClass("fluigicon-file-upload").addClass("fluigicon-trash");
            if(btn == "download"){
                btnDownloadFile.prop("disabled", false);
                btnDownloadFile.show()
            }
            if(btn == "viewer"){
                btnViewerFile.prop("disabled", false);
                btnViewerFile.show()
            }
        }
        if(acao == "upload"){
            btnUpFile.removeClass("btn-danger").addClass("btn-success");
            btnUpFile.attr({'data-acao': acao, 'title': 'Selecionar'});
            btnUpFile.find("i").removeClass("fluigicon-trash").addClass("fluigicon-file-upload");
            btnDownloadFile.prop("disabled", true);
            btnDownloadFile.hide()
            btnViewerFile.prop("disabled", true);
            btnViewerFile.hide()
        }
    }catch(e){
        console.error("Houve um erro inesperado na função btnState")
        console.error(e)
    }
}
 
 
/**
 * Faz tratativa nos botões do anexos percorrente cada class .componentAnexo
 * Em modo de visualização o botão de upload é removido, e caso tenha anexo, habilita o botão de visualização do anexo
 * Se em modo de edição e conter anexo o botão de upload é alterado para o botão de deletar anexos e habilita o botão de visualização
 * @return {void}
 * @author Sérgio Machado
 */
function displayBtnFiles(){
    try{
        var mode = getFormMode();
        var allowedInputs = getAllowedAttachmentInputs();
        $('.componentAnexo').each(function(i, element) {
            let inputFile = $(element).find(".inputAnexo")
            let inputId = inputFile.attr("id") || "";
            let normalizedInputId = inputId.indexOf("_") === 0 ? inputId.substring(1) : inputId;
            let btnUpFile = $(element).find(".btnUpFile");
            let btnViewerFile = $(element).find(".btnViewerFile");
            let btnDownloadFile = $(element).find(".btnDownloadFile");
            let canUploadHere = allowedInputs.indexOf(normalizedInputId) >= 0;
           
            if(mode == "VIEW"){
                btnUpFile.remove();
                if(inputFile.val() != ""){
                    btnViewerFile.prop("disabled", false);
                    btnViewerFile.show()
                    btnDownloadFile.prop("disabled", false);
                    btnDownloadFile.show()
                }
            }
            if(mode == "MOD"){
                if(inputFile.val() != ""){
                    if(canUploadHere){
                        btnState(inputId, "delete", "viewer");
                    } else {
                        btnUpFile.remove();
                        btnViewerFile.prop("disabled", false);
                        btnViewerFile.show()
                        btnDownloadFile.prop("disabled", false);
                        btnDownloadFile.show()
                    }
                } else if(!canUploadHere){
                    btnUpFile.remove();
                }
            }
        });
    }catch(e){
        console.error("Houve um erro inesperado na função displayBtnFiles")
        console.error(e)
    }
}
 
function getAllowedAttachmentInputs() {
    var mode = getFormMode();
    var activity = String($("#activity").val() || "");

    if (mode === "VIEW") {
        return [];
    }

    if (mode !== "MOD" && mode !== "ADD") {
        return [];
    }

    if (activity === "0" || activity === "1") {
        return ["fnAnexo_PlanilhaItens"];
    }

    if (activity === "6") {
        return ["fnAnexo_Nfe"];
    }
    if (activity === "31") {
        return ["fdAnexo_Coleta"];
    }
    if (activity === "57") {
        return ["fdAnexo_Entrega"];
    }
    if (activity === "18") {
        return ["fdAnexo_recebimento"];
    }

    return [];
}
 
  
/**
 * Remove o botão de upload/delete
 * @param {String} inputFile Parâmetro obrigatório, Id do campo
 * @return {void}
 * @author Sérgio Machado
 */
function invisibleBtnUpload(inputFile){
    try{
        var mode = getFormMode();
        var allowedInputs = getAllowedAttachmentInputs();
        var canUploadHere = allowedInputs.indexOf(inputFile) >= 0;

        if(mode == "VIEW" || ((mode == "MOD" || mode == "ADD") && !canUploadHere)){
            if($(`#_${inputFile}`).length){
                let btnUpFile = $(`#_${inputFile}`).parent().parent().find(".btnUpFile");
                btnUpFile.remove();
            } else{
                let btnUpFile = $(`#${inputFile}`).parent().parent().find(".btnUpFile");
                btnUpFile.remove();
            }
        }
        if($(`#_${inputFile}`).length){
            if($(`#_${inputFile}`).val() == ""){
                $(`#_${inputFile}`).attr({placeholder:"Nenhum anexo selecionado"});
            }
        } else{
            if($(`#${inputFile}`).val() == ""){
                $(`#${inputFile}`).attr({placeholder:"Nenhum anexo selecionado"});
            }
        }
    }catch(e){
        console.error("Houve um erro inesperado na função invisibleBtnUpload")
        console.error(e)
    }
}
 
 
/**
 * Verifica se os campos do anexo de uma tabela pai e filho esta preenchido,
 * caso esteja, ele verifica se o anexo esta presente na aba de anexos do Fluig
 * @param {String} tablename Parâmetro obrigatório, tablename da tabela pai e filho.
 * @param {String} idInput Parâmetro obrigatório, Id do campo de anexo que deseja verificar
 * @return {String} - Retorna string de erros caso apresente erros
 * @author Sérgio Machado
 */
function invalidFilesTable(tablename, idInput){
    try {
        let errors = "";
        const countRows = $(`[tablename='${tablename}']`).find('tbody tr').not(':first');
        for(let i = 0; i < countRows.length; i++){
            let indice = getIndice(countRows.eq(i).find("input")[0].id);
            let inputNameFile = $(`#_${idInput}___${indice}`).length ? $(`#_${idInput}___${indice}`) : $(`#${idInput}___${indice}`)
            let fileDescription = inputNameFile.parent().find(".descAnexo").val()
            if(inputNameFile.val() && !hasFileFluig(fileDescription)){
                 errors += `<li style='margin-bottom: 5px;'>O anexo <b>${inputNameFile.val()}</b> da linha <b>${i+1}</b> não foi encontrado</li>`
            }
        }
        return errors
    } catch (e) {
        console.error('Houve um erro inesperado na função invalidFileTable')
        console.error(e)
    }
}
 
/**
 * Verifica se o campo do anexo esta preenchido, caso esteja, ele verifica se o anexo esta válido
 * @param {String} idInput Parâmetro obrigatório, Id do campo em que o nome do arquivo fisico é gravado
 * @return {Boolean}
 * @author Sérgio Machado
 */
function invalidFile(idInput){
    try {
        const inputNameFile = String($(`#${idInput}`).val() || "").trim();
        if(inputNameFile){
            let fileDescription = "";
            if($(`#_${idInput}`).length){
                fileDescription = String($(`#_${idInput}`).parent().find(".descAnexo").val() || "").trim();
            } else{
                fileDescription = String($(`#${idInput}`).parent().find(".descAnexo").val() || "").trim();
            }
            if (!fileDescription) {
                fileDescription = inputNameFile;
            }
            return !hasFileFluig(fileDescription)
        }else{
            return false
        }
    } catch (e) {
        console.error('Houve um erro inesperado na função invalidFile')
        console.error(e)
    }
}
 
 
/**
 * Verifica se o anexo existe na aba de anexos do Fluig
 * @param {String} fileDescription Parâmetro obrigatório, Descrição do arquivo
 * @return {Boolean} - Retorna verdadeiro caso o arquivo exista
 * @author Sérgio Machado
 */
function hasFileFluig(fileDescription){
    try {
        var target = String(fileDescription || "").trim();
        if (!target) return false;
        const anexos = parent.ECM.attachmentTable.getData();
        for(let i = 0; i < anexos.length; i++){
            var descricao = String(anexos[i].description || "").trim();
            if (target == descricao || descricao.indexOf(target + " - ") === 0) {
                return true
            }
        }
        return false
    } catch (e) {
        console.error('Houve um erro inesperado na função hasFileFluig')
        console.error(e)
    }
}

//Quando o Fluig finalizar o upload e o anexo for escolhido
window.parent.$("#ecm-navigation-inputFile-clone").on('change', function () {

    const fileDescription = String(this.getAttribute("data-file-name-camera") || "");
    const file = this.files[0];
    if (!file) return;

    if (fileDescription === EXCEL_ATTACHMENT_DESCRIPTION || fileDescription.indexOf(EXCEL_ATTACHMENT_DESCRIPTION + " - ") === 0) {

        // Copia o arquivo para o input técnico
        const dt = new DataTransfer();
        dt.items.add(file);
        var excelInput = document.getElementById("excelUpload");
        if (!excelInput) return;
        excelInput.files = dt.files;

        // Atualiza nome mostrado
        updateExcelImportUi(file.name);
        getExcelAttachmentField().val(file.name);

        // Agora sim o arquivo está dentro do input e pode ser lido
        carregarItensDoExcel("excelUpload");
    }
});



function getChaveNfeLimpa() {
  return (document.getElementById("chaveNfe").value || "")
    .replace(/\s+/g, "")   // tira espaços
    .replace(/\D/g, "")    // garante só dígitos
    .slice(0, 44);         // limite oficial
}
