$('#tutorial').on('click', function () {
    $(document).ready(async function () {
        const driver = new Driver({
            doneBtnText: 'Sair',
            closeBtnText: 'Fechar',
            nextBtnText: 'Próximo',
            prevBtnText: 'Anterior',
            allowClose: false,
            animate: true,
        });
        driver.defineSteps([{
            element: '#campostour',
            popover: {
                title: 'Dados Gerais',
                description: 'Aqui estão os campos disponíveis para realizar a movimentação.',
                position: 'top'
            }
        },
        {
            element: '#txtDocumento',
            popover: {
                title: 'Campos Obrigatórios',
                description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
                position: 'top'
            }
        },
        {
            element: '#txtTipoSaida',
            popover: {
                title: 'Campos Obrigatórios',
                description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
                position: 'top'
            }
        },
        {
            element: '#txtQualidade',
            popover: {
                title: 'Campos Obrigatórios',
                description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
                position: 'top'
            }
        },
        {
            element: '#txtDeposito',
            popover: {
                title: 'Campos Obrigatórios',
                description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
                position: 'top'
            }
        },
        {
            element: '#txtBarra',
            popover: {
                title: 'Campo Barra',
                description: 'Aqui você irá bipar o produto que será dado entrada.',
                position: 'top'
            }
        },
        {
            element: '#txtLote',
            popover: {
                title: 'Campos Obrigatórios',
                description: 'Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.',
                position: 'top'
            }
        },
        {
            element: '#tabela-movimentados',
            popover: {
                title: 'Tabela Produtos',
                description: 'Aqui ficam os produtos bipados.',
                position: 'top'
            }
        },
        {
            element: '#confirmar_mov',
            popover: {
                title: 'Botão Gravar',
                description: 'Clique aqui para gravar a movimentação.',
                position: 'left'
            }
        }
        ]);
        driver.start();
    });
});

