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

// #region Definições Padrões

    const colunasTabelaProduto = [
        {  
            data: 'SEL', 
            title: `<div class="icheck-primary d-inline">
                <input type="checkbox" id="selecionaTudo" class="checkSel">
                <label for="selecionaTudo"></label>
            </div>` 
        },
        { data: 'BARRA', title: 'Barra' },
        { data: 'CEST', title: 'Cest' },
        { data: 'CODIGO', title: 'Código' },
        { data: 'DESCRICAO', title: 'Descrição' },
        { data: 'DATA_CAD', title: 'Data Cad.' },
        { data: 'COR', title: 'Cor' },
        { data: 'DESC_COR', title: 'Desc. Cor' },
        { data: 'TAM', title: 'Tam' },
        { data: 'MARCA', title: 'Marca' },
        { data: 'DESC_MARCA', title: 'Desc. Marca' },
        { data: 'ETIQUETA', title: 'Etiqueta' },
        { data: 'DESC_ETIQUETA', title: 'Desc. Etiqueta' },
        { data: 'GS1_OK', title: 'GS1 OK' },
        { data: 'GS1_OK_DATA', title: 'Dados GS1 OK' },
        { data: 'NCM', title: 'NCM' },
        { data: 'PESO', title: 'Peso' },
        { data: 'UNIDADE', title: 'Unidade' },
    ]

    const colunasTabelaResultado = [
        { data: 'BARRA', title: 'Barra' },
        { data: 'CODIGO', title: 'Código' },
        { data: 'COR', title: 'Cor' },
        { data: 'TAM', title: 'Tam' },
        { data: 'STATUS', title: 'Status' },
    ]

    $('#txtProduto').autocompleta(1, `JSON={ "tabela":"PRODUTO", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnProduto').pesquisa('#txtProduto', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"PRODUTO", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Produto", "PRODUTO");
    $('#btnLimpaProduto').on('click', function () { $('#txtProduto').val(''); });

    $('#txtColecao').autocompleta(1, `JSON={ "tabela":"COLECAO", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnColecao').pesquisa('#txtColecao', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"COLECAO", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Coleção", "COLECAO");
    $('#btnLimpaColecao').on('click', function () { $('#txtColecao').val(''); });

    $('#txtMarca').autocompleta(1, `JSON={ "tabela":"MARCA", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnMarca').pesquisa('#txtMarca', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"MARCA", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Marca", "MARCA");
    $('#btnLimpaMarca').on('click', function () { $('#txtMarca').val(''); });

    $('#txtGrupo').autocompleta(1, `JSON={ "tabela":"GRUPO_PA", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnGrupo').pesquisa('#txtGrupo', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"GRUPO_PA", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Grupo", "GRUPO_PA");
    $('#btnLimpaGrupo').on('click', function () { $('#txtGrupo').val(''); });

    $('#txtLinha').autocompleta(1, `JSON={ "tabela":"TABLIN", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnLinha').pesquisa('#txtLinha', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"TABLIN", "camposSelect":["CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Linha", "LINHA");
    $('#btnLimpaLinha').on('click', function () { $('#txtLinha').val(''); });

    $('#txtCategoria').autocompleta(1, `JSON={ "tabela":"AUXILIAR", "camposSelect":["ID CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnCategoria').pesquisa('#txtCategoria', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"AUXILIAR", "camposSelect":["ID CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Categoria", "AUXILIAR");
    $('#btnLimpaCategoria').on('click', function () { $('#txtCategoria').val(''); });

    $('#txtCor').autocompleta(1, `JSON={ "tabela":"CADCOR", "camposSelect":["COR CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $('#btnCor').pesquisa('#txtCor', "CODIGO", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"CADCOR", "camposSelect":["COR CODIGO", "DESCRICAO"], "where": null}`, "Pesquisa de Cor", "CADCOR");
    $('#btnLimpaCor').on('click', function () { $('#txtCor').val(''); });

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

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

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

    let tabela = ''

    const undf = undefined // só pra abreviar na função e não ficar com linha quebrada.

// #region Funções

    function setTabelaColunas(tab) {
        tabela = tab
    }

    function montaFiltros() {
        return {
            DATA_DE: $('#txtDataCadastroIni').val(),
            DATA_ATE: $('#txtDataCadastroFim').val(),
            CODIGO: pegaChave('#txtProduto'),
            COLECAO: pegaChave('#txtColecao'),
            MARCA: pegaChave('#txtMarca'),
            GRUPO: pegaChave('#txtGrupo'),
            LINHA: pegaChave('#txtLinha'),
            CATEGORIA: pegaChave('#txtCategoria'),
            COR: pegaChave('#txtCor'),
            SOMENTE_ATIVOS: isChecked('#cbProdAtivo') ? 'S' : 'N',
            SOMENTE_CORES_ATIVAS: isChecked('#cbCoresAtivas') ? 'S' : 'N',
            SOMENTE_PROD_SEM_GTIN: isChecked('#cbProdSemGtin') ? 'S' : 'N'
        }
    }

    function populaTabela(dados) {
        if (dados.length > 0) {
            $('#tabelaProdutos').DataTable({
                bPaginate: true,
                destroy: true,
                colReorder: true,
                autoWidth: true,
                scrollX: true,
                scrollY: '45vh',
                pageLength: 15,
                lengthMenu: [
                    [10, 15, 25, 50, 100], 
                    [10, 15, 25, 50, 100]
                ],
                columns: colunasTabelaProduto,
                searching: false,
                data: isChecked('#cbProdSemGtin') ? dados.filter(obj => !obj.barra) : dados,
                columnDefs: [
                    {
                        targets: [0],
                        render(data, type, row, meta) {
                            return `<div class="icheck-primary d-inline">
                                        <input type="checkbox" id="check_col_${meta.row}_row_${meta.col}" class="checkSel">
                                        <label for="check_col_${meta.row}_row_${meta.col}"></label>
                                    </div>`
                        }
                    },
                    {
                        type: 'date-br',
                        targets: [5],
                        render(data) {
                            if (data === '1899-12-30') {
                                return '';
                            } else if (data) {
                                return new Intl.DateTimeFormat('pt-BR').format(new Date(`${data.split(' ')[0]} 23:59:59`));
                            } else {
                                return '';
                            }
                        }
                    },
                ]
            })

            $(document).on('change', '#selecionaTudo', async function () {
                if ($('#selecionaTudo').prop('checked') && dados.length > 250) {
                    await msgAguardaConfirmacao(
                        `Foram encontrados ${dados.length} registros. Esse volume pode causar lentidão no envio para o GS1. Deseja continuar?`,
                        () => { selecionaTudo() },
                        () => { msgAlerta('Envio cancelado!') }
                    )
                } else {
                    selecionaTudo()
                }
            });

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

            $('#buttonColVis').prop('title', 'Configurar colunas visíveis')
            $('#buttonExcel').prop('title', 'Exportar')

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

            $('#buttonExcel').on('click', async function () {
                const dados = $('#tabelaProdutos').DataTable().rows().data().toArray()
                await exportaCSV(undf, undf, false, null, 'Produtos Tabela Integração GS1', '#tabelaProdutos', undf, undf, undf, undf, dados)
            })

            const colunasInvisiveis = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));
            $('#tabelaProdutos').DataTable().columns().visible(true).every(
                function () {
                    if ((colunasInvisiveis.integracaoGS1).indexOf(this.dataSrc()) != -1) {
                        this.visible(false);
                    }
                }
            )
        } else {
            throw new Error('Nenhum registro encontrado.')
        }
    }

    function selecionaTudo() {
        $('#tabelaProdutos').DataTable().rows().nodes().to$().find('.checkSel').prop('checked', $('#selecionaTudo').prop('checked'));
    }

    async function consultar() {
        const filtros = JSON.stringify(montaFiltros())
        const response = await requisicao('GET', '/sisplan/integracaogs1/v1/consultadados?', `FILTROS=${filtros}`)

        if (!response)
            throw new Error('Não foi possível buscar os produtos. Tente novamente mais tarde.')

        const jsonStr = await response.json()

        if (response.status != 200)
            throw new Error(jsonStr.mensagem)

        return jsonStr
    }

    function pegaLinhasSelecionadas() {
        const selecionadas = []
        $('#tabelaProdutos').DataTable().rows().every(function () {
            if ($(this.node()).find('.checkSel').prop('checked')) {
                selecionadas.push(this.data());
            }
        });
        return selecionadas;
    }

    async function populaTabelaResultado(dados) {
        $('#tabelaResultado').DataTable({
            bPaginate: true,
            destroy: true,
            colReorder: true,
            autoWidth: true,
            scrollX: true,
            scrollY: '45vh',
            pageLength: 10,
            columns: colunasTabelaResultado,
            searching: false,
            data: dados,
            columnDefs: [
                {
                    targets: [4],
                    render(data, type, row, meta) {
                        return row.TIPO === 'SUCESSO' 
                            ? `<i class="fas fa-check-circle color-green" title="Sucesso"></i> ${data}` 
                            : `<i class="fas fa-times-circle color-red" title="Erro"></i> ${data}`
                    }
                },
            ]
        })

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

        $('#buttonColVis-resultado').prop('title', 'Configurar colunas visíveis')
        $('#buttonExcel-resultado').prop('title', 'Exportar')

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

        $('#buttonExcel-resultado').on('click', async function () {
            const dados = $('#tabelaResultado').DataTable().rows().data().toArray()
            await exportaCSV(undf, undf, false, null, 'Resultado da Exportação API GS1', '#tabelaResultado', undf, undf, undf, undf, dados)
        })
        
        const colunasInvisiveis = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));
        $('#tabelaResultado').DataTable().columns().visible(true).every(
            function () {
                if ((colunasInvisiveis.integracaoGS1_resultado).indexOf(this.dataSrc()) != -1) {
                    this.visible(false);
                }
            }
        )
    }
    
    function pegaRegistrosComErro() {
        const erros = []
        $('#tabelaResultado').DataTable().rows().every(function () {
            const rowData = this.data();

            if (rowData.TIPO !== 'SUCESSO') {
                erros.push(rowData);
            }
        });
        return erros;
    }

    async function exportar(dados) {
        if (dados.length > 0) {
            const produtos = { atualizar: [], cadastrar: [] }

            dados.forEach((info) => {
                if (info.BARRA) {
                    produtos.atualizar.push({
                        codigo: info.CODIGO,
                        cor: info.COR,
                        tam: info.TAM, 
                        barra: info.BARRA.padStart(14, '0')
                    })
                } else {
                    produtos.cadastrar.push({
                        codigo: info.CODIGO,
                        descricao: info.DESCRICAO,
                        cor: info.COR, 
                        tam: info.TAM,
                        desc_marca: info.DESC_MARCA,
                        cest: info.CEST,
                        ncm: info.NCM
                    })
                }
            })

            if (produtos.atualizar.length > 0) {
                const response = await requisicao('POST', '/sisplan/integracaogs1/v1/atualizar?', undf, JSON.stringify(produtos.atualizar))

                if (!response) 
                    throw new Error('Não foi possível realizar a exportação. Tente novamente mais tarde.')

                const jsonStr = await response.json();

                if (response.status != 200)
                    throw new Error(jsonStr.mensagem)

                var dadosAtualiza = jsonStr
            }

            if (produtos.cadastrar.length > 0) {
                const response = await requisicao('POST', '/sisplan/integracaogs1/v1/cadastrar?', undf, JSON.stringify(produtos.cadastrar))

                if (!response) 
                    throw new Error('Não foi possível realizar a exportação. Tente novamente mais tarde.')

                const jsonStr = await response.json();

                if (response.status != 200)
                    throw new Error(jsonStr.mensagem)

                var dadosCadastro = jsonStr
            }

            return [
                ...dadosAtualiza,
                ...dadosCadastro
            ]
        } else {
            throw new Error('Necessário selecionar pelo menos um registro na tabela.')
        }
    }

    function montaInfosPadroes() {
        return {
            SEGMENTO: $('#txtSegmento').val(),
            FAMILIA: $('#txtFamilia').val(),
            CLASSE: $('#txtClasse').val(),
            SUBCLASSE: $('#txtSubclasse').val(),
            NOMEURL: $('#txtNomeUrl').val(),
            URL: $('#txtUrl').val(),
            TIPOURL: $('#txtTipoUrl').val(),
            MARCA: $('#txtMarca').val(),
            PAISORIGEM: $('#txtPaisOrigem').val(),
            PAISDESTINO: $('#txtPaisDestino').val(),
            UNIDADEPBRUTO: $('#txtUnidadePesoBruto').val(),
            CLIENTID: $('#txtClientId').val(),
            SECRETID: $('#txtSecretId').val(),
            COMPANY: $('#txtCompany').val(),
            USERNAME: $('#txtUsuario').val(),
            PASSWORD: $('#txtSenha').val(),
        }
    }

    async function salvarInfosPadroes(dados) {
        if (dados.CLIENTID && dados.SECRETID && dados.COMPANY && dados.USERNAME && dados.PASSWORD) {
            dados = JSON.stringify(dados)
            const response = await requisicao('POST', '/sisplan/integracaogs1/v1/gravadadospadroes?', `JSON=${dados}`)

            if (!response)
                throw new Error('Não foi possível salvar as informações padrões. Tente novamente mais tarde.')

            const jsonStr = await response.json()

            if (response.status != 200)
                throw new Error(jsonStr.mensagem)
        } else {
            throw new Error('É necessário informar os valores todas informações de autenticação!')
        }
    }

    async function consultarDadosPadroes() {
        const response = await requisicao('GET', '/sisplan/integracaogs1/v1/consultadadospadroes?')

        if (!response)
            throw new Error('Não foi possível buscar as informações padrões. Tente novamente mais tarde.')

        const jsonStr = await response.json()

        if (response.status != 200)
            throw new Error(jsonStr.mensagem)

        return jsonStr
    }

    async function insereValoresPadroes(dados) {
        for (let i = 0; i < dados.length; i++) {
            const deParaCampos = {
                EDTSEGUIMENTOPADRAO: '#txtSegmento',
                EDTFAMILIAPADRAO: '#txtFamilia', 
                EDTCLASSEPADRAO: '#txtClasse', 
                EDTSUBCLASSEPADRAO: '#txtSubclasse', 
                EDTNOMEURLPADRAO: '#txtNomeUrl', 
                EDTURLPADRAO: '#txtUrl', 
                EDTTIPOURLPADRAO: '#txtTipoUrl',
                EDTMARCAPADRAO: '#txtMarca',
                EDTPAISORIGEMPADRAO: '#txtPaisOrigem',
                EDTPAISDESTINOPADRAO: '#txtPaisDestino',
                EDTUNIDADEPBRUTOPADRAO: '#txtUnidadePesoBruto',
                CLIENTID: '#txtClientId',
                SECRETID: '#txtSecretId',
                COMPANY: '#txtCompany',
                USERNAME: '#txtUsuario',
                PASSWORD: '#txtSenha',
            }
            $(deParaCampos[dados[i].DESCRICAO]).val(dados[i].DESCRICAO2)
        }
    }

    async function rotinaExportacao(dados) {
        const dadosExportacao = await exportar(dados)
        if (dadosExportacao.length > 0) {
            $('#modal-resultado').modal('show')
            populaTabelaResultado(dadosExportacao)
        } else {
            throw new Error('Não foi atualizada nenhuma barra. Verifique!')
        }
    }

// #region Eventos

    $('#btnConsultar').on('click', async function () {
        $.LoadingOverlay('show')
        try {
            const dados = await consultar()
            
            if (dados.length > 0) {
                populaTabela(dados)
                $('#btnExportar').prop('disabled', false)
            } else {
                throw new Error('Nenhum registro retornado. Verifique os filtros!')
            }
        } catch (error) {
            msgAlerta(error.message)
            console.error(error)
        } finally {
            $.LoadingOverlay('hide')
        }
    })

    $('#btnExportar').on('click', async function () {
        $.LoadingOverlay('show')
        try {
            const dados = pegaLinhasSelecionadas()
            await rotinaExportacao(dados)
        } catch (error) {
            msgAlerta(error.message)
            console.error(error)
        } finally {
            $.LoadingOverlay('hide')
        }
    })

    $('#btnInformacoes').on('click', async function () {
        if (!$('#txtSegmento').val()) {
            $.LoadingOverlay('show')
            try {
                const dados = await consultarDadosPadroes()
                insereValoresPadroes(dados)
            } catch (error) {
                msgAlerta(error.message)
                console.error(error)
            } finally {
                $.LoadingOverlay('hide')
            }
        }

        $('#modal-infos').modal('show')
    })

    $('#btnSalvarInfoPadrao').on('click', async function () {
        $.LoadingOverlay('show')
        try {
            const dados = montaInfosPadroes()
            await salvarInfosPadroes(dados)
        } catch (error) {
            msgAlerta(error.message)
            console.error(error)
        } finally {
            $.LoadingOverlay('hide')
            $('#modal-infos').modal('hide')
        }
    })

    $('#btnTentarNovamente').on('click', async function () {
        $('#modal-resultado').modal('hide')
        $.LoadingOverlay('show')
        try {
            const dados = pegaRegistrosComErro()
            await rotinaExportacao(dados)
        } catch (error) {
            msgAlerta(error.message)
            console.error(error)
        } finally {
            $.LoadingOverlay('hide')
        }
    })

    $('#btnConfirmaResultado').on('click', function () {
        $('#modal-resultado').modal('hide')
    })

    $('#modal-ColunasVisiveis').on('show.bs.modal', function () {
        const cols = [];
        let colunasInvisiveis = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'))
        const dataTable = tabela === 'PRODUTO' ? '#tabelaProdutos' : '#tabelaResultado'

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

        if (tabela === 'PRODUTO')
            adicionaColunas(cols, colunasInvisiveis.integracaoGS1 ?? [], ['Barra', 'Código', 'GS1 OK'], [''])
        else
            adicionaColunas(cols, colunasInvisiveis.integracaoGS1_resultado ?? [], ['Barra', 'Status'])
    })

    $("#btnConfirmarColunas").on("click", async function () {
        $.LoadingOverlay("show");
        try {
            const novasColunas = retornaNovasColunasInvisiveis();
            const dataTable = tabela === 'PRODUTO' ? '#tabelaProdutos' : '#tabelaResultado'

            if (tabela === 'PRODUTO') {
                localStorage.setItem(
                    "colunasInvisiveisRelatorios",
                    JSON.stringify({
                        ...colunas,
                        integracaoGS1: novasColunas,
                    })
                )
            } else {
                localStorage.setItem(
                    "colunasInvisiveisRelatorios",
                    JSON.stringify({
                        ...colunas,
                        integracaoGS1_resultado: novasColunas,
                    })
                )  
            }

            $(dataTable).DataTable().columns().visible(true).every(
                function () {
                    if ((novasColunas).indexOf(this.dataSrc()) != -1) {
                        this.visible(false);
                    }
                }
            )
        } finally {
            $.LoadingOverlay("hide");
            $("#modal-ColunasVisiveis").modal("hide");
        }
    })
})