$('#tutorial').on('click', function () {
    $(document).ready(async function () {
        const driver = new Driver({
            doneBtnText: 'Sair',
            closeBtnText: 'Fechar',
            nextBtnText: 'Próximo',
            prevBtnText: 'Anterior',
            allowClose: false,
        });
        driver.defineSteps([{
            element: '#txtProduto',
            popover: {
                title: 'Campo Produto',
                description: 'Selecionar o produto.',
                position: 'bottom'
            }
        },
        {
            element: '#txtTag',
            popover: {
                title: 'Campo Tag',
                description: 'Selecionar a Tag.',
                position: 'bottom'
            }
        },
        {
            element: '#txtTabPreco',
            popover: {
                title: 'Campo Tabela Preço',
                description: 'Selecionar a Tabela de Preço.',
                position: 'bottom'
            }
        },
        {
            element: '#btnGerar',
            popover: {
                title: 'Botão Gerar',
                description: 'Clique aqui para gerar as tags com os dados e quantidades informadas.',
                position: 'top'
            }
        },
        {
            element: '#btnLimpar',
            popover: {
                title: 'Botão Limpar',
                description: 'Clique aqui para limpar os campos e dados já gerados.',
                position: 'top'
            }
        },
        {
            element: '#btnImprimir',
            popover: {
                title: 'Botão Imprimir',
                description: 'Clique aqui para imprimir as tags geradas.',
                position: 'top'
            }
        },
        {
            element: '#tabelaGrade_wrapper',
            popover: {
                title: 'Grade',
                description: 'Aqui está a grade do produto para informar as quantidades de tags a serem geradas.',
                position: 'top'
            }
        },
        {
            element: '#tabelaTag_wrapper',
            popover: {
                title: 'Grade',
                description: 'Aqui está as tags a serem impressas.',
                position: 'top'
            }
        }
        ]);
        driver.start();
    });
});

