$('#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: '#btnFiltros',
                popover: {
                    title: 'Botão Filtros',
                    description: 'Clique aqui para filtrar a consulta das notas.',
                    position: 'right'
                }
            },
            {
                element: '#btn-novoPagar',
                popover: {
                    title: 'Botão Incluir',
                    description: 'Clique aqui para dar entrada em uma nota fiscal.',
                    position: 'right'
                }
            },
            {
                element: '#tabelaEntradaNF_wrapper',
                popover: {
                    title: 'Tabela NFs',
                    description: 'Aqui estão as notas fiscais.',
                    position: 'top'
                }
            }
        ]);
        driver.start();
    });
});


$(document).ready(async function () {
    const permissaoUsuarioLogado = await permissaoAcessos("ENTRADA_NF");

    const dataSetCols = [
        { title: 'Fatura', data: 'NOTA' },
        { title: 'Série', data: 'SERIE' },
        { title: 'Codcli', data: 'CODCLI' },
        { title: 'Nome', data: 'NOME' },
        { title: 'Emissão', data: 'DT_EMISSAO' },
        { title: 'Valor', data: 'VALOR' },
        { title: 'Chave', data: 'CHAVE_NFE' },
        { title: 'Operação', data: 'OPERACAO' },
        { title: 'Tipo doc.', data: 'TIPO_DOC' },
    ];
    criaDataTablePadrao('#tabelaNfRef', false, false, true, false, true, '300px', '300px', [], dataSetCols, [], [4], [5]);

    setTimeout(() => {
        $('#tabelaNfRef').DataTable().columns.adjust().draw(false);
    }, 500);

    $('#txtNotaFiscalPesquisa').pesquisa_variosServerside(1, `{"tabela":"NOTA_ENTRA", 
                                                       "camposSelect":[ "NOTA_ENTRA.NOTAFISCAL", "ENTIDADE.NOME"], 
                                                       "leftJoin": [{"tabela": "ENTIDADE", "condicao": "NOTA_ENTRA.CREDOR = ENTIDADE.CODCLI"}], 
                                                       "where": ["NOTA_ENTRA.EMP_ID = '${getCookie('emp_id')}'"]}`, 'NOTAFISCAL', 'NOME');

    $('#txtFornecedorPesquisa').pesquisa_variosServerside(1, `{"tabela":"ENTIDADE", "camposSelect":[ "CODCLI", "NOME"], "where": ["ATIVO = 'S'"]}`, 'CODCLI', 'NOME');

    $('#txtProdutoPesquisa').pesquisa_variosServerside(1, `{"tabela":"PRODUTO", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": []}`, 'CODIGO', 'DESCRICAO');

    $('#txtMaterialPesquisa').pesquisa_variosServerside(1, `{"tabela":"Material", "camposSelect":[ "CODIGO", "DESCRICAO"], "where": []}`, 'CODIGO', 'DESCRICAO');
    $('#btnMaterialPesquisa').pesquisa_serversideSel('#txtMaterialPesquisa', `{"tabela": "Material",
        "camposSelect": ["CODIGO", "DESCRICAO"], 
        "where": []}`,
        'Pesquisa de Material');
    $('#btnLimpaMaterialPesquisa').on('click', function () {
        $('#txtMaterialPesquisa').empty().trigger('change')
    });

    $('#btnNotaFiscalPesquisa').pesquisa_serversideSel('#txtNotaFiscalPesquisa', `{"tabela": "NOTA_ENTRA",
          "camposSelect": ["NOTA_ENTRA.NOTAFISCAL", "NOTA_ENTRA.SERIE", "NOTA_ENTRA.CREDOR", "ENTIDADE.NOME", "NOTA_ENTRA.EMP_ID"], 
          "leftJoin": [{"tabela": "ENTIDADE", "condicao": "NOTA_ENTRA.CREDOR = ENTIDADE.CODCLI"}], 
          "where": ["NOTA_ENTRA.EMP_ID='${getCookie('emp_id')}'"]}`, 'Pesquisa Notas de Entrada');

    $('#btnFornecedorPesquisa').pesquisa_serversideSel('#txtFornecedorPesquisa', `{"tabela": "ENTIDADE",
          "camposSelect": ["CODCLI", "NOME"], 
          "where": ["ATIVO = 'S'"]}`,
        'Pesquisa de Fornecedor');

    $('#btnProdutoPesquisa').pesquisa_serversideSel('#txtProdutoPesquisa', `{"tabela": "PRODUTO",
          "camposSelect": ["CODIGO", "DESCRICAO"], 
          "where": []}`,
        'Pesquisa de Produto');

    $('#btnLimpaNotaFiscalPesquisa').on('click', function () {
        $('#txtNotaFiscalPesquisa').empty().trigger('change')
    });

    $('#btnLimpaFornecedorPesquisa').on('click', function () {
        $('#txtFornecedorPesquisa').empty().trigger('change')
    });

    $('#btnLimpaProdutoPesquisa').on('click', function () {
        $('#txtProdutoPesquisa').empty().trigger('change')
    });

    $('#btnLimparFiltros').on('click', async function () {
        $('#txtNotaFiscalPesquisa').empty().trigger('change');
        $('#txtFornecedorPesquisa').empty().trigger('change');
        $('#txtProdutoPesquisa').empty().trigger('change');
        $('#txtDataEmissaoDe').val('1200-01-01');
        $('#txtDataEmissaoAte').val('2500-12-01');
        $('#txtDataEntradaDe').val('1200-01-01');
        $('#txtDataEntradaAte').val('2500-12-01');
    });

    $('#btnFiltros').on('click', function () {
        $('#modal-filtros').modal('show');
    });

    $('#btn-novoPagar').on('click', function () {
        if (permissaoUsuarioLogado.INCLUI == 'S') {
            window.location.href = "entrada_nf/create";
        } else {
            msgAlertaSemConfirmacao("Sem permissão para incluir!");
        }
    });

    $('#tabelaPrincipal').dblclick('tr', async function () {
        $('#modal-movimentacao').modal('show');
    });

    const FormatoDtNovo = 'DD/MM/YYYY';

    async function buscaNota() {
        let urlRequisicao = `/sisplan/entradanf/v1/EntradaNF?`;
        let notafiscal = await formataListas($('#txtNotaFiscalPesquisa').val().toString());
        let credor = await formataListas($('#txtFornecedorPesquisa').val().toString());
        let produto = await formataListas([...$('#txtProdutoPesquisa').val(), ...$('#txtMaterialPesquisa').val()].toString());
        let dtemissaode = $('#txtDataEmissaoDe').val();
        let dtemissaoate = $('#txtDataEmissaoAte').val();
        let dtentradade = $('#txtDataEntradaDe').val();
        let dtentradaate = $('#txtDataEntradaAte').val();
        let paramsRequisicao = `DT_EMISSAOI=${dtemissaode}&DT_EMISSAOF=${dtemissaoate}&DT_ENTRADAI=${dtentradade}&DT_ENTRADAF=${dtentradaate}&NOTAFISCAL=${notafiscal}&FORNECEDOR=${credor}&CODIGO=${produto}`;

        try {
            let response = await requisicao('GET', urlRequisicao, paramsRequisicao, null, 10000);

            if (!response) {
                return;
            }

            if (response.status != 200) {
                msgErro(jsonStr.RESULT[0].mensagem);
                return;
            }

            let jsonStr = await response.json();
            return jsonStr;
        } catch (error) {
            console.error(error);
            msgErro('Não foi possível buscar os dados.');
        }
    }

    function retornaBotaoOpcoes(data) {
        let retorno = '<div style="text-align:left;"> ' +
            '   <div class="dropdown"> ' +
            '    <button class="btn btn-info btn-sm dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> ' +
            '      ' + data + ' ' +
            '    </button> ' +
            '    <div class="dropdown-menu" style="min-width: 2rem;"> ' +
            '    <a id="btn-editar" class="dropdown-item" href="#">Editar</a>' +
            '    <a id="btn-excluir" class="dropdown-item" href="#">Excluir</a>' +
            `    <a id="btn-imprimir" ${getCookie('cod_usuario') == '0000' ? 'title="Este botão chama o Layout EntradaNF.FR3"' : 'title="Imprimir"'} class="dropdown-item" href="#">Imprimir</a>` +
            '    </div>' +
            '  </div>' +
            '</div>';

        return retorno
    };

    $('#tabelaEntradaNF').on('click', 'td', function () {
        selecionarLinhaTabela('#tabelaEntradaNF', 'checkEntrada', this);
    });

    $('#btnConsultar').on('click', async function () {
        try {
            $.LoadingOverlay('show');
            try {
                let jsonStr = await buscaNota();

                for (let i = 0; i < jsonStr.length; i++) {
                    jsonStr[i].DT_ORDENACAO = jsonStr[i].DT_EMISSAO.replaceAll('-', '');
                }

                let table = $('#tabelaEntradaNF').DataTable({
                    destroy: true,
                    colReorder: true,
                    "order": [[0, "desc"]],
                    "autoWidth": true,
                    "data": jsonStr,
                    "columns": [
                        {
                            "data": 'DT_ORDENACAO'
                        },
                        {
                            "data": 'NOTAFISCAL'
                        },
                        {
                            "data": 'CREDOR'
                        },
                        {
                            "data": 'NOME'
                        },
                        {
                            "data": 'DT_EMISSAO'
                        },
                        {
                            "data": 'DT_ENTRADA'
                        },
                        {
                            "data": 'SERIE'
                        },
                        {
                            "data": 'TIPO'
                        },
                        {
                            "data": 'LANCAMENTO'
                        },
                    ],
                    "columnDefs": [
                        {
                            "visible": false,
                            "targets": 0
                        },
                        {
                            "type": 'date-br',
                            "render": function (data) {
                                return new Intl.DateTimeFormat('pt-BR').format(new Date(`${data.split(' ')[0]} 23:59:59`));
                            },
                            "targets": 4,
                        },
                        {
                            "type": 'date-br',
                            "render": function (data) {
                                return new Intl.DateTimeFormat('pt-BR').format(new Date(`${data.split(' ')[0]} 23:59:59`));
                            },
                            "targets": 5,
                        },
                        // {
                        //     "render": $.fn.dataTable.render.moment(FormatoDtNovo),
                        //     "targets": 4,
                        // },
                        // {
                        //     "render": $.fn.dataTable.render.moment(FormatoDtNovo),
                        //     "targets": 5,
                        // },
                        {
                            targets: [1], render: function (data, type, row) {
                                return retornaBotaoOpcoes(data);
                            }
                        }
                    ]
                });

                $('#tabelaEntradaNF').on('click', '#btn-editar', async function () {
                    if (permissaoUsuarioLogado.ALTERA == 'S') {
                        try {
                            let data = table.row($(this).parents('tr')).data();

                            let response = await requisicao('GET', '/sisplan/funcoes/v1/pesquisa?', `JSON={ 
                        "tabela":"pagto", 
                        "camposSelect":["pagto.num_ap"], 
                        "innerJoin": [{"tabela": "pagto1", 
                        "condicao": "(pagto1.num_ap = pagto.num_ap) and (pagto1.docto = pagto.dupli)"}], 
                        "where": ["pagto.lancamento = ${data.LANCAMENTO}"], "limit": 10000}`, null);

                            if (!response) {
                                $.LoadingOverlay("hide");
                                return;
                            }

                            let jsonString = await response.json();
                            if (response.status != 200) {
                                $.LoadingOverlay("hide");
                                msgErro(jsonString.RESULT[0].mensagem);
                                return;
                            }

                            if (jsonString.RESULT[0].length == 0) {
                                nota = {};
                                nota.NOTAFISCAL = data.NOTAFISCAL;
                                nota.TIPO = data.TIPO;
                                nota.SERIE = data.SERIE;
                                nota.CREDOR = data.CREDOR;

                                window.location.href = `entrada_nf/${btoa(JSON.stringify(nota))}`;
                            } else {
                                msgAlerta('Duplicatas desta nota contém baixas, caso necessária alteração, favor estornar baixas.');
                            }
                        } catch (error) {
                            console.error(error);
                        }

                    } else {
                        msgAlertaSemConfirmacao("Sem permissão para alterar!");
                    }
                });

                $('#tabelaEntradaNF tbody').on('click', 'tr', async function (e) {
                    if ($('#tabelaEntradaNF').DataTable().data().length > 0) {
                        $('#tabelaEntradaNF').DataTable().$('tr.selected').removeClass('selected');
                        $(this).addClass('selected');
                        const dados = $('#tabelaEntradaNF').DataTable().row($(this)).data();
                        await carregaGrids(dados);
                    }
                });

                $('#tabelaEntradaNF_length').prepend('<button class="buttonColVis" id="buttonColVis"><i class="fas fa-cogs"></i></button>');
                $('#tabelaEntradaNF_length').prepend('<button class="buttonExcel" id="buttonExcel"><i class="fas fa-file-excel"></i></button>');

                $('#buttonColVis').on('click', async function () {
                    $.LoadingOverlay('show');
                    $('#modal-ColunasVisiveis').modal('show');
                    $.LoadingOverlay('hide');
                });

                $('#buttonExcel').on('click', async function () {
                    const dados = $("#tabelaEntradaNF").DataTable().data().toArray();
                    await exportaCSV("", "", undefined, null, 'Notas de Entrada', '#tabelaEntradaNF', '', 999, false, false, dados);
                });

                $($('#tabelaEntradaNF tr')[0]).trigger('click');

            } catch (error) {
                console.error(error);
            }

        } finally {
            $('#modal-filtros').modal('hide');
            $.LoadingOverlay('hide');
        }
    });

    let colunas = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));

    if (colunas == null || colunas.entradaNF == undefined) {
        localStorage.setItem('colunasInvisiveisRelatorios', JSON.stringify({ ...colunas, entradaNF: [] }));
        colunas = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));
    }

    $('#modal-ColunasVisiveis').on('show.bs.modal', function () {
        const cols = [];

        let colunasInvisiveis = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'))

        $('#tabelaEntradaNF').DataTable().columns().every(function () {
            cols.push({
                'title': $(this.header()).text(),
                'data': this.dataSrc()
            })
        });

        adicionaColunas(cols, colunasInvisiveis.entradaNF ?? [])
    });

    $('#btnConfirmarColunas').on('click', async function () {
        try {
            $.LoadingOverlay('show');

            const novasColunas = retornaNovasColunasInvisiveis();
            localStorage.setItem('colunasInvisiveisRelatorios', JSON.stringify({ ...colunas, entradaNF: novasColunas }))

            $('#tabelaEntradaNF').DataTable().columns().visible(true);

            $('#tabelaEntradaNF').DataTable().columns().every(
                function () {
                    if ((novasColunas).indexOf(this.dataSrc()) != -1) {
                        this.visible(false);
                    }
                })

        } finally {
            $.LoadingOverlay('hide');
            $('#modal-ColunasVisiveis').modal('hide');
        }
    });

    $('#tabelaEntradaNF').on('click', '#btn-excluir', async function () {
        if (permissaoUsuarioLogado.EXCLUI == 'S') {
            try {
                $.LoadingOverlay('show');
                let table = $('#tabelaEntradaNF').DataTable();
                let data = table.row($(this).parents('tr')).data();
                data.EXCLUSAO = true;
                try {
                    let response = await requisicao('DELETE', '/Sisplan/EntradaNF/v1/EntradaNF?', `JSON=${encodeURIComponent(JSON.stringify(data))}&CHAVE_NFE=${data.CHAVE_NFE}`, null);

                    if (!response) {
                        return;
                    }

                    let jsonStr = await response.json();

                    if (response.status == 502) {
                        await msgAguardaConfirmacao(jsonStr.mensagem, () => { }, () => { }, false, true, "Continuar");
                    } else if (response.status != 200) {
                        msgErro(jsonStr.mensagem);
                        return;
                    }

                    toastr.success(
                        'Nota Fiscal excluida 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
                    }
                    ).css({
                        "margin-top": "20%",
                        "width": "500px",
                        "max-width": "500px"
                    });
                } catch (error) {
                    console.error(error);
                    msgErro(`Erro ao excluir o registro.${error}`);
                }
            } finally {
                $.LoadingOverlay('hide');
                $('#btnConsultar').trigger('click');
            }
        } else {
            msgAlertaSemConfirmacao("Sem permissão para excluir!");
        }
    });

    $('#tabelaEntradaNF').on('click', '#btn-imprimir', async function () {
        try {
            $.LoadingOverlay('show');
            try {
                const data = $('#tabelaEntradaNF').DataTable().row($(this).parents('tr')).data();
                const lancamentoNF = data.LANCAMENTO;
                const serieNF = data.SERIE;
                const credorNF = data.CREDOR;
                const notafiscalNF = data.NOTAFISCAL;
                const dt_emissaoNF = data.DT_EMISSAO;
                const dt_entradaNF = data.DT_ENTRADA;
                let paramsRequisicao = `LANCAMENTO=${lancamentoNF}&SERIE=${serieNF}&DT_EMISSAO=${dt_emissaoNF}&DT_ENTRADA=${dt_entradaNF}&NOTAFISCAL=${notafiscalNF}&CREDOR=${credorNF}`;
                const url = `/sisplan/impressao/v1/entradanfe?${paramsRequisicao}`;
                const bImprimeAutomatico = await verificaImprimirAutomatico('EntradaNF');
                const arquivo = await GeraRelatorio(`${url}`, "GET", 100000, false, '');
                if (arquivo != undefined) {
                    if (!bImprimeAutomatico) {
                        window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, "_blank");
                    }
                    await limparRelatorios();
                }
            } catch (error) {
                console.error(error);
            }
        } catch (error) {
            console.error(error);
        } finally {
            $.LoadingOverlay('hide');
        }
    });

    async function carregaGrids(dados) {
        $.LoadingOverlay('show');
        try {
            const response = await requisicao('GET', '/Sisplan/EntradaNF/V1/RetornaDados?', `JSON=${encodeURIComponent(JSON.stringify(dados))}`, null);

            if (!response) {
                return;
            }

            const jsonStr = await response.json();

            criaTbItens(jsonStr.itens);
            await buscaNotasReferenciadas(dados.NOTAFISCAL, dados.CREDOR, dados.SERIE, dados.TIPO);
        } catch (error) {
            $.LoadingOverlay('hide');
            console.error(error);
        } finally {
            $.LoadingOverlay('hide');
        }
    }

    function criaTbItens(itens) {
        if (!itens) {
            return;
        };

        const dataSetCols = [
            { title: 'Código', data: 'codigo' },
            { title: 'Descrição', data: 'descricao' },
            { title: 'Cor', data: 'cor' },
            { title: 'Desc. cor', data: 'desc_cor' },
            { title: 'Tamanho', data: 'tam' },
            { title: 'Quantidade', data: 'qtde' },
            { title: 'Valor', data: 'valor' },
            { title: 'Total', data: 'total' },
            { title: 'Valor ICMS', data: 'vlr_icms' },
        ];
        criaDataTablePadrao('#tabelaItens', false, false, true, false, true, '300px', '300px', itens, dataSetCols, [], [], [], [6, 7, 8]);
    }

    function criaTbNotasRef(notasref) {
        if (!notasref) {
            $('#tabelaNfRef').empty();
            setTimeout(() => {
                $('#tabelaNfRef').DataTable().columns.adjust().draw(false);
            }, 500);
            return;
        };

        const dataSetCols = [
            { title: 'Fatura', data: 'NOTA' },
            { title: 'Série', data: 'SERIE' },
            { title: 'Codcli', data: 'CODCLI' },
            { title: 'Nome', data: 'NOME' },
            { title: 'Emissão', data: 'DT_EMISSAO' },
            { title: 'Valor', data: 'VALOR' },
            { title: 'Chave', data: 'CHAVE_NFE' },
            // { title: 'Emitente', data: 'EMITENTE' },
            { title: 'Operação', data: 'OPERACAO' },
            { title: 'Tipo doc.', data: 'TIPO_DOC' },
            // { title: 'Código ref.', data: 'COD_REF' },
        ];

        criaDataTablePadrao('#tabelaNfRef', false, false, true, false, true, '300px', '300px', notasref, dataSetCols, [], [4], [], [5]);
    }

    async function buscaNotasReferenciadas(nota, codcli, serie, tipo_fiscal) {
        $.LoadingOverlay('show');
        try {
            const pesquisa = {
                tabela: 'NOTA_REF',
                camposSelect: [
                    'NOTA_REF.NOTA_REF NOTA', 'NOTA_REF.SERIE_REF SERIE', 'NOTA_REF.CODCLI_REF CODCLI', 'ENTIDADE.NOME',
                    'NOTA_REF.DATA_REF DT_EMISSAO', 'NOTA_REF.VALOR', 'NOTA_REF.CHAVE_NFE',
                    'NOTA_REF.IND_OPER OPERACAO', 'NOTA_REF.TIPO_FISCAL_REF TIPO_DOC'
                    // , 'NOTA_REF.COD_REF', 'NOTA_REF.IND_EMIT EMITENTE'
                ],
                leftJoin: [{ tabela: 'ENTIDADE', condicao: 'ENTIDADE.CODCLI = NOTA_REF.CODCLI_REF' }],
                where: [`NOTA_REF.CODCLI = '${codcli}' AND NOTA_REF.SERIE = '${serie}' AND NOTA_REF.NOTA = '${nota}' AND NOTA_REF.TIPO_FISCAL = '${tipo_fiscal}'`],
            };

            const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa));

            criaTbNotasRef(jsonStr);
        } catch (e) {
            console.log(e);
            msgErro(`Não foi possível buscar os dados: ${e}`);
        } finally {
            $.LoadingOverlay('hide');
        }
    }

    retornaHintRelatorio('btnImprimeAcessoNfe', 'relAcessoEntradaNfe')

    $('#btnImprimeAcessoNfe').on('click', async function () {
        try {
            $.LoadingOverlay("show");
            try {
                let notafiscal = await formataListas($('#txtNotaFiscalPesquisa').val().toString());
                let credor = await formataListas($('#txtFornecedorPesquisa').val().toString());
                let produto = await formataListas([...$('#txtProdutoPesquisa').val(), ...$('#txtMaterialPesquisa').val()].toString());
                let dtemissaode = $('#txtDataEmissaoDe').val();
                let dtemissaoate = $('#txtDataEmissaoAte').val();
                let dtentradade = $('#txtDataEntradaDe').val();
                let dtentradaate = $('#txtDataEntradaAte').val();
                let paramsRequisicao = `DT_EMISSAOI=${dtemissaode}&DT_EMISSAOF=${dtemissaoate}&DT_ENTRADAI=${dtentradade}&DT_ENTRADAF=${dtentradaate}&NOTAFISCAL=${notafiscal}&FORNECEDOR=${credor}&CODIGO=${produto}`;
                const url = `/sisplan/impressao/v1/imprimirrelacessoentradanfe?${paramsRequisicao}`;
                const bImprimeAutomatico = await verificaImprimirAutomatico('relAcessoEntradaNfe');
                const arquivo = await GeraRelatorio(`${url}`, "GET", 100000, false, 'relAcessoEntradaNfe');
                if (arquivo != undefined) {
                    if (!bImprimeAutomatico) {
                        window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, "_blank");
                    }
                    await limparRelatorios();
                }
            } catch (error) {
                console.error(error);
            }
        } finally {
            $.LoadingOverlay("hide");
        }
    });

    $('#btnConsultar').trigger('click');
});