if (typeof window !== "undefined") {
    window.WCMAPI = window.WCMAPI || {};
    if (typeof window.WCMAPI.isMobileAppMode !== "function") {
        window.WCMAPI.isMobileAppMode = function () { return false; };
    }
}

function showCamera(param) {
    if (typeof JSInterface !== "undefined" && JSInterface && typeof JSInterface.showCamera === "function") {
        JSInterface.showCamera(param);
        return true;
    }
    return false;
}

var MyWidget = SuperWidget.extend({
    init: function () {
        this.root = $("#MyWidget_" + this.instanceId);
        this.anexoInfo = null;
        this.isSending = false;
        this.bindEvents();
        this.setupInitialValues();
    },

    bindEvents: function () {
        var self = this;

        this.root.find("#btnEnviarNota_" + this.instanceId + ", #btnEnviarNota").off("click").on("click", function () {
            self.enviarDocumento();
        });

        this.root.find("#anexaDocumento_" + this.instanceId + ", #anexaDocumento").off("click").on("click", function () {
            self.handleAnexo();
        });

        this.root.find("#arquivoLocal_" + this.instanceId + ", #arquivoLocal").off("change").on("change", function () {
            self.onArquivoSelecionado(this);
        });

        this.root.find("#tipo_cadastro").off("change").on("change", function () {
            self.toggleTipoCadastro(this.value);
            self.clearFieldError("#cpf");
            self.clearFieldError("#cnpj");
        });

        this.root.find("#cpf").off("input").on("input", function () {
            this.value = self.mascaraCPF(this.value);
        });

        this.root.find("#cnpj").off("input").on("input", function () {
            this.value = self.mascaraCNPJ(this.value);
        });

        this.root.find("#valor").off("input").on("input", function () {
            this.value = self.mascaraValorDocumento(this.value);
        });

        this.root.find("#valor").off("blur").on("blur", function () {
            var currentValue = (this.value || "").toString().trim();
            if (!currentValue) {
                return;
            }
            this.value = self.formatMoneyDisplay(currentValue);
        });
    },

    setupInitialValues: function () {
        this.root.find("#data_abertura").val(this.getCurrentDate());
        this.root.find("#tipo_cadastro").val("cpf").trigger("change");
        this.root.find("#emitido_por").val("fornecedor");
        this.root.find("#tipo_documento").val("danfe");
        this.root.find("#arquivoLocalNome").text("");
        this.clearStatus();
    },

    onArquivoSelecionado: function (inputEl) {
        var file = inputEl && inputEl.files && inputEl.files[0] ? inputEl.files[0] : null;

        if (!file) {
            this.anexoInfo = null;
            this.root.find("#arquivoLocalNome").text("");
            return;
        }

        this.anexoInfo = {
            fileName: file.name,
            mimeType: file.type || "application/octet-stream",
            fileSize: file.size || 0,
            file: file
        };

        this.root.find("#arquivoLocalNome").text("Arquivo selecionado: " + file.name + " (" + this.formatFileSize(file.size || 0) + ")");
        this.clearStatus();
    },

    handleAnexo: function () {
        this.root.find("#arquivoLocal_" + this.instanceId + ", #arquivoLocal").trigger("click");
    },

    toggleTipoCadastro: function (tipo) {
        tipo = this.normalizeTipoCadastro(tipo);
        var divCpf = this.root.find(".divCpf");
        var divCnpj = this.root.find(".divCnpj");
        var cpf = this.root.find("#cpf");
        var cnpj = this.root.find("#cnpj");

        if (tipo === "cpf") {
            divCpf.show();
            divCnpj.hide();
            cpf.prop("readonly", false);
            cnpj.prop("readonly", true).val("");
            return;
        }

        if (tipo === "cnpj") {
            divCpf.hide();
            divCnpj.show();
            cnpj.prop("readonly", false);
            cpf.prop("readonly", true).val("");
            return;
        }

        divCpf.hide();
        divCnpj.show();
        cpf.prop("readonly", true).val("");
        cnpj.prop("readonly", true).val("");
    },

    enviarDocumento: function () {
        var self = this;

        if (this.isSending) {
            return;
        }

        if (!this.validateRequiredFields()) {
            this.setStatus("error", "Revise os campos obrigatorios destacados para continuar.");
            FLUIGC.toast({
                title: "Aviso",
                message: "Preencha os campos obrigatorios antes de enviar.",
                type: "warning"
            });
            return;
        }

        if (!this.anexoInfo || !this.anexoInfo.file) {
            this.setStatus("error", "Selecione um anexo antes de enviar o documento.");
            FLUIGC.toast({
                title: "Aviso",
                message: "Selecione um anexo antes de enviar o documento.",
                type: "warning"
            });
            return;
        }

        var tipoCadastro = this.normalizeTipoCadastro(this.value("#tipo_cadastro"));
        var cpf = this.onlyDigits(this.value("#cpf"));
        var cnpj = this.onlyDigits(this.value("#cnpj"));
        var numeroDocumento = this.value("#numero_documento");
        var valor = this.normalizeMoney(this.value("#valor"));
        var autorizadorResponsavel = self.value("#autorizador_responsavel");
        var documentoPessoa = tipoCadastro === "cpf" ? cpf : cnpj;
        var cpfField = tipoCadastro === "cpf" ? cpf : "";

        this.setLoading(true, "Enviando documento, aguarde...");

        var payloadProcesso = {
            targetState: 5,
            comment: "Envio via portal fornecedor",
            formFields: {
                data_abertura: self.value("#data_abertura"),
                emitido_por: self.value("#emitido_por"),
                entidade_responsavel: self.value("#entidade_responsavel"),
                tipo_cadastro: tipoCadastro,
                emailSolicitante: self.value("#emailSolicitante"),
                cpf: cpfField || documentoPessoa,
                tipo_documento: self.value("#tipo_documento"),
                numero_documento: numeroDocumento,
                valor: valor,
                autorizador_responsavel: autorizadorResponsavel,
                autorizadorResponsavel: autorizadorResponsavel,
                justificativa: self.value("#justificativa")
            }
        };

        window.__portalfornecedor_lastProcessPayload = payloadProcesso;
        console.log("[portalfornecedor] payload endpoint:", payloadProcesso);

        this.enviarViaEndpoint(payloadProcesso, this.anexoInfo.file)
            .done(function (response) {
                console.log("[portalfornecedor] response endpoint:", response);
                self.setLoading(false);
                self.renderSuccessState(response);
            })
            .fail(function (xhr) {
                self.setLoading(false);
                console.warn("[portalfornecedor] falha no envio via endpoint:", xhr);
                console.error("[portalfornecedor] detalhe erro endpoint:", {
                    status: xhr.status,
                    statusText: xhr.statusText,
                    responseText: xhr.responseText
                });
                self.setStatus("error", self.extractEndpointErrorMessage(xhr));
                FLUIGC.toast({
                    title: "Erro",
                    message: "Falha ao enviar pelo endpoint do portal.",
                    type: "danger"
                });
            });
    },

    renderSuccessState: function (response) {
        var processInstanceId = this.extractProcessInstanceId(response);
        var idText = processInstanceId ? ("Solicitação " + processInstanceId) : "Solicitação";
        var html = ""
            + "<div class='portal-success-state'>"
            + "  <h3 class='portal-success-title'>" + idText + " enviada com sucesso.</h3>"
            + "  <p class='portal-success-desc'>Sua Solicitação foi encaminhada para o Grupo Ginseng para análise.</p>"
            + "</div>";

        this.root.html(html);
        console.log("[portalfornecedor] success state renderizado.");
    },

    extractProcessInstanceId: function (response) {
        if (!response) return "";
        if (response.processInstanceId) return response.processInstanceId;
        if (response.content && response.content.processInstanceId) return response.content.processInstanceId;
        if (response.content && response.content.processInstanceid) return response.content.processInstanceid;
        if (response.content && response.content.requestNumber) return response.content.requestNumber;
        return "";
    },

    enviarViaEndpoint: function (payloadProcesso, file) {
        return $.ajax({
            url: this.getPublicEndpointUrl(),
            type: "POST",
            data: this.buildMultipartData(payloadProcesso, file),
            processData: false,
            contentType: false
        });
    },

    getPublicEndpointUrl: function () {
        if (window.portalfornecedorConfig && window.portalfornecedorConfig.publicEndpointUrl) {
            return window.portalfornecedorConfig.publicEndpointUrl;
        }

        return "https://api.grupoginseng.com.br/v2/api/public/portalfornecedor/enviar";
    },

    buildMultipartData: function (payloadProcesso, file) {
        var formData = new FormData();
        var formFields = payloadProcesso && payloadProcesso.formFields ? payloadProcesso.formFields : {};
        var keys = Object.keys(formFields);

        formData.append("targetState", String(payloadProcesso.targetState || 5));
        formData.append("comment", payloadProcesso.comment || "");

        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            formData.append(key, formFields[key] == null ? "" : String(formFields[key]));
        }

        if (file) {
            formData.append("arquivo", file, file.name || "anexo");
        }

        return formData;
    },

    extractEndpointErrorMessage: function (xhr) {
        if (!xhr || !xhr.responseText) {
            return "Falha ao enviar pelo endpoint do portal. Veja o console para detalhes.";
        }

        try {
            var payload = JSON.parse(xhr.responseText);
            if (payload && payload.message) {
                return String(payload.message);
            }
            if (payload && payload.detail && typeof payload.detail === "string") {
                return String(payload.detail);
            }
            if (payload && payload.detail && payload.detail.message) {
                return String(payload.detail.message);
            }
            if (payload && payload.detailedMessage) {
                return String(payload.detailedMessage);
            }
        } catch (e) {
            // ignore
        }

        return xhr.responseText;
    },

    setLoading: function (isLoading, message) {
        this.isSending = !!isLoading;
        var btn = this.root.find("#btnEnviarNota");

        if (isLoading) {
            btn.prop("disabled", true).text("Enviando...");
            this.setStatus("success", message || "Processando...");
            return;
        }

        btn.prop("disabled", false).text("Enviar documento");
    },

    setStatus: function (type, message) {
        var box = this.root.find("#envioStatus");
        if (!box.length) return;

        box.removeClass("hidden success error");
        box.addClass(type === "error" ? "error" : "success");
        box.text(message || "");
    },

    clearStatus: function () {
        var box = this.root.find("#envioStatus");
        if (!box.length) return;
        box.removeClass("success error").addClass("hidden").text("");
    },

    validateRequiredFields: function () {
        var ok = true;
        var tipoCadastro = this.normalizeTipoCadastro(this.value("#tipo_cadastro"));

        if (!this.value("#emitido_por")) ok = this.markRequired("#emitido_por") && ok;
        if (!this.value("#entidade_responsavel")) ok = this.markRequired("#entidade_responsavel") && ok;
        if (!this.value("#tipo_cadastro")) ok = this.markRequired("#tipo_cadastro") && ok;
        if (!this.value("#numero_documento")) ok = this.markRequired("#numero_documento") && ok;
        if (!this.value("#autorizador_responsavel")) ok = this.markRequired("#autorizador_responsavel") && ok;
        if (!this.value("#justificativa")) ok = this.markRequired("#justificativa") && ok;

        if (tipoCadastro === "cpf") {
            if (!this.onlyDigits(this.value("#cpf"))) ok = this.markRequired("#cpf") && ok;
            this.clearFieldError("#cnpj");
        } else if (tipoCadastro === "cnpj") {
            if (!this.onlyDigits(this.value("#cnpj"))) ok = this.markRequired("#cnpj") && ok;
            this.clearFieldError("#cpf");
        }

        if (!this.anexoInfo || !this.anexoInfo.file) ok = this.markRequired("#arquivoLocal") && ok;

        return ok;
    },

    markRequired: function (selector) {
        var input = this.root.find(selector);
        if (!input.length) return false;

        var container = input.closest(".alertaCampo, .form-group");
        if (container.length) container.addClass("has-error");

        input.one("input change", function () {
            if ($.trim($(this).val())) {
                $(this).closest(".alertaCampo, .form-group").removeClass("has-error");
            }
        });

        return false;
    },

    clearFieldError: function (selector) {
        var input = this.root.find(selector);
        if (!input.length) return;
        input.closest(".alertaCampo, .form-group").removeClass("has-error");
    },

    value: function (selector) {
        return (this.root.find(selector).val() || "").toString().trim();
    },

    getCurrentDate: function () {
        var now = new Date();
        var yyyy = now.getFullYear();
        var mm = ("0" + (now.getMonth() + 1)).slice(-2);
        var dd = ("0" + now.getDate()).slice(-2);
        return yyyy + "-" + mm + "-" + dd;
    },

    mascaraCPF: function (value) {
        var v = (value || "").replace(/\D/g, "").slice(0, 11);
        v = v.replace(/(\d{3})(\d)/, "$1.$2");
        v = v.replace(/(\d{3})(\d)/, "$1.$2");
        v = v.replace(/(\d{3})(\d{1,2})$/, "$1-$2");
        return v;
    },

    mascaraCNPJ: function (value) {
        var v = (value || "").replace(/\D/g, "").slice(0, 14);
        v = v.replace(/^(\d{2})(\d)/, "$1.$2");
        v = v.replace(/^(\d{2})\.(\d{3})(\d)/, "$1.$2.$3");
        v = v.replace(/\.(\d{3})(\d)/, ".$1/$2");
        v = v.replace(/(\d{4})(\d)/, "$1-$2");
        return v;
    },

    mascaraValorDocumento: function (value) {
        var raw = (value || "").toString().replace(/[^\d,]/g, "");
        if (!raw) return "";

        var commaIndex = raw.indexOf(",");
        var inteiro = "";
        var decimal = "";

        if (commaIndex >= 0) {
            inteiro = raw.substring(0, commaIndex).replace(/\D/g, "");
            decimal = raw.substring(commaIndex + 1).replace(/\D/g, "").slice(0, 2);
        } else {
            inteiro = raw.replace(/\D/g, "");
        }

        inteiro = inteiro.replace(/^0+(?=\d)/, "");
        if (!inteiro) inteiro = "0";
        inteiro = inteiro.replace(/\B(?=(\d{3})+(?!\d))/g, ".");

        if (commaIndex >= 0) {
            return inteiro + "," + decimal;
        }

        return inteiro;
    },

    formatMoneyDisplay: function (value) {
        var normalized = this.normalizeMoney(value);
        var parts = normalized.split(",");
        var inteiro = (parts[0] || "").replace(/\D/g, "");
        var decimal = (parts[1] || "").replace(/\D/g, "").slice(0, 2);

        inteiro = inteiro.replace(/^0+(?=\d)/, "");
        if (!inteiro) inteiro = "0";
        if (!decimal) decimal = "00";
        if (decimal.length === 1) decimal = decimal + "0";

        inteiro = inteiro.replace(/\B(?=(\d{3})+(?!\d))/g, ".");
        return inteiro + "," + decimal;
    },

    onlyDigits: function (value) {
        return (value || "").replace(/\D/g, "");
    },

    normalizeMoney: function (value) {
        var raw = (value || "").toString().trim();
        if (!raw) return "0,00";

        var cleaned = raw.replace(/\s/g, "").replace(/[^\d,\.]/g, "");
        var inteiro = "";
        var decimal = "";

        if (cleaned.indexOf(",") >= 0) {
            var commaParts = cleaned.split(",");
            inteiro = (commaParts.shift() || "").replace(/\D/g, "");
            decimal = commaParts.join("").replace(/\D/g, "").slice(0, 2);
        } else if (cleaned.indexOf(".") >= 0) {
            var dotParts = cleaned.split(".");
            var isDecimalDot = dotParts.length === 2 && dotParts[1].length > 0 && dotParts[1].length <= 2;

            if (isDecimalDot) {
                inteiro = (dotParts[0] || "").replace(/\D/g, "");
                decimal = (dotParts[1] || "").replace(/\D/g, "").slice(0, 2);
            } else {
                inteiro = cleaned.replace(/\D/g, "");
                decimal = "";
            }
        } else {
            inteiro = cleaned.replace(/\D/g, "");
            decimal = "";
        }

        inteiro = inteiro.replace(/^0+(?=\d)/, "");
        if (!inteiro) inteiro = "0";

        if (!decimal) decimal = "00";
        if (decimal.length === 1) decimal = decimal + "0";

        return inteiro + "," + decimal;
    },

    normalizeTipoCadastro: function (value) {
        return (value || "").toString().trim().toLowerCase();
    },

    formatFileSize: function (bytes) {
        var b = Number(bytes || 0);
        if (b <= 0) return "0 KB";
        if (b < 1024) return b + " B";
        if (b < 1048576) return (b / 1024).toFixed(1) + " KB";
        return (b / 1048576).toFixed(2) + " MB";
    }
});