$(document).ready(async function () {

    await setarDataAtual('txtDataDe');
    await setarDataAtual('txtDataAte');
    $('#txtQuantidadeBipada').val(0);

    $('#txtTipoSaida').autocompleta(1, `JSON={ "tabela":"tabbai", "camposSelect":["CODIGO CHAVE, DESCRICAO"], "where": [] }`, [], [], []);
    $('#btnTipoSaida').pesquisa_array(['#txtTipoSaida'], ['CODIGO'], ['DESCRICAO'], '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"tabbai", "camposSelect":[ "codigo", "descricao" ], "where": null}', 'Pesquisa Tipo Entrada', 'tabbai');
    $('#btnLimpaTipoSaida').on('click', function () {
        $('#txtTipoSaida').val('');
    });

    $('#txtQualidade').autocompleta(1, `JSON={ "tabela":"tabqul", "camposSelect":["CODIGO CHAVE, DESCRICAO"], "where": [] }`, [], [], []);
    $('#btnQualidade').pesquisa_array(['#txtQualidade'], ['CODIGO'], ['DESCRICAO'], '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"tabqul", "camposSelect":[ "codigo", "descricao" ], "where": null}', 'Pesquisa Qualidade', 'tabqul');
    $('#btnLimpaQualidade').on('click', function () {
        $('#txtQualidade').val('');
    });

    $('#txtDeposito').autocompleta(1, `JSON={ "tabela":"deposito", "camposSelect":["CODIGO CHAVE, DESCRICAO"], "where": [] }`, [], [], []);
    $('#btnDeposito').pesquisa_array(['#txtDeposito'], ['CODIGO'], ['DESCRICAO'], '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"deposito", "camposSelect":[ "codigo", "descricao" ], "where": null}', 'Pesquisa Depósito', 'deposito');
    $('#btnLimpaDeposito').on('click', function () {
        $('#txtDeposito').val('');
    });

    $('#tabela-movimentados').DataTable({
        paging: false,
        filter: false,
        info: false,
        order: false,
        autoWidth: true,
        destroy: true,
        scrollY: "300px",
        "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",
            "oPaginate": {
                "sNext": "Próximo",
                "sPrevious": "Anterior",
                "sFirst": "Primeiro",
                "sLast": "Último"
            },
            "oAria": {
                "sSortAscending": ": Ordenar colunas de forma ascendente",
                "sSortDescending": ": Ordenar colunas de forma descendente"
            }
        }
    });

    $('#tabela-movimentados').on('click', '.btn-excluir', async function () {
        $('#tabela-movimentados').DataTable().row($(this).parents('tr')).remove().draw(false);
        validaEBloqueiaCampos();
        VerificaQuantidadeBipada();
    });

    $('#txtDocumento').on('blur', async function () {
        try {
            $.LoadingOverlay("show");
            let lancto;
            if ($(this).val() == '') {
                let docto = await RetornaDoctoELancto('DOCTO', 'PA_MOV', 'NUM_DOCTO', '6');
                lancto = await RetornaDoctoELancto('LANCTO', 'PA_MOV', 'NUM_DOCTO', '6');
                insereValor('#txtDocumento', docto);
                insereValor('#txtLancamento', lancto);
                $(this).attr('disabled', $(this).val() != '');
            } else {
                lancto = await RetornaDoctoELancto('LANCTO', 'PA_MOV', 'NUM_DOCTO', '6');
                insereValor('#txtLancamento', lancto);
            }
        } finally {
            $.LoadingOverlay("hide");
        }
    });


    $('#txtBarra').on('blur', async function () {
        if ($('#txtBarra').val() == '') {
            return;
        }

        let validator = $("#msform").validate();
        validator.form();
        let erros = 0;
        erros = validator.numberOfInvalids();
        if (erros != 0) {
            $('#txtBarra').val('');
            $('#txtBarra').focus();
            return;
        }

        if (!($('#txtQuantidade').val() > 0)) {
            msgAlerta('Quantidade inválida, favor verificar!');
            return;
        }
        if ($('#txtLote').val() == '') {
            msgAlerta('Lote inválido, favor verificar!');
            return;
        }
        let dadosProd = typeof (await retornaDadosBarra($(this).val()))[0] === 'undefined' ? null : (await retornaDadosBarra($(this).val()))[0];
        if (dadosProd == null) {
            msgAlerta('Nenhum dado para esta barra!');
            $('#txtBarra').val('');
            $('#txtBarra').focus();
            return;
        }

        $('#tabela-movimentados').DataTable().rows().data().map((item, index) => {
            if ((dadosProd.CODIGO == item[0]) && (dadosProd.COR == item[2]) && (dadosProd.TAM == item[3]) && ($('#txtLote').val() == item[6])) {
                let qtde = parseFloat(item[4]) + parseFloat($('#txtQuantidade').val());
                $('#txtQuantidade').val(qtde);
                $('#tabela-movimentados').DataTable().rows(index).remove().draw();
            }
            return 'ok';
        });

        $('#tabela-movimentados').DataTable().row.add([
            dadosProd.CODIGO,
            dadosProd.DESCRICAO,
            dadosProd.COR,
            dadosProd.TAM,
            $('#txtQuantidade').val(),
            dadosProd.CUSTO,
            $('#txtLote').val(),
            retornaBotaoOpcoes()
        ]).draw(false);

        $('#tabela-movimentados tbody tr:last-child').trigger('click');
        let $scrollBody = $($('#tabela-movimentados').DataTable().table().node()).parent();
        $scrollBody.scrollTop($scrollBody.get(0).scrollHeight);

        validaEBloqueiaCampos();
        await VerificaQuantidadeBipada();  

        $('#txtBarra').val('');
        $('#txtQuantidade').val('1');
        $('#txtBarra').focus();
    });

    $('#tabela-movimentados tbody').on('click', 'tr', function() {
        const tabelamovimentados = $('#tabela-movimentados').DataTable();
        tabelamovimentados.$('tr.selected').removeClass('selected');
        $(this).addClass('selected');
    });

    $('#confirmar_mov').on('click', async function () {

        let validator = $("#msform").validate();
        validator.form();
        let erros = 0;
        erros = validator.numberOfInvalids();

        if (erros != 0) {
            return;
        }
        if ($('#tabela-movimentados').DataTable().rows().count() == 0) {
            msgAlerta('Nenhum produto bipado, favor verificar.');
            return;
        }

        let arrEstoque = [];
        $('#tabela-movimentados').DataTable()
            .rows()
            .data()
            .each(async function (value) {
                arrEstoque.push(montaJsonEstoque(value[0], value[2], value[3], value[4], value[5], value[6]));
            });

        try {
            $.LoadingOverlay("show");
            for (let index = 0; index < arrEstoque.length; index++) {
                const element = arrEstoque[index];
                await gravarMovimentacao(element);
            }

            $('#btnImprimir').trigger('click');
            toastr.success("Movimentação realizada com sucesso!", "Confirmação", {
                toastClass: "alert",
                iconClasses: {
                    error: "alert-error",
                    info: "alert-info",
                    success: "alert-success",
                    warning: "alert-warning",
                },
                positionClass: "toast-top-center",
                progressBar: true,
                timeOut: 3000,
                fadeOut: 1000,
                onHidden() {
                    window.location.reload();
                },
            }).css({
                "margin-top": "20%",
                "width": "500px",
                "max-width": "500px",
            });
        } finally {
            $.LoadingOverlay("hide");
        }
    });

    async function VerificaQuantidadeBipada() {
        let QuantidadeBipada = 0;
        const tabela = $('#tabela-movimentados').DataTable().data();
        for (let i = 0; i < tabela.length; i++) {
            QuantidadeBipada = parseFloat(QuantidadeBipada) + parseFloat(tabela.row(i).data()[4]);
        }
        $('#txtQuantidadeBipada').val(QuantidadeBipada);
    }

    $('#msform').validate({
        ignore: "",
        rules: {
            txtDocumento: {
                required: true,
            },
            txtTipoSaida: {
                required: true,
            },
            txtQualidade: {
                required: true,
            },
            txtDeposito: {
                required: true,
            }
        },
        messages: {
            txtDocumento: {
                required: "Gere um documento para continuar."
            },
            txtTipoSaida: {
                required: "Informe um tipo de entrada."
            },
            txtQualidade: {
                required: "Informe uma qualidade."
            },
            txtDeposito: {
                required: "Informe um depósito."
            }
        },
        errorElement: 'span',
        errorPlacement(error, element) {
            error.addClass('invalid-feedback');
            element.closest('.form-group').append(error);
        },
        highlight(element) {
            $(element).addClass('is-invalid');
        },
        unhighlight(element) {
            $(element).removeClass('is-invalid');
        }
    });

    function validaEBloqueiaCampos() {
        let bTabela = $('#tabela-movimentados').DataTable().rows().count() > 0;
        $('#txtDocumento').prop('disabled', bTabela);
        $('#txtTipoSaida').prop('disabled', bTabela);
        $('#txtQualidade').prop('disabled', bTabela);
        $('#txtDeposito').prop('disabled', bTabela);
        $('#btnTipoSaida').prop('disabled', bTabela);
        $('#btnLimpaTipoSaida').prop('disabled', bTabela);
        $('#btnQualidade').prop('disabled', bTabela);
        $('#btnLimpaQualidade').prop('disabled', bTabela);
        $('#btnDeposito').prop('disabled', bTabela);
        $('#btnLimpaDeposito').prop('disabled', bTabela);
    }

    function montaJsonEstoque(codigo, cor, tam, qtde, custo, lote) {
        let EstProd = {
            codigo,
            cor,
            tamanho: tam,
            deposito: $('#txtDeposito').attr('data-chave'),
            quantidade: qtde,
            documento: $('#txtDocumento').val(),
            custo,
            qualidade: $('#txtQualidade').attr('data-chave'),
            lote,
            unidade: '',
            cliente: '',
            descricao: '',
            tipobaixa: $('#txtTipoSaida').attr('data-chave'),
            tipo: 'MN',
            observacao: ''
        };
        return EstProd;
    }

    async function gravarMovimentacao(EstProd) {
        try {
            let sLancto = $('#txtLancamento').val();

            let response = await requisicao(pagar = 'POST', '/Sisplan/Estoque/V1/MovimentaEstoque?', '', `JSON=${encodeURIComponent(JSON.stringify(EstProd))}&LANCTO=${sLancto}&TIPO=SAIDA`);

            if (!response) {
                return;
            }

            if (response.status != 200) {
                msgErro(`Erro API:${jsonStr.RESULT[0].mensagem}`);
                return;
            }
        } catch (error) {
            console.error(error);
            msgErro(`Não foi possível gravar os dados do Estoque: ${error}`);

        }
    }

    async function retornaDadosBarra(sBarra) {
        let url = `/sisplan/funcoes/v1/pesquisa?`;
        let params = `JSON={"tabela":"PA_ITEN", "camposSelect":[ "PA_ITEN.CODIGO", "PRODUTO.DESCRICAO", "PA_ITEN.COR", "PA_ITEN.TAM", "PRODUTO.CUSTO"],
        "innerjoin": [{ "tabela" : "PRODUTO", "condicao" : "PA_ITEN.CODIGO = PRODUTO.CODIGO" }],
        "where": ["PA_ITEN.BARRA = '${sBarra}' OR PA_ITEN.BARRA28 = '${sBarra}' OR PA_ITEN.BARRACLI = '${sBarra}'"]}`;

        try {
            let response = await requisicao('GET', url, params, null);
            if (!response) {
                return '';
            }
            let jsonStr = await response.json();
            if (response.status != 200) {
                msgErro(jsonStr.RESULT[0].mensagem);
                return '';
            }

            return jsonStr.RESULT[0];

        } catch (error) {
            console.error(error);
            msgErro('Não foi possível buscar os dados da venda.');
            return '';
        }
    }

    function retornaBotaoOpcoes() {
        return '<div class="divBtnOpcoes"> ' +
            '    <button class="botaoOpcoes btn-excluir" type="button"><span class="fas fa-trash-alt" style="color:red"></span></button>  ' +
            '   </div>';            
    }

    $("#btnImprimir").on("click", async function () {
        ImprimirRelatorio();
    });

    async function ImprimirRelatorio() {
        let dadosBackEnd = {};
        let arrayTransferencia = [];
        const Dados = $('#tabela-movimentados').DataTable().rows().data();
        Dados.each((campo => {
            dadosBackEnd = {
                CODIGO: campo[0],
                DESCRICAO: campo[1],
                COR: campo[2],
                TAM: campo[3],
                QTDE: parseFloat(campo[4]),
                PRECOSPED: parseFloat(campo[5]),
                LOTE: campo[6]
            };
            arrayTransferencia.push(dadosBackEnd);
        }));
        console.log(arrayTransferencia);
        const url = `/sisplan/impressao/v1/imprimirsaidaporbarra?`;
        const documento = $('#txtDocumento').val();
        const params = `JSON=${JSON.stringify(arrayTransferencia)}&DOCUMENTO=${documento}`;
        const response = await requisicao('GET', url, params, null);
        const arquivo = await response.text();

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

});