$('#tutorial').on('click', function () {
  $('#geral-tab').trigger('click');
  $(document).ready(async function () {
    const driver = new Driver({
      doneBtnText: 'Sair',
      closeBtnText: 'Fechar',
      nextBtnText: 'Próximo',
      prevBtnText: 'Anterior',
      allowClose: false,
      onHighlightStarted: (Element) => {
        if (Element.node.id == 'geral') {
          if (!$('#DadosGerais').hasClass('show'));
          $('#DadosGerais').collapse('show');
        }
      },
    });

    driver.defineSteps([{
      element: '#geral',
      popover: {
        title: 'Cadastro Geral',
        description: 'Clique aqui para abrir a aba de cadastro Geral.',
        position: 'top'
      }
    }
    ]);

    driver.start();
  });
});

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

  let barrasLidas = [];

  $('#txtPedido').autocompleta(4, `JSON={
    "tabela":"PEDIDO", 
    "camposSelect":[ "PEDIDO.NUMERO", "ENTIDADE.NOME", "PEDIDO.DEPOSITO", "DEPOSITO.DESCRICAO", "PEDIDO.CODCLI"], 
    "leftjoin": [
      {"tabela": "ENTIDADE", "condicao": "ENTIDADE.CODCLI = PEDIDO.CODCLI"},
      {"tabela": "DEPOSITO", "condicao": "DEPOSITO.CODIGO = PEDIDO.DEPOSITO"}
    ],
    "where": null}`,
    ['#txtDeposito', '#txtCliente'],
    ['DEPOSITO', 'CODCLI'],
    ['DESC_DEPOSITO', 'DESCRICAO'],
    buscaPedidoComSemReserva
  );

  $('#btnPedido').pesquisa_serverside(
    ['#txtPedido', '#txtDeposito', '#txtCliente'],
    ['PEDIDO.NUMERO', 'PEDIDO.DEPOSITO', 'PEDIDO.CODCLI'],
    ['ENTIDADE.NOME', 'DEPOSITO.DESCRICAO', 'ENTIDADE.NOME'],
    `{"tabela":"PEDIDO", 
      "camposSelect":[ "PEDIDO.NUMERO", "PEDIDO.DEPOSITO", "PEDIDO.CODCLI", "ENTIDADE.NOME", "DEPOSITO.DESCRICAO"], 
      "leftjoin": [ 
        {"tabela": "ENTIDADE", "condicao": "ENTIDADE.CODCLI = PEDIDO.CODCLI"},
        {"tabela": "DEPOSITO", "condicao": "DEPOSITO.CODIGO = PEDIDO.DEPOSITO"}
      ],
      "where": null
     }`,
    'Pesquisa Pedido',
    buscaPedidoComSemReserva
  );

  $('#btnDesistir').on('click', function () {
    msgAlerta('Deseja mesmo abandonar essa expedição? Todos os itens conferidos serão perdidos.', abandonaExpedicao)
  });

  $('#txtFuncionario').autocompleta(1, `JSON={ "tabela":"PESSOAL", "camposSelect":["CODIGO CHAVE, NOME DESCRICAO"], "where": null }`);
  $('#btnFuncionario').pesquisa('#txtFuncionario', "CODIGO", "NOME", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"PESSOAL", "camposSelect":["CODIGO", "NOME"], "where": null}`, "Pesquisa Funcionário", "PESSOAL");
  $('#btnAFuncionario').on('click', function () { $('#txtFuncionario').val(''); });

  $('#msform').validate({
    debug: false,
    ignore: "",
    rules: {
      txtDescricao: { required: true, },
      txtTabelaPreco: { required: true, },
      dataIni: { required: true, },
      dataFim: { required: true, },
    },
    messages: {
      txtDescricao: { required: 'Descrição inválida.', },
      txtTabelaPreco: { required: 'Tabela de preço inválida.', },
      dataIni: { required: 'Data inicial inválida.', },
      dataFim: { required: 'Data final inválida.', },
    },
    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');
    }
  });

  await buscaFuncionario();

  $('#txtBarra').on('blur', async function () {
    const barra = $('#txtBarra').val();
    if (barra == '') {
      return;
    }
    await confereBarra(true, barra);
  });

  $('#txtBarraEstorno').on('blur', async function () {
    const barra = $('#txtBarraEstorno').val();
    if (barra == '') {
      return;
    }
    await confereBarra(false, barra);
  });

  $('#txtBarra').on('keydown', async function (event) {
    if ((event.key == 'Enter')) {
      $('#txtBarra').trigger('blur');
      $('#txtBarra').focus();
    }
  });

  $('#txtBarraEstorno').on('keydown', async function (event) {
    if ((event.key == 'Enter')) {
      $('#txtBarraEstorno').trigger('blur');
      $('#txtBarraEstorno').focus();
    }
  });

  $('#tabelaItens tbody').on('click', 'tr', async function () {
    $("#tabelaItens tbody tr td")[0].click();
    $('#tabelaItens tbody tr.selected').removeClass('selected');
    $(this).addClass('selected');
  });

  $('#btnMais').on('click', function () {
    $('#barraBipar').addClass('d-none');
    $('#barraEstorno').removeClass('d-none');
    $('#txtBarraEstorno').focus();
  });

  $('#btnMenos').on('click', function () {
    $('#barraEstorno').addClass('d-none');
    $('#barraBipar').removeClass('d-none');
    $('#txtBarra').focus();
  });

  $('#btnGravar').on('click', async function () {
    if ($('#txtPedido').val() == '') {
      return;
    };
    await gravaDados();
  });

  $('#txtReserva').on('change', async function () {
    $('#tabelaItens').DataTable().rows().remove().draw();
    const pedido = $('#txtPedido').attr('data-chave');
    const deposito = $('#txtDeposito').attr('data-chave');
    await buscaPedidoComReserva(pedido, $('#txtReserva').val(), deposito);
  });

  function abandonaExpedicao() {
    $('#txtPedido').val('');
    $('#txtReserva').val('');
    $('#txtDeposito').val('');
    $('#txtCliente').val('');
    $('#txtPedido').prop('disabled', false);
    $('#txtPedido').prop('readonly', false);
    $('#btnPedido').prop('disabled', false);
    if ($.fn.DataTable.isDataTable('#tabelaItens')) {
      $('#tabelaItens').DataTable().rows().remove().draw();
    };
    $('#btnDesistir').addClass('d-none');
    $('#txtReserva').empty();
    escondeBloqueiaCampos(false);
    barrasLidas = [];
  };

  function addBarraLida(sBarra) {
    if (!barrasLidas.includes(sBarra)) {
      barrasLidas.push(sBarra);
    }
  };

  function validaGravar() {
    const qtdeBipada = $('#tabelaItens').DataTable().column(23, {}).data().sum();

    if (qtdeBipada == 0) {
      return false;
    }
    return true;
  };

  function escondeBloqueiaCampos(bReserva) {
    if (bReserva) {
      $('#divReserva').removeClass('d-none');
      $('#divCliente').removeClass('col-8');
      $('#divCliente').addClass('col-4');
      return;
    }
    $('#divReserva').addClass('d-none');
    $('#divCliente').addClass('col-8');
    $('#divCliente').removeClass('col-4');
  }

  function addReservasSelect(arrReservas) {
    arrReservas.map((item) => {
      $("#txtReserva").append(new Option(item.RESERVA, item.RESERVA));
    });
  }

  async function confereBarra(biparEstornar, barra) {
    try {
      const dados = $('#tabelaItens').DataTable().rows().data().toArray();
      const indice = dados.findIndex((item) => item.barra == barra || item.barra28 == barra || item.barraCli == barra);

      if (indice == -1) {
        msgAlerta('Nenhuma barra localizada');
        return;
      }

      const dadosItem = $('#tabelaItens').DataTable().row(indice).data();

      if ((dadosItem.QTDE_CONF < dadosItem.qtde) && biparEstornar) {
        dadosItem.QTDE_CONF += 1;
        addBarraLida(barra);
        if (dadosItem.QTDE_CONF == dadosItem.qtde) {
          dadosItem.codigo = dadosItem.codigo.replace('times-circle', 'check-circle').replace('#EEAD2D', 'green');
        }
      } else if (biparEstornar) {
        msgAlerta(`Quantidade total do item: ${dadosItem.qtde} já conferida`);
        return;
      } else if (!biparEstornar && (dadosItem.QTDE_CONF > 0)) {
        dadosItem.codigo = dadosItem.codigo.replace('check-circle', 'times-circle').replace('green', '#EEAD2D');
        dadosItem.QTDE_CONF -= 1;
      } else {
        msgAlerta(`Toda a quantidade já foi estornada`);
        return;
      }

      $('#tabelaItens').DataTable().row(indice).data(dadosItem).draw(false);
      $($('#tabelaItens tbody tr')[indice]).click();
      $('#tabelaItens').DataTable().context[0].nScrollBody.scrollTo(0, ($('.selected')[0].offsetTop));
    } finally {
      $(`#txtBarra${biparEstornar ? '' : 'Estorno'}`).val('');
      $(`#txtBarra${biparEstornar ? '' : 'Estorno'}`).focus();
    }
  };

  async function buscaFuncionario() {
    const codUsuario = getCookie('cod_usuario');
    try {
      const pesquisaParam = {
        tabela: 'ACESSO_USUARIOS',
        camposSelect: ['ACESSO_USUARIOS.CODFUN', 'PESSOAL.NOME'],
        leftJoin: [{ tabela: 'PESSOAL', condicao: 'PESSOAL.CODIGO = ACESSO_USUARIOS.CODFUN' }],
        where: [`ACESSO_USUARIOS.CODIGO = '${codUsuario}'`]
      }
      const jsonStr = (await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam)))[0];

      if (jsonStr.CODFUN == '') {
        return;
      }

      insereValor('#txtFuncionario', jsonStr.CODFUN, jsonStr.NOME);

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

  async function buscaPedidoComSemReserva() {
    const pedido = $('#txtPedido').attr('data-chave');
    const deposito = $('#txtDeposito').attr('data-chave');

    const pesquisaParam = {
      tabela: 'PED_RESERVA',
      camposSelect: ['RESERVA'],
      where: [`NUMERO = '${pedido}' AND QTDE > 0`],
      groupby: ['RESERVA']
    };

    const buscaReserva = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam));

    if (buscaReserva.length == 0) {
      escondeBloqueiaCampos(false);
      await buscaPedidoSemReserva(pedido);
    } else {
      escondeBloqueiaCampos(true);
      addReservasSelect(buscaReserva);
      await buscaPedidoComReserva(pedido, $('#txtReserva').val(), deposito);
    }

    await verificaBuscaEpc(pedido);
  };

  async function buscaPedidoSemReserva(pedido) {
    try {
      const pesquisaParam = {
        tabela: 'PED_ITEN',
        camposSelect: [
          'PED_ITEN.CODIGO', 'PRODUTO.DESCRICAO', 'PED_ITEN.COR', 'CADCOR.DESCRICAO DESCCOR', 'PED_ITEN.TAM', 'PA_ITEN.TIPO QUALIDADE',
          '(PED_ITEN.QTDE - COALESCE(PEDIDO3.QTDE, 0)) QTDE', 'PA_ITEN.BARRA', 'PA_ITEN.BARRA28', 'PA_ITEN.BARRACLI', '1 ORDEM',
          'COALESCE(PEDIDO3.QTDE_F, 0) QTDE_F', 'PA_ITEN.LOTE', 'PA_ITEN.LOCAL', '0 RESERVA', '0 BAIXADOS', `'0' BLOQUEIO`, 'PED_ITEN.ID_ITEM_PED IDITEMPED',
          '0 POSICAO', '0 IDRESERVA', 'PA_ITEN.ID_PA_ITEN IDPAITEN', 'PRODUTO.LOCAL ENDLOCAL', 'CAD_LOC_ESTOQ.DESCRICAO DESC_END_LOCAL', '0 QTDE_CONF'
        ],
        leftJoin: [
          { tabela: 'PEDIDO3', condicao: 'PEDIDO3.NUMERO = PED_ITEN.NUMERO AND PEDIDO3.CODIGO = PED_ITEN.CODIGO AND PEDIDO3.COR = PED_ITEN.COR AND PEDIDO3.TAM = PED_ITEN.TAM AND PEDIDO3.DEPOSITO = PED_ITEN.DEPOSITO AND PEDIDO3.QUALIDADE = PED_ITEN.QUALIDADE' },
          //  { tabela: 'PA_ITEN', condicao: 'PA_ITEN.CODIGO = PED_ITEN.CODIGO AND PA_ITEN.COR = PED_ITEN.COR AND PA_ITEN.TAM = PED_ITEN.TAM AND PA_ITEN.DEPOSITO = PED_ITEN.DEPOSITO AND PA_ITEN.TIPO = PED_ITEN.QUALIDADE' },
          { tabela: 'PA_ITEN', condicao: 'PA_ITEN.CODIGO = PED_ITEN.CODIGO AND PA_ITEN.COR = PED_ITEN.COR AND PA_ITEN.TAM = PED_ITEN.TAM' },
          { tabela: 'CADCOR', condicao: 'CADCOR.COR = PED_ITEN.COR' },
          { tabela: 'PRODUTO', condicao: 'PRODUTO.CODIGO = PED_ITEN.CODIGO' },
          { tabela: 'CAD_LOC_ESTOQ', condicao: 'CAD_LOC_ESTOQ.CODIGO = PRODUTO.LOCAL' }
        ],
        where: [`PED_ITEN.NUMERO = '${pedido}' AND ((PED_ITEN.QTDE - COALESCE(PEDIDO3.QTDE, 0)) > 0)`]
      }
      const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisaParam));

      if (jsonStr.length == 0) {
        msgAlerta('Pedido não possui quantidades pendendes para expedir.');
        abandonaExpedicao();
        return;
      };

      let itensFormatados = [];
      jsonStr.map((item) => {
        itensFormatados.push({
          codigo: `<div class="icheck-primary d-inline"><span class="fas fa-times-circle" style="color:#EEAD2D"></span></div>  ` + item.CODIGO,
          descricao: item.DESCRICAO,
          cor: item.COR,
          descCor: item.DESCCOR,
          tam: item.TAM,
          qualidade: item.QUALIDADE,
          qtde: item.QTDE,
          barra: item.BARRA,
          barra28: item.BARRA28,
          barraCli: item.BARRACLI,
          ordem: item.ORDEM,
          qtdeF: item.QTDE_F,
          lote: item.LOTE,
          local: item.LOCAL,
          reserva: item.RESERVA,
          baixados: item.BAIXADOS,
          bloqueio: item.BLOQUEIO,
          idItemPed: item.IDITEMPED,
          posicao: item.POSICAO,
          idReserva: item.IDRESERVA,
          idPaIten: item.IDPAITEN,
          endLocal: item.ENDLOCAL,
          descEndLocal: item.DESC_END_LOCAL,
          QTDE_CONF: item.QTDE_CONF
        });
      });

      const keys = Object.keys(itensFormatados[0]);
      let dataSetCols = [];

      for (var k in keys) {
        dataSetCols.push({
          'title': keys[k].toUpperCase(),
          'data': keys[k]
        });
      };

      criaDataTablePadrao('#tabelaItens', false, false, false, false, true, true, '400px', itensFormatados, dataSetCols, [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]);

    } finally {
      $.LoadingOverlay('hide');
      $("#tabelaItens").DataTable().columns.adjust().draw(false);
      $('#txtPedido').prop('disabled', true);
      $('#txtPedido').prop('readonly', true);
      $('#btnPedido').prop('disabled', true);
      $('#btnDesistir').removeClass('d-none');
    }
  };

  async function verificaBuscaEpc(sPedido) {
    try {
      const response = await requisicao('GET', '/sisplan/pedido3/v1/itensepc?', `NUMERO=${sPedido}`, null);

      if (!response) {
        return;
      }

      const jsonStr = await response.json();

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

      if (jsonStr.length == 0) {
        return;
      }



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

  async function buscaPedidoComReserva(pedido, reserva, deposito) {
    $.LoadingOverlay('show');
    try {
      const response = await requisicao('GET', '/expedicao?', `NUMERO=${pedido}&DEPOSITO=${deposito}&RESERVA=${reserva}`, null);

      if (response.status != 200) {
        return;
      };

      const jsonStr = (await response.json()).resultado;

      jsonStr.map((item) => {
        item.qtde -= item.baixados;
        item.QTDE_CONF = 0;
        item.codigo = `<div class="icheck-primary d-inline"><span class="fas fa-times-circle" style="color:#EEAD2D"></span></div>  ` + item.codigo;
      });

      const keys = Object.keys(jsonStr[0]);
      let dataSetCols = [];

      for (var k in keys) {
        dataSetCols.push({
          'title': keys[k].toUpperCase(),
          'data': keys[k]
        });
      }

      criaDataTablePadrao('#tabelaItens', false, false, false, false, true, true, '400px', jsonStr, dataSetCols, [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]);

    } finally {
      $.LoadingOverlay('hide');
      $("#tabelaItens").DataTable().columns.adjust().draw(false);
      $('#txtPedido').prop('disabled', true);
      $('#txtPedido').prop('readonly', true);
      $('#btnPedido').prop('disabled', true);
      $('#btnDesistir').removeClass('d-none');
    }
  };

  async function gravaDados() {
    if (!validaGravar()) {
      msgAlerta('Nenhum item bipado, favor verificar.');
      return;
    }

    $.LoadingOverlay('show');
    window.event.preventDefault();

    let arrItens = [];
    try {
      $('#tabelaItens').DataTable().data().map((item) => {
        const itPedido = {
          CODIGO: item.codigo.split('</div>  ')[1],
          COR: item.cor,
          QTDE: item.QTDE_CONF,
          QTDEF: item.qtdeF,
          PESOL: 0,
          PESO: 0,
          TAM: item.tam,
          ORDEM: item.ordem,
          DEPOSITO: pegaChave('#txtDeposito'),
          QUALIDADE: item.qualidade,
          DATA: `${new Date().toJSON().slice(0, 10)}T00:00:00Z`,
          IDPAITEN: item.idPaIten,
          DESCRICAO: item.descricao,
          DESCCOR: item.descCor,
          IDPEDITEN: item.idItemPed,
          QTDEDIST: 0,
          SEQCAIXA: 0,
          IDRESERVA: item.idReserva,
          BARRA28: item.barra28,
          BARRA: item.barra,
          BARRACLI: item.barraCli,
          FUNCIONARIO: pegaChave('#txtFuncionario'),
          ENDLOCAL: item.endLocal,
          DESCENDLOCAL: item.descEndLocal
        }
        arrItens.push(itPedido);
      });

      const pedido3 = {
        EXPLOJAWEB: true,
        NUMERO: pegaChave('#txtPedido'),
        CAIXA: $('#txtCaixa').val(),
        RESERVA: $('#txtReserva').val() > 0 ? $('#txtReserva').val() : 0,
        DEPOSITO: pegaChave('#txtDeposito'),
        FUNCIONARIO: pegaChave('#txtFuncionario'),
        BARRASLIDAS: barrasLidas,
        ITENS: arrItens
      };

      const response = await requisicao('POST', '/expedicao?', '', JSON.stringify(pedido3));

      if (!response) {
        return;
      }

      const jsonStr = await response.json();

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

      const numero = jsonStr.resultado.numero;

      await criaMensagemSucesso('Expedição realizada com sucesso.', () => { window.location.reload() });
    } finally {
      $.LoadingOverlay('hide');
    }
  };

});