$(document).ready(async function () {
    let controleImpressao = 'DE';

    criaDataTablePadrao('#tabelaGrade', false, false, false, false, true, true, '400px');
    criaDataTablePadrao('#tabelaTag', false, false, false, false, true, true, '400px');

    $('#btn-Produto').pesquisa_serverside(['#txtProduto'],
        ['CODIGO', 'DESCRICAO'],
        ['DESCRICAO', 'DESCRICAO'],
        `{"tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": ["1 = 1"]}`, 'Pesquisa Produto'
    );
    $('#txtProduto').autocompleta(1, `JSON={ "tabela":"PRODUTO", "camposSelect":[ "codigo chave", "descricao descricao"], "where": null}`);
    $('#txtTag').autocompleta(1, `JSON={ "tabela":"CADTAG", "camposSelect":[ "codigo chave", "descricao descricao"], "where": null}`);
    $('#txtTabPreco').autocompleta(1, `JSON={ "tabela":"REGIAO", "camposSelect":[ "regiao chave", "descricao descricao"], "where": null}`);

    $('#btn-Tag').pesquisa_serverside(['#txtTag', '', '#txtColunas'],
        ['CODIGO', 'DESCRICAO', 'COLUNAS'],
        ['DESCRICAO', 'DESCRICAO', 'COLUNAS'],
        `{"tabela":"CADTAG", "camposSelect":[ "CODIGO", "DESCRICAO", "COLUNAS"], "where": ["1 = 1"]}`,
        'Pesquisa Tag'
    );

    $('#btn-TabPreco').pesquisa_serverside(['#txtTabPreco'],
        ['REGIAO', 'DESCRICAO'],
        ['DESCRICAO', 'DESCRICAO'],
        `{"tabela":"REGIAO", "camposSelect":[ "REGIAO", "DESCRICAO"], "where": ["1 = 1"]}`, 'Pesquisa Tabela Preço');

    $('#btnCodCre').pesquisa_serverside(['#txtCodCreEntrada'],
        ['CODCLI', 'NOME'],
        ['NOME', 'NOME'],
        `{"tabela":"ENTIDADE", "camposSelect":[ "CODCLI", "NOME"], "where": ["1 = 1"]}`, 'Pesquisa Fornecedor'
    );
    $('#txtCodCreEntrada').autocompleta(1, `JSON={ "tabela":"ENTIDADE", "camposSelect":[ "codcli chave", "nome descricao"], "where": null}`);

    $("#btn-limpar-Produto").on("click", function () {
        $("#txtProduto").val("");
    });

    $("#btn-limpar-Tag").on("click", function () {
        $("#txtTag").val("");
    });

    $("#btn-limpar-TabPreco").on("click", function () {
        $("#txtTabPreco").val("");
    });

    $("#btnACodCre").on("click", function () {
        $("#txtCodCreEntrada").val("");
    });

    $("#btnGerar").on("click", async function () {
        controleImpressao = 'DE';
        await gerarTag();
    });

    $("#btnLimpar").on("click", function () {
        limpaTabela();
        $('#txtProduto').val('');
        $('#txtTag').val('');
        $('#txtTabPreco').val('');
        $('#txtColunaInicial').val('0');
        $('#txtTag').prop('disabled', false);
        $('#btn-Tag').prop('disabled', false);
        $('#btn-limpar-Tag').prop('disabled', false);
    });

    $("#txtProduto").blur(async function () {
        $('#divTabGrade').removeClass('d-none');
        if ($(this).val() != '') {
            explodeGradeProduto(pegaChave(this));
        }
    });

    $('#txtTag').focusout(async function () {
        await retornaColunas(pegaChave(this));
    });

    async function retornaColunas(tag) {
        insereValor('#txtColunas', 0);
        if (tag != '') {
            const pesquisaParam = {
                tabela: 'CADTAG',
                camposSelect: ['COLUNAS'],
                where: [`CADTAG.CODIGO = '${tag}'`],
            }
            const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam));
            insereValor('#txtColunas', jsonStr[0].COLUNAS);
        }
        if ($('#txtTag').val() != '') {
            $('#txtTag').prop('disabled', true);
            $('#btn-Tag').prop('disabled', true);
            $('#btn-limpar-Tag').prop('disabled', true);
        }
    };

    function limpaTabela() {
        $("#tabelaGrade tr").remove();
        $("#tabelaTag tr").remove();
        if ($('#tabelaTag').DataTable().rows().count() > 0) {
            $('#tabelaTag').empty();
            criaDataTablePadrao('#tabelaTag', false, false, false, false, true, true, '400px');
            $("#tabelaTag").DataTable().columns.adjust().draw(false);
        };
    };

    async function explodeGradeProduto(codigo) {
        $.LoadingOverlay('show');
        try {
            let tam;
            if ($.fn.DataTable.isDataTable('#tabelaGrade')) {
                $('#tabelaGrade').DataTable().destroy();
                $('#tabelaGrade').empty();
            };

            const response = await requisicao('GET', '/sisplan/funcoes/v1/gradeproduto?', `CODIGO=${codigo}`, null);
            const jsonStr = await response.json();
            if (response.status != 200) {
                msgAlerta(jsonStr.RESULT[0].mensagem);
            }

            for (let i = 0; i < parseInt(jsonStr.length); i++) {
                const colunas = Object.keys(jsonStr[i]);
                const tamanhos = [];
                colunas.forEach((coluna) => {
                    if (!['CODIGO', 'COR', 'DESC_COR', 'POSICAO'].includes(coluna)) {
                        tamanhos.push(coluna);
                    }
                });

                const jsonObject = jsonStr.map(obj => {
                    const newObject = { ...obj };
                    delete newObject.CODIGO;
                    delete newObject.POSICAO;
                    Object.keys(obj).forEach(key => {
                        tam = RetornaIdTamFormatado(key);
                        if (!['CODIGO', 'COR', 'POSICAO', 'DESC_COR'].includes(tam)) {
                            newObject[tam] = `<input type="text" class="input-default focus form-control camposGrade" id="${newObject.COR + tam}" value="${jsonStr[i][tam]}">`;
                            newObject[tam.split('HIFEN')[1]] = `<input type="text" class="input-default focus form-control camposGrade" id="${newObject.COR + tam}" value="0">`;
                            delete newObject[tam];
                        }
                    });
                    return { ...newObject };
                });

                if (i == 0) {
                    const titulosFixos = ['COR', 'DESC_COR'];
                    const titulosGeral = [...titulosFixos, ...tamanhos];
                    const titulos = titulosGeral.map(titulo => {
                        const coluna = ['COR', 'DESC_COR'].includes(titulo) ? titulo : titulo.split('HIFEN')[1];
                        const objeto = { title: coluna, data: RetornaIdTamFormatado(coluna) };
                        return objeto;
                    });
                    criaDataTablePadrao('#tabelaGrade', false, false, false, false, true, false, '250px', jsonObject, titulos);
                }
            }

        } finally {
            $.LoadingOverlay('hide');

            $('.camposGrade').on('blur', function () {
                preencheComZero();
            });

            $('.camposGrade').maskMoney({
                decimal: ".",
                thousands: "",
                precision: 0,
            });
            preencheComZero();
        }
    };

    async function gerarTag() {
        $.LoadingOverlay('show');
        try {
            $('#divTabGrade').removeClass('d-none');
            if ($('#txtProduto').val() == '') {
                msgAlerta('Produto não informado, impossível continuar!');
                return;
            };
            if ($('#txtTag').val() == '') {
                msgAlerta('Tag não informada, impossível continuar!');
                return;
            };
            if (!pegaChave('#txtColunas') > '0') {
                msgAlerta('Quantidade de colunas não informada no cadastro de tag, impossível continuar!');
                return;
            };
            let grade = [];
            let tag = [];
            let dataSet = [];
            let dataSetCols = [];

            grade = retornaGrade();

            if (!grade.length > 0) {
                msgAlerta('Nenhuma quantidade informada na grade do produto, impossível continuar!');
                return;
            }

            tag = $("#tabelaTag").DataTable().rows().data().toArray();

            const url = `/sisplan/impressao/v1/consulta_tag?`;
            const params = `JSON=${JSON.stringify(grade)}&JSONTAG=${JSON.stringify(tag)}&TIPO_IMPRESSAO=${controleImpressao}`;
            const response = await requisicao("POST", url, "", params, null);
            const jsonStr = await response.json();
            if (response.status != 200) {
                throw msgAlerta(jsonStr.mensagem);
            }
            dataSet = jsonStr;
            let keys = Object.keys(dataSet[0]);
            for (let k in keys) {
                dataSetCols.push({
                    title: keys[k],
                    data: keys[k],
                });
            }

            insereValor('#txtColunaInicial', jsonStr[0].COLINI);

            $("#tabelaTag").DataTable({
                destroy: true,
                select: true,
                keys: true,
                searching: false,
                lengthChange: false,
                scrollX: true,
                scrollY: "300px",
                scrollCollapse: true,
                paging: false,
                Filter: false,
                Info: true,
                Order: false,
                language: {
                    sEmptyTable: "Nenhum registro encontrado",
                    sInfo: "_TOTAL_ registros",
                    sInfoEmpty: " 0 registros",
                    sInfoFiltered: "(Filtrados de _MAX_ registros)",
                    sInfoPostFix: "",
                    sInfoThousands: ".",
                    sLengthMenu: "_MENU_ resultados",
                    sLoadingRecords: "Carregando...",
                    sProcessing: "Processando...",
                    sZeroRecords: "Nenhum registro encontrado",
                    sSearch: "Pesquisar",
                    oAria: {
                        sSortAscending: ": Ordenar colunas de forma ascendente",
                        sSortDescending: ": Ordenar colunas de forma descendente",
                    },
                },
                autoWidth: true,
                columns: dataSetCols,
                data: dataSet,
            });
        } finally {
            $.LoadingOverlay('hide');
        }
    }

    function preencheComZero() {
        setTimeout(() => {
            $('.camposGrade').map((index) => {
                if ($($('.camposGrade')[index]).val() == '') {
                    $($('.camposGrade')[index]).val('0');
                }
            });
        }, 100);
    };

    function retornaGrade() {
        let grade = [];
        if (controleImpressao == 'DE') {
            const listaDados = $('#tabelaGrade').DataTable().data().toArray();
            listaDados.forEach(dado => {
                const objeto = Object.entries(dado);
                let coluna;
                const colunas = objeto.map(prop => prop[0]);

                for (let i = 0; i < colunas.length; i++) {
                    if ((!['COR', 'DESC_COR'].includes(colunas[i])) && (colunas[i].indexOf('/') == -1)) {
                        coluna = RetornaIdTamFormatado(colunas[i], true);
                        const idSemFormatacao = dado[colunas[i]].split('id="')[1].replace('"', '');
                        const idFormatado = idSemFormatacao.split("value=")[0];
                        const retorno = {
                            CODIGO: pegaChave('#txtProduto'),
                            COR: dado.COR,
                            DESC_COR: dado.DESC_COR,
                            TAM: coluna,
                            QTDE: $(`#${idFormatado}`).val(),
                            TABPRECO: pegaChave('#txtTabPreco'),
                            COLUNAS: pegaChave('#txtColunas'),
                            TAG: pegaChave('#txtTag'),
                            COLINI: pegaChave('#txtColunaInicial'),
                        };

                        if (retorno.QTDE > 0) {
                            grade.push(retorno);
                        }
                    }
                }
            });
        } else if (controleImpressao == 'NF') {
            grade.push({
                CODIGO: '',
                COR: '',
                DESC_COR: '',
                TAM: '',
                QTDE: 0,
                TABPRECO: pegaChave('#txtTabPreco'),
                COLUNAS: pegaChave('#txtColunas'),
                TAG: pegaChave('#txtTag'),
                COLINI: pegaChave('#txtColunaInicial'),
            })
        }

        return grade;
    }

    $("#btnImprimir").on("click", async function () {
        try {
            $.LoadingOverlay("show");
            try {
                let grade = retornaGrade();
                let tag = $("#tabelaTag").DataTable().rows().data().toArray();
                const empresa = getCookie('empresa');
                const usuario = getCookie('usuario');

                const url = `/sisplan/impressao/v1/imprimirreltag?`; //empresa=${empresa}&usuario=${usuario}&COLUNAS=${pegaChave('#txtColunas')}&JSONTAG=${JSON.stringify(tag)}
                const bImprimeAutomatico = await verificaImprimirAutomatico('WTag');
                const arquivo = await GeraRelatorio(`${url}`, "POST", 600000, false, 'WTag', `JSON=${JSON.stringify(grade)}&JSONTAG=${JSON.stringify(tag)}`);

                if (arquivo != undefined) {
                    if (!bImprimeAutomatico) {
                        window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, "_blank");
                    }
                    await limparRelatorios();
                }

            } catch (error) {
                console.error(error);
            }
        } finally {
            $.LoadingOverlay("hide");
        }
    });

    $('#btnBuscaNFEntrada').on('click', function () {

        if ($('#txtTag').val() == '') {
            msgErro('É necessário informar uma etiqueta para continuar.');
            return;
        }

        if ($('#txtTabPreco').val() == '') {
            msgErro('É necessário informar uma tabela de preço para continuar.')
            return;
        }

        $.LoadingOverlay('show');
        $('#modal-nf-entrada').modal('show');
        $.LoadingOverlay('hide');
    });

    $('#btnConsultarNFEntrada').on('click', async function () {
        try {
            controleImpressao = 'NF';
            $.LoadingOverlay('show');
            try {

                const filtros = retornaFiltrosNF();

                if (filtros.numero == '') {
                    msgErro('É necessário informar uma nota.');
                    return;
                }

                if (filtros.serie == '') {
                    msgErro('É necessário informar uma série.');
                    return;
                }

                if (filtros.codcre == '') {
                    msgErro('É necessário informar um fornecedor.')
                    return;
                }

                const response = await requisicao('GET', '/Sisplan/Funcoes/v1/pesquisa?',
                    `JSON={ "tabela":"NF_ENTRA_ITEN",
                        "camposSelect":["NUMERO"],                       
                        "where": ["NF_ENTRA_ITEN.NUMERO = '${filtros.numero}'", "NF_ENTRA_ITEN.SERIE = '${filtros.serie}'", "NF_ENTRA_ITEN.CODCRE = '${filtros.codcre}'"]}`,
                )

                if (!response) {
                    return;
                }

                let jsonStr = await response.json();
                if (response.status != 200) {
                    // msgErro(jsonStr.RESULT[0].mensagem);
                    msgErro('Nota fiscal de entrada não existe ou não possui itens lançados.')
                    return;
                }

                if (jsonStr.length == 0) {
                    msgErro('Nota fiscal sem itens, favor verificar.')
                    return;
                }

                await buscaNFEntrada(filtros);

            } catch (e) {
                console.log(e);
            }
        } finally {
            $.LoadingOverlay('hide');
        }
    });

    async function buscaNFEntrada(filtros) {

        try {
            $.LoadingOverlay('show');

            try {
                $('#divTabGrade').addClass('d-none');

                const response = await requisicao("POST", "/sisplan/impressao/v1/consulta_tag?",
                    `NUMERO=${filtros.numero}&SERIE=${filtros.serie}&CODCRE=${filtros.codcre}&TAG=${filtros.tag}&NOMECRE=${filtros.nomecre}&TABPRECO=${filtros.tabpreco}&COLUNAS=${filtros.cols}&COLINI=${filtros.colini}&COMP_ETIQUETA=${filtros.comp_etiqueta}&TIPO_IMPRESSAO=${filtros.tipo_impressao}`,
                    600000);

                if (!response) {
                    return;
                }

                const jsonStr = await response.json();
                if (response.status != 200) {
                    msgErro(jsonStr.mensagem);
                    return;
                }

                if (jsonStr.length == 0) {
                    msgErro('Nenhum registro encontrado.');
                    if ($.fn.DataTable.isDataTable('#tabelaTag')) {
                        $('#tabelaTag').DataTable().destroy();
                        $('#tabelaTag').empty();
                    };
                    return;
                }

                let dataSetCols = [];

                let keys = Object.keys(jsonStr[0]);
                for (let k in keys) {
                    dataSetCols.push({
                        title: keys[k],
                        data: keys[k],
                    });
                }

                $("#tabelaTag").DataTable({
                    destroy: true,
                    select: true,
                    keys: true,
                    searching: false,
                    lengthChange: false,
                    scrollX: true,
                    scrollY: "300px",
                    scrollCollapse: true,
                    paging: false,
                    Filter: false,
                    Info: true,
                    Order: false,
                    language: {
                        sEmptyTable: "Nenhum registro encontrado",
                        sInfo: "_TOTAL_ registros",
                        sInfoEmpty: " 0 registros",
                        sInfoFiltered: "(Filtrados de _MAX_ registros)",
                        sInfoPostFix: "",
                        sInfoThousands: ".",
                        sLengthMenu: "_MENU_ resultados",
                        sLoadingRecords: "Carregando...",
                        sProcessing: "Processando...",
                        sZeroRecords: "Nenhum registro encontrado",
                        sSearch: "Pesquisar",
                        oAria: {
                            sSortAscending: ": Ordenar colunas de forma ascendente",
                            sSortDescending: ": Ordenar colunas de forma descendente",
                        },
                    },
                    autoWidth: true,
                    columns: dataSetCols,
                    data: jsonStr,
                });

            } catch (e) {
                console.log(e);
            }
        } finally {
            $('#modal-nf-entrada').modal('hide');
            $.LoadingOverlay('hide');
        }
    };

    function retornaFiltrosNF() {
        let filtros = {
            numero: $('#txtNFEntrada').val(),
            serie: $('#txtSerieEntrada').val(),
            codcre: pegaChave('#txtCodCreEntrada'),
            nomecre: pegaDescricao('#txtCodCreEntrada'),
            tag: pegaChave('#txtTag'),
            tabpreco: pegaChave('#txtTabPreco'),
            comp_etiqueta: $('#cbCompEtiqueta').prop('checked') ? 'S' : 'N',
            cols: pegaChave('#txtColunas'),
            colini: pegaChave('#txtColunaInicial') == '' ? '1' : pegaChave('#txtColunaInicial'),
            tipo_impressao: controleImpressao
        }

        return filtros;
    }

})