$(document).ready(async function () {
  var ultimaColunaOrdenada = {
    nome: '',
    ordenacao: 'ASC'
  };



  $('#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 abrir os filtros e realizar alguma consulta.',
          position: 'right'
        }
      },
      {
        element: '#btnImprimir',
        popover: {
          title: 'Botão Imprimir',
          description: 'Clique aqui para Imprimir um relatório.',
          position: 'right'
        }
      }
      ]);
      driver.start();
    });
  });

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

  // aqui so valida se nao existe tem que criar para nao dar erro
  if (colunas == null || colunas.relEstoque == undefined) {
    localStorage.setItem('colunasInvisiveisRelatorios', JSON.stringify({ ...colunas, relEstoque: [] }));
    colunas = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));
  }

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

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

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

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

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

  let bipandoBarra = false

  await preencheOrdenacaoTela('RelEstoque');

  $('#txtOrdem').val('0');

  // let filtroDeposito = await retornaDepositoUsuario(getCookie('cod_usuario'));

  // if (filtroDeposito = 'null') {
  //   filtroDeposito = await verificaDepositosEmpresaLogada(getCookie('empresa'));
  //   filtroDeposito = filtroDeposito == '' ? 'null' : `["CODIGO IN (${filtroDeposito})"]`;
  // }

  let filtroDeposito = await buscaDepositoEmpresaUsuario();

  const whereDeposito = filtroDeposito != '' ? `"CODIGO IN (${filtroDeposito})"` : [];

  componenteFiltro('produto', true);
  // componenteFiltro('depositoUsuario', true);
  componenteFiltro('colecao', true);
  componenteFiltro('etiqueta', true);
  componenteFiltro('cor', true);
  componenteFiltro('grupoPA', true);
  componenteFiltro('qualidade', true);
  componenteFiltro('tamanho', true, true);
  componenteFiltro('marca', true);
  componenteFiltro('linha', true);
  componenteFiltro('modelo', true);
  componenteFiltro('tipoProduto', true);
  componenteFiltro('tabPreco', false);
  componenteFiltro('fornecedor', true);
  componenteFiltro('composicao', true)
  componenteFiltro('categoriaProd', true, false, 'Categoria')
  //  "where": ["ATIVO = 'S'"]}

  $('#txtDepositoUsuario').pesquisa_variosServerside(1, `{ "tabela": "DEPOSITO", "camposSelect": ["CODIGO", "DESCRICAO", "EMPRESA"], "where": [${whereDeposito}] }`, 'CODIGO', 'DESCRICAO', 'EMPRESA');
  $('#btnDepositoUsuario').pesquisa_serversideSel('#txtDepositoUsuario', `{ "tabela":"DEPOSITO", "camposSelect":[ "CODIGO", "DESCRICAO", "EMPRESA"], "where": [${whereDeposito}]}`, 'Pesquisa Depósito');
  $('#btnLimpaDepositoUsuario').on('click', function () {
    $('#txtDepositoUsuario').empty().trigger('change');
  })

  await carregaValoresPadroes();

  const parametrosVenda = await BuscaParametrosLoja()

  $('#btnFiltros').on('click', async function () {
    $('#modal-filtros').modal('show');
    $('#checkTabPrecoCorTam').prop('checked', parametrosVenda[5].VALOR == 1)
  });


  async function carregaValoresPadroes() {
    const jsonStr = await buscaValoresPadroes('ESTOQUE')

    jsonStr.map(async item => {
      switch (item.CAMPO) {
        case 'DEPOSITO': {
          if (item.VALOR != '') {
            let descricao = await buscaValor('DEPOSITO', 'DESCRICAO', 'CODIGO', item.VALOR);
            descricao = descricao != undefined ? descricao.DESCRICAO : 'VALOR INVÁLIDO';
            adicionaValorPadraoVarios('depositoUsuario', item.VALOR, descricao);
            // var e = jQuery.Event("keypress");
            // e.which = 13;
            // $('#txtDepositoUsuario').trigger(e);
            // $('#listaDeposito').removeClass('d-none');
          }
          break;
        }
        case 'QUALIDADE': {
          if (item.VALOR != '') {
            let descricao = await buscaValor('TABQUL', 'DESCRICAO', 'CODIGO', item.VALOR);
            descricao = descricao != undefined ? descricao.DESCRICAO : 'VALOR INVÁLIDO';
            adicionaValorPadraoVarios('qualidade', item.VALOR, descricao);
          }
          break;
        }
      }
    });
  };

  limparFiltros(true);

  async function retornaFiltros() {
    const tipoItem = 'P';
    const codigo = await formataListas($('#txtProduto').val().toString());
    let deposito = await formataListas($('#txtDepositoUsuario').val().toString());
    const cor = await formataListas($('#txtCor').val().toString());
    const colecao = await formataListas($('#txtColecao').val().toString());
    const grupo = await formataListas($('#txtGrupoPA').val().toString());
    const qualidade = await formataListas($('#txtQualidade').val().toString());
    const contemEstoque = $('#cbContemEstoque').prop('checked');
    const etiqueta = await formataListas($('#txtEtiqueta').val().toString());
    const tamanho = await formataListas($('#txtTamanho').val().toString());
    const marca = await formataListas($('#txtMarca').val().toString());
    const linha = await formataListas($('#txtLinha').val().toString());
    const modelo = await formataListas($('#txtModelo').val().toString());
    const tipoProduto = await formataListas($('#txtTipoProduto').val().toString());
    const consideraDeposito = $('#checkDep').prop('checked');
    const consideraLote = $('#checkLot').prop('checked');
    const descontaReserva = $('#checkRes').prop('checked');
    const descontaExpedicao = $('#checkExp').prop('checked');
    const fornecedor = await formataListas($('#txtFornecedor').val().toString());
    const tabPreco = pegaChave('#txtTabPreco')
    const tipoTabPreco = $('#checkTabPrecoCorTam').prop('checked') ? 'S' : 'N';
    const categoria = await formataListas($('#txtCategoria').val().toString());

    deposito = deposito != ''
      ? deposito : filtroDeposito;
    const filtros = `CODIGO=${codigo}` +
      `&DEPOSITO=${deposito}` +
      `&COR=${cor}` +
      
      `&COLECAO=${colecao}` +
      `&GRUPO=${grupo}` +
      `&QUALIDADE=${qualidade}` +
      `&TIPOITEM=${tipoItem}` +
      `&CONTEMESTOQUE=${contemEstoque}` +
      `&ETIQUETA=${etiqueta}` +
      `&TAMANHO=${tamanho}` +
      `&MARCA=${marca}` +
      `&LINHA=${linha}` +
      `&MODELO=${modelo}` +
      `&CDEPOSITO=${consideraDeposito}` +
      `&TIPOPRODUTO=${tipoProduto}` +
      `&CLOTE=${consideraLote}` +
      `&DRESERVA=${descontaReserva}` +
      `&DEXPEDICAO=${descontaExpedicao}` +
      `&FORNECEDOR=${fornecedor}` +
      `&PRECO_COR_TAM=${tipoTabPreco}` +
      `&CATEGORIA=${categoria}` +
      `&TABPRECO=${tabPreco}`
      ;
    return filtros;
  }

  retornaHintRelatorio('btnImprimir', 'estoque_produtoResumido')

  $('#txtOrdem').on('change', function () {
    retornaHintRelatorio('btnImprimir', $("#txtOrdem option")
      .toArray()
      .map(map => {
        return [map.selected, $(map)
          .attr('nome_prt')]
      })
      .filter(filter => filter[0] == true)[0][1])
  })

  $('#btnImprimir').on('click', async function () {
    try {
      $.LoadingOverlay('show');
      try {
        let url = `/sisplan/impressao/v1/estoque?`;

        const filtros = await retornaFiltros();
        const ordem = `&TELA_ORDENACAO=RelEstoque&ORDEM_ORDENACAO=${$('#txtOrdem').val()}`;
        const bImprimeAutomatico = await verificaImprimirAutomatico('RelEstoque');
        let arquivo = await GeraRelatorio(`${url}${filtros}${ordem}`, 'GET', 1000000, false, 'RelEstoque');
        if (arquivo != undefined) {
          if (!bImprimeAutomatico) {
            window.open(`${BASE_URI}/relatorios_api/pdf/${arquivo}`, '_blank');
          }
          await limparRelatorios();
        }

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

  async function encontraIndiceColuna(lista, coluna) {
    const index = lista.findIndex(obj => obj.coluna == coluna);

    return index
  };

  async function montaPesquisa(colunaOrdenacao = '') {
    try {

      const sTipoItem = 'PRODUTO';
      const tabelaEstoque = 'PA_ITEN';
      const campoQualidade = 'TIPO';
      const sCodigo = $('#txtProduto').val() != '' ? ` AND ${tabelaEstoque}.CODIGO IN (${await formataListas($('#txtProduto').val().toString())})` : '';
      const sCor = $('#txtCor').val() != '' ? ` AND ${tabelaEstoque}.COR IN (${await formataListas($('#txtCor').val().toString())})` : '';
      const sColecao = $('#txtColecao').val() != '' ? ` AND COLECAO.CODIGO IN (${await formataListas($('#txtColecao').val().toString())})` : '';
      const sGrupo = $('#txtGrupoPA').val() != '' ? ` AND ${sTipoItem}.GRUPO IN (${await formataListas($('#txtGrupoPA').val().toString())})` : '';
      const sEtiqueta = $('#txtEtiqueta').val() != '' ? ` AND PRODUTO.ETIQUETA IN (${await formataListas($('#txtEtiqueta').val().toString())})` : '';
      const sDeposito = $('#txtDepositoUsuario').val() != '' ?
        ` AND ${tabelaEstoque}.DEPOSITO IN (${await formataListas($('#txtDepositoUsuario').val().toString())})`
        : filtroDeposito != '' ? ` AND ${tabelaEstoque}.DEPOSITO IN (${filtroDeposito})` : '';
      const ordemOrdenacao = $('#txtOrdem').val();
      let orderBy = colunaOrdenacao == '' ? await retornaOrderBy(ordemOrdenacao) : colunaOrdenacao;

      const sQualidade = $('#txtQualidade').val() != '' ? ` AND ${tabelaEstoque}.TIPO IN (${await formataListas($('#txtQualidade').val().toString())})` : '';
      // const somenteEstoque = $('#cbContemEstoque').prop('checked') == true ? ` AND ${tabelaEstoque}.QUANTIDADE > 0 ` : '';
      const sTamanho = $('#txtTamanho').val() != '' ? ` AND PA_ITEN.TAM IN (${await formataListas($('#txtTamanho').val().toString())})` : '';
      const sMarca = $('#txtMarca').val() != '' ? ` AND PRODUTO.MARCA IN (${await formataListas($('#txtMarca').val().toString())})` : '';
      const sTipoProduto = $('#txtTipoProduto').val() != '' ? ` AND PRODUTO.TIPO IN (${await formataListas($('#txtTipoProduto').val().toString())})` : '';
      const sLinha = $('#txtLinha').val() != '' ? ` AND PRODUTO.LINHA IN (${await formataListas($('#txtLinha').val().toString())})` : '';
      const sModelo = $('#txtModelo').val() != '' ? ` AND PRODUTO.MODELO IN (${await formataListas($('#txtModelo').val().toString())})` : '';
      const sFornecedor = $('#txtFornecedor').val() != '' ? ` AND PRODUTO.FORNECEDOR IN (${await formataListas($('#txtFornecedor').val().toString())})` : '';
      const sCategoria = $('#txtCategoria').val() != '' ? ` AND PRODUTO.CATEGORIA IN (${await formataListas($('#txtCategoria').val().toString())})` : '';
      let sTabPreco = '';

      if ($('#checkTabPrecoCorTam').prop('checked')) {
        if ($('#txtTabPreco').val() != '' && $('#txtProduto').val() != '') {
          sTabPreco = ` AND TABPRECO.REGIAO = '${pegaChave('#txtTabPreco')}' AND ${tabelaEstoque}.CODIGO IN (${await formataListas($('#txtProduto').val().toString())})`
        }
        else if ($('#txtTabPreco').val() != '') {
          sTabPreco = ` AND TABPRECO.REGIAO = '${pegaChave('#txtTabPreco')}'`
        }
      } else {
        if ($('#txtTabPreco').val() != '' && $('#txtProduto').val() != '') {
          sTabPreco = ` AND TABPRECO.REGIAO = '${pegaChave('#txtTabPreco')}' AND ${tabelaEstoque}.CODIGO IN (${await formataListas($('#txtProduto').val().toString())})`
        }
        else if ($('#txtTabPreco').val() != '') {
          sTabPreco = ` AND TABPRECO.REGIAO = '${pegaChave('#txtTabPreco')}'`
        }
      }

      let camposSelect = '';
      let groupby;
      let cols = [];

      let qtde = '(SUM(PA_ITEN.QUANTIDADE)';

      if ($('#checkRes').prop('checked')) {
        qtde += ` - COALESCE((SELECT SUM(UDF_NVL(PED_RESERVA.QTDE))
                      FROM [PED_RESERVA] PED_RESERVA
                     WHERE PED_RESERVA.CODIGO = PA_ITEN.CODIGO
                       AND PED_RESERVA.COR = PA_ITEN.COR
                       AND PED_RESERVA.TAM = PA_ITEN.TAM
                       AND PED_RESERVA.QUAL = PA_ITEN.TIPO`;

        if ($('#checkDep').prop('checked')) {
          qtde += ' AND PED_RESERVA.DEPOSITO = PA_ITEN.DEPOSITO'
        }
        if ($('#checkLot').prop('checked')) {
          qtde += ' AND PED_RESERVA.LOTE = PA_ITEN.LOTE'
        }
        qtde += '), 0)'
      }

      if ($('#checkExp').prop('checked')) {
        qtde += ` - COALESCE((SELECT SUM(UDF_NVL(PEDIDO3.QTDE))
                       FROM [PEDIDO3] PEDIDO3
                      WHERE PEDIDO3.CODIGO = PA_ITEN.CODIGO
                        AND PEDIDO3.COR = PA_ITEN.COR
                        AND PEDIDO3.TAM = PA_ITEN.TAM
                        AND PEDIDO3.QUALIDADE = PA_ITEN.TIPO`;

        if ($('#checkDep').prop('checked')) {
          qtde += ' AND PEDIDO3.DEPOSITO = PA_ITEN.DEPOSITO'
        }
        if ($('#checkLot').prop('checked')) {
          qtde += ' AND PEDIDO3.LOTE = PA_ITEN.LOTE'
        }
        qtde += '), 0)'
      }

      qtde += ') QUANTIDADE';



      camposSelect = ["PA_ITEN.ID", "PA_ITEN.CODIGO", "PRODUTO.DESCRICAO DESC_PRODUTO", "PRODUTO.TIPO", "PA_ITEN.COR", "CADCOR.DESCRICAO DESCCOR",
        "PA_ITEN.TAM", "FAIXA_ITEN.POSICAO POSICAOTAM", "COLECAO.CODIGO CODCOLECAO", "COLECAO.DESCRICAO DESCCOLECAO", "PA_ITEN.DEPOSITO", "DEPOSITO.DESCRICAO DESCDEPOSITO", "PA_ITEN.LOTE", qtde, "PA_ITEN.BARRA",
        "PA_ITEN.BARRA28", "PA_ITEN.BARRACLI", "MAX(PA_ITEN.CUSTO) CUSTO_PROD", "PRODUTO.ETIQUETA", "ETQ_PROD.DESCRICAO DESC_ETIQUETA", "PRODUTO.GRUPO", "GRUPO_PA.DESCRICAO DESCGRUPO",
        "TABFIS.DESCRICAO NCM", "PRODUTO.MARCA", "MARCA.DESCRICAO DESCMARCA", "PRODUTO.FAIXA", "PA_ITEN.TIPO QUALIDADE", "PRODUTO.LINHA", "TABLIN.DESCRICAO DESCLINHA", "PRODUTO.CATEGORIA", "AUXILIAR.DESCRICAO DESC_CATEGORIA"];

      cols = ["ID", "CODIGO", "DESC_PRODUTO", "TIPO", "COR", "DESCCOR", "TAM", "POSICAOTAM", "CODCOLECAO", "DESCCOLECAO", "DEPOSITO", "DESCDEPOSITO", "LOTE", "QUANTIDADE",
        "BARRA", "BARRA28", "BARRACLI", "CUSTO_PROD", "ETIQUETA", "DESC_ETIQUETA", "GRUPO", "DESCGRUPO",
        "NCM", "MARCA", "DESCMARCA", "FAIXA", "QUALIDADE", "LINHA", "DESCLINHA", "CATEGORIA", "DESC_CATEGORIA"];

      groupBySubSelect = ["ID", "CODIGO", "DESC_PRODUTO", "TIPO", "COR", "DESCCOR", "TAM", "POSICAOTAM", "CODCOLECAO", "DESCCOLECAO", "DEPOSITO", "DESCDEPOSITO", "LOTE", "QUANTIDADE",
        "BARRA", "BARRA28", "BARRACLI", "CUSTO_PROD", "ETIQUETA", "DESC_ETIQUETA", "GRUPO", "DESCGRUPO",
        "NCM", "MARCA", "DESCMARCA", "FAIXA", "QUALIDADE", "LINHA", "DESCLINHA", "CATEGORIA", "DESC_CATEGORIA"];


      groupby = ["PA_ITEN.ID", "PA_ITEN.CODIGO", "PRODUTO.DESCRICAO", "PRODUTO.TIPO", "PA_ITEN.COR", "CADCOR.DESCRICAO",
        "PA_ITEN.TAM", "FAIXA_ITEN.POSICAO", "COLECAO.CODIGO", "COLECAO.DESCRICAO", "PA_ITEN.DEPOSITO", "DEPOSITO.DESCRICAO", "PA_ITEN.LOTE", "PA_ITEN.BARRA",
        "PA_ITEN.BARRA28", "PA_ITEN.BARRACLI", "PRODUTO.ETIQUETA", "ETQ_PROD.DESCRICAO", "PRODUTO.GRUPO", "PRODUTO.TIPO", "GRUPO_PA.DESCRICAO",
        "TABFIS.DESCRICAO", "PRODUTO.MARCA", "MARCA.DESCRICAO", "PRODUTO.FAIXA", "PA_ITEN.TIPO", "PRODUTO.LINHA", "TABLIN.DESCRICAO", "PRODUTO.CATEGORIA", "AUXILIAR.DESCRICAO"];

      if ($('#txtTabPreco').val() != '') {
        camposSelect.push($('#checkTabPrecoCorTam').prop('checked') ? 'TABPRECO.PRECO' : "TABPRECO.PRECO_00", "TABPRECO.REGIAO");
        cols.push($('#checkTabPrecoCorTam').prop('checked') ? "PRECO" : "PRECO_00", "REGIAO");
        groupBySubSelect.push($('#checkTabPrecoCorTam').prop('checked') ? "PRECO" : "PRECO_00", "REGIAO");
        groupby.push($('#checkTabPrecoCorTam').prop('checked') ? "TABPRECO.PRECO" : "TABPRECO.PRECO_00", "TABPRECO.REGIAO");
      } else {
        camposSelect.push($('#checkTabPrecoCorTam').prop('checked') ? "'' PRECO" : "'' PRECO_00", "'' REGIAO");
        cols.push($('#checkTabPrecoCorTam').prop('checked') ? "PRECO" : "PRECO_00", "REGIAO");
        groupBySubSelect.push($('#checkTabPrecoCorTam').prop('checked') ? "PRECO" : "PRECO_00", "REGIAO");
        // groupby.push($('#checkTabPrecoCorTam').prop('checked') ? "PRECO" : "PRECO_00", "REGIAO");
      }


      const ligacaoTabelaCor = { "tabela": "CADCOR", "condicao": `CADCOR.COR = ${tabelaEstoque}.COR` };

      const ligacaoProdutoMaterial = { "tabela": `${sTipoItem}`, "condicao": `${sTipoItem}.CODIGO = ${tabelaEstoque}.CODIGO` };

      const ligacaoColecao = { "tabela": "COLECAO", "condicao": `COLECAO.CODIGO = ${sTipoItem}.COLECAO` };

      const ligacaoQualidade = { "tabela": "TABQUL", "condicao": `TABQUL.CODIGO = ${tabelaEstoque}.${campoQualidade}` };

      const ligacaoEtiqueta = { "tabela": "ETQ_PROD", "condicao": "ETQ_PROD.CODIGO = PRODUTO.ETIQUETA" };

      const ligacaoGrupo = { "tabela": "GRUPO_PA", "condicao": "GRUPO_PA.CODIGO = PRODUTO.GRUPO" };

      const ligacaoNCM = { "tabela": "TABFIS", "condicao": "TABFIS.CODIGO = PRODUTO.CODFIS" };

      const ligacaoMarca = { "tabela": "MARCA", "condicao": "MARCA.CODIGO = PRODUTO.MARCA" };

      const ligacaoLinha = { "tabela": "TABLIN", "condicao": "TABLIN.CODIGO = PRODUTO.LINHA" };

      const ligacaoCategoria = { "tabela": "AUXILIAR", "condicao": "AUXILIAR.ID = PRODUTO.CATEGORIA" };

      const ligacaoDeposito = { "tabela": "DEPOSITO", "condicao": "DEPOSITO.CODIGO = PA_ITEN.DEPOSITO" };

      const ligacaoFaixaIten = { "tabela": "FAIXA_ITEN", "condicao": `FAIXA_ITEN.FAIXA = ${sTipoItem}.FAIXA AND FAIXA_ITEN.TAMANHO = ${tabelaEstoque}.TAM` };

      const ligacaoTabPreco = $('#checkTabPrecoCorTam').prop('checked') ? { "tabela": "PRECO_COR_TAM", "alias": "TABPRECO", "condicao": "TABPRECO.CODIGO = PRODUTO.CODIGO AND TABPRECO.COR = PA_ITEN.COR AND TABPRECO.TAM = PA_ITEN.TAM" }
        : { "tabela": "TABPRECO", "condicao": "TABPRECO.CODIGO = PRODUTO.CODIGO" };


      if (!$('#checkDep').prop('checked')) {
        camposSelect = camposSelect.filter((e) => (e != 'PA_ITEN.ID') && (e != 'PA_ITEN.DEPOSITO'));
        groupby = groupby.filter((e) => (e != 'PA_ITEN.ID') && (e != 'PA_ITEN.DEPOSITO'));
        cols = cols.filter((e) => (e != 'ID') && (e != 'DEPOSITO'));
      }

      if ((!$('#checkDep').prop('checked')) && (!$('#checkLot').prop('checked'))) {
        groupBySubSelect = groupBySubSelect.filter((e) => (e != 'ID') && (e != 'DEPOSITO') && (e != 'LOTE'));
        camposSelect = camposSelect.filter((e) => (e != 'PA_ITEN.ID') && (e != 'PA_ITEN.DEPOSITO') && (e != 'PA_ITEN.LOTE'));
        groupby = groupby.filter((e) => (e != 'PA_ITEN.ID') && (e != 'PA_ITEN.DEPOSITO') && (e != 'PA_ITEN.LOTE'));
        cols = cols.filter((e) => (e != 'ID') && (e != 'DEPOSITO') && (e != 'LOTE'));
        orderBy = orderBy.replaceAll(',DEPOSITO', '').replaceAll('DEPOSITO,', '')
        orderBy = orderBy.replaceAll(',LOTE', '').replaceAll('LOTE,', '');
        orderBy = orderBy.replaceAll(',ID', '').replaceAll('ID,', '');
      } else if (!$('#checkDep').prop('checked')) {
        groupBySubSelect = groupBySubSelect.filter((e) => (e != 'ID') && (e != 'DEPOSITO'));
        camposSelect = camposSelect.filter((e) => (e != 'PA_ITEN.DEPOSITO') && (e != 'PA_ITEN.ID'));
        groupby = groupby.filter((e) => (e != 'PA_ITEN.DEPOSITO') && (e != 'PA_ITEN.ID'));
        cols = cols.filter((e) => (e != 'DEPOSITO') && (e != 'ID'));
        orderBy = orderBy.replaceAll(',DEPOSITO', '').replaceAll('DEPOSITO,', '');
        orderBy = orderBy.replaceAll(',ID', '').replaceAll('ID,', '');
      } else if (!$('#checkLot').prop('checked')) {
        groupBySubSelect = groupBySubSelect.filter((e) => (e != 'ID') && (e != 'LOTE'));
        camposSelect = camposSelect.filter((e) => (e != 'PA_ITEN.LOTE') && (e != 'PA_ITEN.ID'));
        groupby = groupby.filter((e) => (e != 'PA_ITEN.LOTE') && (e != 'PA_ITEN.ID'));
        cols = cols.filter((e) => (e != 'LOTE') && (e != 'ID'));
        orderBy = orderBy.replaceAll(',LOTE', '').replaceAll('LOTE,', '');
        orderBy = orderBy.replaceAll(',ID', '').replaceAll('ID,', '');
      }

      const pesquisa = {
        tabela: tabelaEstoque,
        camposSelect: camposSelect,
        leftjoin: [ligacaoTabelaCor, ligacaoProdutoMaterial, ligacaoColecao, ligacaoQualidade, ligacaoEtiqueta, ligacaoGrupo, ligacaoNCM, ligacaoMarca, ligacaoDeposito, ligacaoCategoria, ligacaoLinha, ligacaoFaixaIten],
        where: [`1=1${sCodigo}${sDeposito}${sCor}${sColecao}${sGrupo}${sQualidade}${sTamanho}${sEtiqueta}${sMarca}${sLinha}${sModelo}${sTipoProduto}${sTabPreco}${sFornecedor}${sCategoria}`],
        groupby: groupby,
        orderby: [orderBy],
        camposSelectSubSelect: groupBySubSelect,
        whereSubSelect: ["QUANTIDADE > 0"],
        groupBySubSelect: groupBySubSelect
      };

      if ($('#txtTabPreco').val() != '') {
        pesquisa.leftjoin.push(ligacaoTabPreco);
      }


      if (!$('#cbContemEstoque').prop('checked')) {
        delete pesquisa['whereSubSelect'];
      }

      return {
        pesquisa: pesquisa,
        colunas: cols
      }
    } catch (e) {
      console.log(e);
      msgErro(`Não foi possível buscar os dados: ${e}`);
    }
  }

  async function buscaDados(colunaOrdenacao = '') {
    if ($.fn.DataTable.isDataTable('#tabelaRelEstoque')) {
      $("#tabelaRelEstoque").DataTable().destroy();
      $("#tabelaRelEstoque").empty();
    }

    ultimaColunaOrdenada.nome = colunaOrdenacao.replaceAll(' ASC', '').replaceAll(' DESC', '');
    ultimaColunaOrdenada.ordenacao = colunaOrdenacao.indexOf(' ASC') > -1 ? 'ASC' : 'DESC';

    try {
      try {
        $.LoadingOverlay("show");

        const pesquisa = await montaPesquisa(colunaOrdenacao);
        let dataSetCols = [];

        for (let i = 0; i < pesquisa.colunas.length; i++) {
          dataSetCols.push({
            'title': pesquisa.colunas[i],
            'data': pesquisa.colunas[i],
          });
        }

        let colNameToIndex = [];

        dataSetCols.forEach((col, index) => {
          colNameToIndex.push({
            "coluna": col.title,
            "indice": index
          });
        });

        let colunasFormat = []

        const colunaQtdeIndex = await encontraIndiceColuna(colNameToIndex, 'QUANTIDADE');
        const colunaPrecoIndex = await encontraIndiceColuna(colNameToIndex, 'PRECO_00');

        colunasFormat.push(colunaQtdeIndex);
        colunasFormat.push(colunaPrecoIndex);

        // const ajaxData = {
        //   "EMPRESA": getCookie('empresa'),
        //   "JSON": `{"tabela":"${tabelaEstoque}", 
        //             "camposSelect": ${camposSelect}, 
        //             "leftJoin": [${ligacaoTabelaCor},${ligacaoProdutoMaterial},${ligacaoColecao},${ligacaoQualidade}], 
        //             "where": ["1=1 ${sCodigo} ${sDeposito} ${sCor} ${sColecao} ${sGrupo} ${sQualidade} ${somenteEstoque} ${sTamanho} ${sEtiqueta}"],
        //             "orderby": ["${orderBy}"]  
        //           }`,
        //   "CLIENTE": 'N',
        // };

        $('#tabelaRelEstoque').DataTable({
          paging: true,
          colReorder: true,
          lengthChange: true, // habilita o select para mudar a quantidade de itens por página
          lengthMenu: [[10, 25, 50, 100, 500, 1000, -1], [10, 25, 50, 100, 500, 1000, "Todos"]], // opções disponíveis no select
          pageLength: 10,
          filter: false,
          info: true,
          autoWidth: true,
          destroy: true,
          serverSide: true,
          processing: true,
          sortable: true,
          ajax: {
            url: `${getCookie('protocolo')}://${getCookie('ip_api')}/sisplan/funcoes/v1/pesquisadatatable`,
            type: "POST",
            headers: {
              'Authorization': BASIC_AUTH
            },
            data: {
              EMPRESA: getCookie('empresa'),
              JSON: JSON.stringify(pesquisa.pesquisa),
              CLIENTE: 'N'
            },
            dataSrc: function (data) {
              const cols = pesquisa.colunas;
              const array = data.data;
              return array.map(row => {
                return row.reduce((obj, value, index) => {
                  obj[cols[index]] = value;
                  return obj;
                }, {});
              });
            }
          },
          columns: dataSetCols,
          columnDefs: [
            { orderable: true, targets: 0 },
            {
              "targets": colunasFormat ?? '',
              "className": 'pr-4 text-right'
            }
          ],
        });

        const colunasInvisiveis = JSON.parse(localStorage.getItem('colunasInvisiveisRelatorios'));

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

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

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

        $('#buttonExcel').on('click', async function () {
          const url = '/Sisplan/Funcoes/v1/pesquisa?';
          const pesquisa = await montaPesquisa();
          await exportaCSV(url, `JSON=${encodeURIComponent(JSON.stringify(pesquisa.pesquisa))}`, true, null, 'Relatório de Estoque de Produto', '#tabelaRelEstoque');
        })


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

        $('#tabelaRelEstoque th').on('click', async function () {
          const nomeColuna = $(this).html();
          const novaOrdenacao = ultimaColunaOrdenada.ordenacao == 'ASC' ? 'DESC' : 'ASC';
          const ordenacao = ultimaColunaOrdenada.nome == nomeColuna ? novaOrdenacao : 'ASC';
          await buscaDados(nomeColuna + ' ' + ordenacao);
        });
      } catch (error) {
        console.error(error);
        msgErro('Não foi possível buscar os dados dos itens.');
      }
    } finally {
      $.LoadingOverlay("hide");
      $('#modal-filtros').modal('hide');
    }
  }

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

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

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

    adicionaColunas(cols, colunasInvisiveis.relEstoque ?? [])
  })

  $('#btnConsultar').on('click', async function () {
    await buscaDados();
  });

  async function retornaOrderBy(ordem) {
    let resultado;
    const pesquisa = {
      tabela: "ORDEM_TELA",
      camposSelect: ["NOME_ORD_SIST"],
      where: [`NOME_TELA = 'RelEstoque' AND ORDEM = ${ordem}`]
    };
    const json = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa));
    resultado = json[0].NOME_ORD_SIST; //'PA_ITEN.COR, PA_ITEN.TAM, PA_ITEN.CODIGO';
    return resultado.replaceAll(';', ',')
  }

  $('#txtProduto').on('change', async function () {
    if (bipandoBarra) {
      return;
    }
    if (!$(this).val()[0]) {
      componenteFiltro('cor', true)
      componenteFiltro('tamanho', true)
      return
    }
    $.LoadingOverlay('show')
    try {
      const codigos = await formataListas($('#txtProduto').val().toString());
      const cores = []
      const tamanhos = []
      const pesquisa = {
        tabela: 'PA_ITEN',
        camposSelect: ['COR', 'TAM'],
        where: [`CODIGO IN (${codigos})`],
        groupBy: ['COR', 'TAM']
      }
      const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa));

      for (let i = 0; i < jsonStr.length; i++) {
        if (!cores.includes(jsonStr[i].COR)) {
          cores.push(jsonStr[i].COR)
        }
        if (!tamanhos.includes(jsonStr[i].TAM)) {
          tamanhos.push(jsonStr[i].TAM)
        }
      }
      let coresFormatadas = ''
      let tamanhosFormatados = ''
      for (let i = 0; i < cores.length; i++) {
        coresFormatadas += "'" + cores[i] + "',";
      }
      for (let i = 0; i < tamanhos.length; i++) {
        tamanhosFormatados += "'" + tamanhos[i] + "',";
      }

      coresFormatadas = coresFormatadas.substring(0, coresFormatadas.length - 1);
      tamanhosFormatados = tamanhosFormatados.substring(0, tamanhosFormatados.length - 1);

      componenteFiltro('cor', true, true, '', [`COR IN (${coresFormatadas})`])
      componenteFiltro('tamanho', true, true, '', [`TAM IN (${tamanhosFormatados})`])
    } catch (error) {
      console.error(error)
      msgAlerta(error.message)
    } finally {
      $.LoadingOverlay('hide')
    }
  })

  $('#txtBarra').on('blur', async function () {
    if (!$(this).val()) {
      return;
    }
    $.LoadingOverlay('show')
    try {
      bipandoBarra = true
      let barra = $(this).val()

      const ebarralog = await retornaBarraLogLida(barra) == "barra_log";

      if (ebarralog) {
        barra = await extraiBarra28(barra);
      }

      const pesquisa = {
        tabela: 'PA_ITEN',
        camposSelect: ['PA_ITEN.CODIGO', 'PRODUTO.DESCRICAO', 'PA_ITEN.COR', 'CADCOR.DESCRICAO DESC_COR', 'PA_ITEN.TAM', 'TABTAM.CODIGO2'],
        leftjoin: [{ tabela: 'PRODUTO', condicao: 'PRODUTO.CODIGO = PA_ITEN.CODIGO' },
        { tabela: 'CADCOR', condicao: 'CADCOR.COR = PA_ITEN.COR' },
        { tabela: 'TABTAM', condicao: 'TABTAM.TAM = PA_ITEN.TAM' }],
        where: [`(PA_ITEN.BARRA = '${barra}' OR
                  PA_ITEN.BARRACLI = '${barra}' OR 
                  PA_ITEN.BARRA28 = '${barra}' OR 
                  PA_ITEN.BARRA28 = '${barra.substring(0, 6)}')`],
        groupBy: ['PA_ITEN.CODIGO', 'PRODUTO.DESCRICAO', 'PA_ITEN.COR', 'CADCOR.DESCRICAO', 'PA_ITEN.TAM', 'TABTAM.CODIGO2']
      }
      const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa));

      if (jsonStr.length <= 0) {
        throw new Error('Barra não encontrada')
      }

      let produto = []
      let tamanho = []
      let cor = []

      jsonStr.forEach(item => {
        if (!produtoDuplicado(produto, item)) {
          const obj = {
            CODIGO: item.CODIGO,
            DESCRICAO: item.DESCRICAO
          }
          produto.push(obj)
        }

        if (!tamanhoDuplicado(tamanho, item)) {
          const objTam = {
            TAM: item.TAM,
            CODIGO2: item.CODIGO2
          }
          tamanho.push(objTam)
        }

        if (!corDuplicada(cor, item)) {
          const objCor = {
            COR: item.COR,
            DESC_COR: item.DESC_COR
          }
          cor.push(objCor)
        }
      })

      produto = produto.filter(obj => !$('#txtProduto').val().includes(obj.CODIGO))
      cor = cor.filter(obj => !$('#txtCor').val().includes(obj.COR))
      tamanho = tamanho.filter(obj => !$('#txtTamanho').val().includes(obj.TAM))

      await insereValorPesquisaVarios('txtProduto', 'CODIGO', 'DESCRICAO', produto)
      await insereValorPesquisaVarios('txtCor', 'COR', 'DESC_COR', cor)
      await insereValorPesquisaVarios('txtTamanho', 'TAM', 'CODIGO2', tamanho)

    } catch (error) {
      console.error(error)
      msgAlerta(error.message)
    } finally {
      $('#txtBarra').val('')
      $('#txtBarra').focus()
      bipandoBarra = false
      $.LoadingOverlay('hide')
    }
  })

  function produtoDuplicado(array, newItem) {
    return array.some(item => item.CODIGO == newItem.CODIGO);
  }

  function tamanhoDuplicado(array, newItem) {
    return array.some(item => item.TAM == newItem.TAM);
  }

  function corDuplicada(array, newItem) {
    return array.some(item => item.COR == newItem.COR);
  }

  $('#btn-limpa-barra').on('click', function () {
    $('#txtBarra').val('');
  });

  async function retornaBarraLogLida(sBarra) {
    try {
      const url = `/sisplan/barralog/v1/validarbarra?`;
      const params = `barra=${encodeURIComponent(sBarra)}`;
      const response = await requisicao('GET', url, params, 15000);

      if (!response) {
        return;
      }

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

      return jsonStr.mensagem;
    } catch (error) {
      console.error(error);
    }
  }
});