/* eslint-disable prefer-destructuring */
// $("#tutorial").on("click", function () {
//   $(document).ready(async function () {
//     const driver = new Driver({
//       doneBtnText: "Sair",
//       closeBtnText: "Fechar",
//       nextBtnText: "Próximo",
//       prevBtnText: "Anterior",
//       allowClose: false,
//       animate: true,
//     });

//     driver.defineSteps([
//       {
//         element: "#tourGeral",
//         popover: {
//           title: "Dados Gerais",
//           description: "Aqui estão os dados gerais da nota.",
//           position: "top",
//         },
//       },
//       {
//         element: "#txtCliente",
//         popover: {
//           title: "Campos Obrigatórios",
//           description:
//             "Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.",
//           position: "top",
//         },
//       },
//       {
//         element: "#txtDeposito",
//         popover: {
//           title: "Campos Obrigatórios",
//           description:
//             "Esse é um campo obrigatório, para identificá-los, você verá um * ao lado do nome.",
//           position: "top",
//         },
//       },
//       {
//         element: "#avancar1",
//         popover: {
//           title: "Botão Avançar",
//           description:
//             "Clique aqui para avançar para a aba itens, onde será possível adicionar itens e após isso, adicionar duplicatas e/ou gravar a nota.",
//           position: "left",
//         },
//       },
//     ]);
//     driver.start();
//   });
// });

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

  await verificaPermissoes('FATSERVICO');
  await setarDataAtual('txtDataEmissao');
  await carregaValoresPadroes();
  await buscaServicos(TruncaDecimaisNova);

  addPesquisaAutocompleta();
  criaMascaraCampos();
  criaDataTablePadrao('#tabelaDuplicatas', false, false, false, false, true, false, '193px');
  AddItens();

  $("#msform").validate({
    debug: false,
    ignore: "",
    rules: {
      txtCliente: {
        required: true,
      },
      txtDeposito: {
        required: true,
      },
      txtTransportadora: {
        required: true,
      },
      "txtProduto-0": {
        required: true,
      },
      "txtQuantidade-0": {
        required: true,
      },
      "txtPreco-0": {
        required: true,
      }
    },
    messages: {
      txtCliente: {
        required: "Informe um cliente válido.",
      },
      txtDeposito: {
        required: "Informe um depósito válido.",
      },
      txtTransportadora: {
        required: "Informe uma transportadora válida.",
      },
      "txtProduto-0": {
        required: "Informe um produto válido.",
      },
      "txtQuantidade-0": {
        required: "Informe uma quantidade válida.",
      },
      "txtPreco-0": {
        required: "Informe um preço válido.",
      }
    },
    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");
    },
  });

  $(".next").click(async function () {
    let validator = $("#msform").validate();
    let erros = 0;

    if ($(this).attr("id") == "avancar1") {
      validator.element("#txtCliente");
      validator.element("#txtDeposito");
      if (
        validator.element("#txtCliente") &&
        validator.element("#txtDeposito")
      ) {
        erros = 0;
      } else {
        erros = 1;
      }
    }

    if (erros > 0) {
      return;
    }

    let currentFs = $(this).parent();
    let nextFs = $(this).parent().next();
    $("#progressbar li").eq($("fieldset").index(nextFs)).addClass("active");
    nextFs.show();
    currentFs.animate(
      {
        opacity: 0
      },
      {
        step(now) {
          opacity = 1 - now;
          currentFs.css({
            display: "none", position: "relative",
          });
          nextFs.css({ opacity, });
        },
        duration: 600
      }
    );
    $("#tabelaDuplicatas").DataTable().columns.adjust().draw(false);
  });

  $(".previous").click(async function () {
    let currentFs = $(this).parent();
    let previousFs = $(this).parent().prev();
    $("#progressbar li").eq($("fieldset").index(currentFs)).removeClass("active");
    previousFs.show();
    currentFs.animate(
      {
        opacity: 0,
      },
      {
        step(now) {
          opacity = 1 - now;
          currentFs.css({ display: "none", position: "relative" });
          previousFs.css({ opacity });
        },
        duration: 600,
      }
    );
    $("#tabelaDuplicatas").DataTable().columns.adjust().draw(false);
  });

  $(".radio-group .radio").click(function () {
    $(this).parent().find(".radio").removeClass("selected");
    $(this).addClass("selected");
  });

  $(".submit").click(function () {
    return false;
  });

  $("#txtCliente").change(async function () {
    const codcli = pegaChave("#txtCliente");
    try {
      const responseOperadora = await requisicao("GET", "/Sisplan/Funcoes/v1/pesquisa?", `JSON={ "tabela":"entidade", "camposSelect":["bloqueio"], "where": ["codcli = '${codcli}'"]}`, null);
      const jsonStr = await responseOperadora.json();

      if (jsonStr.RESULT[0][0].BLOQUEIO == "S" && !confirm("Cliente bloqueado, deseja continuar mesmo assim?")) {
        $("#txtCliente").val("");
        $("#txtCliente").trigger("blur");
      }
    } catch (error) {
      console.error(error);
    }
  });

  function AddItens() {
    const itens = $(".itens");
    $("#items-wrap").append(`
      <div class="row itens" ${parseInt(itens.length) != 0 ? 'style="margin-top:3px"' : ""}>
        <div class="item-${itens.length} contador col-1">
          <span id="item-${itens.length}">${itens.length + 1}</span>
        </div>
        <div class="item-${itens.length} col-lg-6 col-12">
        ${itens.length == 0 ? `<label data-error="wrong" data-success="right" for="txtProduto-${itens.length}">Item</label>` : ""}
          <div class="input-group">
            <input type="text" class="inputs input-default focus form-control classeProduto txtItem-${itens.length}" style="margin-left:5px;"id="txtProduto-${itens.length}" name="txtProduto-${itens.length}" placeholder="Serviço (F4 para pesquisar)" readonly>
            <div class="input-group-append">
              <a id="btn-produto-${itens.length}"><i class="fas fa-search text-red" style="font-weight: bold;margin-left: 10px;font-size: 18px;"></i></a>
              <a id="btn-limpa-produto-${itens.length}"><i class="fas fa-trash text-red" style="font-weight: bold;margin-left: 10px;font-size: 18px;"></i></a>
            </div>
          </div>
        </div>
        <div class="item-${itens.length} col-lg-2 col-12">
          ${itens.length == 0 ? `<label data-error="wrong" data-success="right" for="txtQuantidade-${itens.length}">Qtde.</label>` : ""}
          <div class="input-group">
            <input type="text" maxlength="8" class="inputs input-default focus form-control maskItens classeQuantidade" min="0" id="txtQuantidade-${itens.length}" name="txtQuantidade-${itens.length}" class="form-control" placeholder="Qtde.">
          </div>
        </div>
        <div class="item-${itens.length} col-lg-2 col-12">
          ${itens.length == 0 ? '<label data-error="wrong" data-success="right" for="txtPreco">Preço</label>' : ""}
          <div class="input-group">
            <input type="text" maxlength="8" class="inputs input-default focus form-control maskItens classePreco" min="0" id="txtPreco-${itens.length}" name="txtPreco-${itens.length}" class="form-control" placeholder="Preco">
          </div>
        </div>
        <div class="col-lg-1 col-12">
          <div class="btn-group grupo_botao item-${itens.length}" role="group" aria-label="Basic example">
            <button type="button" class="btn btn-opcao bg-light nofocus btn-limpa-${itens.length}">
              <i class="fas fa-trash text-red" style="font-weight: bold;margin-left: 10px;font-size: 18px;"></i>
            </button>
            <button type="button" class="btn btn-opcao bg-light nofocus btn-add-${itens.length}">
              <i class="fas fa-plus text-red" style="font-weight: bold;margin-left: 10px;font-size: 18px;"></i>
            </button>
          </div>
        </div>
      </div>
    `);

    $(`.item-${itens.length}:not(:first-child)`).css("padding", "0 1.3px 0 0");
    $(".maskItens").maskMoney({
      decimal: ".",
      thousands: "",
      precision: 2,
    });

    $(".classePreco").maskMoney({
      decimal: ".",
      thousands: "",
      precision: 2
    });

    let id = `.btn-limpa-${itens.length}`;

    $(`#txtProduto-${itens.length}`).keyup(function (e) {
      if (e.keyCode == 115) {
        $(`#btn-produto-${itens.length}`).trigger("click");
      }
      if (e.keyCode == 13) {
        $(`#txtQuantidade-${itens.length}`).focus();
      }
    });

    $(`#txtQuantidade-${itens.length}`).keyup(function (e) {
      if (e.keyCode == 13) {
        $(`#txtPreco-${itens.length}`).focus();
      }
    });
    $(`#txtPreco-${itens.length}`).keyup(function (e) {
      if (e.keyCode == 13) {
        $(`#btn-add-${itens.length}`).trigger('click');
      }
    });

    $(`#txtProduto-${itens.length}`).on("change, blur", function () {
      adicionaHint(`#txtProduto-${itens.length}`);
    });

    $(`#btn-limpa-produto-${itens.length}`).on("click", function () {
      $(`#txtProduto-${itens.length}`).val("");
      $(`#txtProduto-${itens.length}`).attr("data-codigo", "");
      $(`#txtProduto-${itens.length}`).attr("data-cor", "");
      $(`#txtProduto-${itens.length}`).attr("data-tam", "");
    });

    $(`.btn-add-${itens.length}`).on("click", function () {
      let qtdeProd = $(".itens");
      let elemento = $(this).attr("class").split("-");
      elemento = elemento[elemento.length - 1];
      if (parseInt(elemento) === qtdeProd.length - 1 && $(`#txtProduto-${elemento}`).val() != "") {
        AddItens();
        $(`#txtProduto-${parseInt(elemento) + 1}`).focus();
      }
    });

    $(`#btn-produto-${itens.length}`).on("click", function () {
      $("#idLinha").val(this.id.split("-")[2]);
      $("#modalProduto").modal("show");
      if ($.fn.DataTable.isDataTable("#tabelaProdutos")) {
        $("#tabelaProdutos").DataTable().columns.adjust().draw(false);
      }
      $("#txtProdutoCodigo").val("");
      $("#txtProdutoDescricao").val("");
    });

    $(`#txtPreco-${itens.length}`).on("blur", function () {
      if ($(`#txtQuantidade-${itens.length}`).val() != "") {
        calculaTotaisItens();
      }
    });

    $(`#txtQuantidade-${itens.length}`).on("blur", function () {
      if ($(`#txtPreco-${itens.length}`).val() != "") {
        calculaTotaisItens();
      }
    });

    addEvent(id);
    return itens.length;
  }

  $("#modalProduto").on("shown.bs.modal", function () {
    if ($.fn.DataTable.isDataTable("#tabelaProdutos")) {
      $("#tabelaProdutos").DataTable().columns.adjust().draw(false);
    }
    $("#txtProdutoCodigo").focus();
  });

  $("#txtProdutoDescricao").on("focusout", function () {
    $("#btnConsultarProduto").focus();
  });

  $("#btnConsultarProduto").on("keypress", function () {
    $("#btnConsultarProduto").trigger("click");
  });

  $("#modalProduto").on("hidden.bs.modal", function () {
    const id = $("#idLinha").val();
    $(`#txtProduto-${id}`).trigger("blur");
    $(`#txtProduto-${id}`).focus();
  });

  $("#txtProdutoCodigo").change(async function () {
    await buscaServicos();
  });

  $("#txtProdutoDescricao").change(async function () {
    await buscaServicos();
  });

  $("#btnConsultarProduto").on("click", async function () {
    await buscaServicos();
  });

  $("#btn_confirmar_produto").click(function () {
    let data = $("#tabelaProdutos").dataTable().api().row(".selected").data();
    const id = $("#idLinha").val();
    $(`#txtProduto-${id}`).val(`${data.CODIGO} - ${data.DESCRICAO}`);
    $(`#txtProduto-${id}`).attr("data-codigo", data.CODIGO);
    $(`#txtProduto-${id}`).attr("data-descricao", data.DESCRICAO);
    $("#modalProduto").modal("hide");
  });

  $("#btnConfirmarTrib").on("click", function () {
    const indice = $("#txtIndiceAlteracao").val();
    $(`#txtEnquadra${indice}`).val($("#txtEnquadra").val());
    $(`#txtCsosn${indice}`).val($("#txtCsosn").val());
    $(`#txtCstIcms${indice}`).val($("#txtCstIcms").val());
    $(`#txtCstIpi${indice}`).val($("#txtCstIpi").val());
    $(`#txtCstPis${indice}`).val($("#txtCstPis").val());
    $(`#txtCstCofins${indice}`).val($("#txtCstCofins").val());

    $(`#modalTribProd`).modal("hide");
  });

  $("#edtVencimento1, #edtVencimento2, #edtVencimento3, #edtVencimento4, #edtVencimento5, #edtVencimento6, #edtVencimento7, #edtVencimento8, #edtVencimento9, #edtVencimento10, #edtVencimento11, #edtVencimento12").change(async function () {
    if ($(this).val() == 0) {
      $(this).val('');
    }
    await simulaFinanceiro();
  });

  function addEvent(element) {
    $(element).blur(function () {
      let itens = $(".itens");
      let id = $(this).attr("class").split("-");
      id = id[id.length - 1];
      if (
        parseInt(id) === itens.length - 1 &&
        $(`#txtProduto-${id}`).val() != ""
      ) {
        AddItens();
        $(`#txtProduto-${parseInt(id) + 1}`).focus();
      }
    });

    $(element).on("click", async function () {
      let itens = $(".itens");
      let id = $(this).attr("class").split("-");
      id = id[id.length - 1];
      const idInput = $(`.txtItem-${id}`)[0].id;
      if (itens.length === 1) {
        itens = [];
        $(`.item-${id}`).closest(".row").remove();
        AddItens();
      } else {
        await DeleteItem(id);
        $(`.removido`).closest(".row").remove();
        if (id == 0) {
          $($(`.itens > .item-0 > .input-group`)[0]).css("margin-top", "8%");
          $($(`.itens > .item-0 > .input-group`)[1]).css("margin-top", "33%");
          $($(`.itens > .item-0 > .input-group`)[2]).css("margin-top", "33%");
          $($(`.itens > .item-0 > .input-group`)[3]).css("margin-top", "33%");
          $($(`.itens > .item-0 > .input-group`)[4]).css("margin-top", "33%");
          $($(`.itens > .item-0 > .input-group`)[5]).css("margin-top", "33%");
          $($(`.itens > .item-0 > .input-group`)[6]).css("margin-top", "33%");
        }
      }
    });
  }

  async function simulaFinanceiro() {
    let parcelas = [];
    for (let i = 0; i < 12; i++) {
      if ($(`#edtVencimento${i + 1}`).val() != "") {
        parcelas.push($(`#edtVencimento${i + 1}`).val());
      }
    }
    let i = 1;
    let diferenca;
    let valorNota = $("#txtValorTotal").html().substring(8).replace(".", "").replace(",", ".");
    let vValor = parseFloat((valorNota / parcelas.length).toFixed(2));
    if (
      valorNota > vValor * parcelas.length ||
      valorNota < vValor * parcelas.length
    ) {
      diferenca = (valorNota - vValor * parcelas.length).toFixed(2);
    }
    let guardaValor = vValor;
    let arrVenctos = await RetornaVencimentos(parcelas);
    $("#tabelaDuplicatas").DataTable().rows().remove().draw(false);
    parcelas.forEach((element) => {
      if (element != "") {
        if (diferenca > 0 || i == 0) {
          vValor = (vValor + parseFloat(diferenca)).toFixed(2);
          diferenca = 0;
        } else {
          vValor = guardaValor;
        }
        if (diferenca < 0 && i == parcelas.length) {
          vValor = (vValor + parseFloat(diferenca)).toFixed(2);
        }
        vValor = `<input type="text" maxlength="8" class="classeValorFin inputs input-default focus form-control maskItens" min="0" id="txtValorRec-${i}" name="txtValorRec-${i}" value="${vValor}">`;
        $("#tabelaDuplicatas").DataTable().row.add([i, arrVenctos[i - 1], vValor]).draw(false);
      }
      i++;
    });
    focuValor();
  };

  async function RetornaVencimentos(arrDias) {
    let arrVencimentos = [];
    try {
      let dataAtual = new Date();
      for (let index = 0; index < arrDias.length; index++) {
        if (arrDias[index] != "") {
          let novoPrazo = new Date();
          novoPrazo.setDate(dataAtual.getDate() + parseInt(arrDias[index]));

          const response = await requisicao("GET", "/sisplan/nfe/v1/datavencimento?", `CODCLI=${pegaChave('#txtCliente')}&DATA=${formataData(novoPrazo)}`);
          const jsonStr = await response.text();

          let novaData = jsonStr.split('/')[2] + '-' + jsonStr.split('/')[1] + '-' + jsonStr.split('/')[0];
          novaData = `<input type="date" max="2500-12-31" class="input-default focus form-control validate" id="txtDataRec-${index}" name="txtDataRec" value="${novaData}"></input>`
          arrVencimentos.push(novaData);
        }
      }
      return arrVencimentos;
    } catch (error) {
      console.error(error);
    }
  };

  function focuValor() {
    $('.classeValorFin').on('focusout', function () {
      let parcelas = [];
      let vValor = 0;
      for (let i = 0; i < 12; i++) {
        if ($(`#edtVencimento${i + 1}`).val() != "") {
          parcelas.push($(`#edtVencimento${i + 1}`).val());
          vValor += parseFloat($(`#txtValorRec-${i + 1}`).val());
        }
      }
      const valorNota = $("#txtValorTotal").html().substring(8).replace(".", "").replace(",", ".");
      vValor = parseFloat((valorNota - vValor).toFixed(2));
      const valAtual = parseFloat($(`#txtValorRec-${parcelas.length}`).val());
      if (parseFloat((vValor + valAtual).toFixed(2)) > 0) {
        $(`#txtValorRec-${parcelas.length}`).val(parseFloat((vValor + valAtual).toFixed(2)));
      } else {
        msgAlerta('Valor das parcelas é superior ao total da nota, recalculo será efetuado!');
        simulaFinanceiro();
      }
    });
  };

  async function calculaTotaisItens() {
    $.LoadingOverlay("show");
    try {
      let itens = $(".itens");

      let nota = {};
      nota.CODCLI = pegaChave("#txtCliente");
      nota.DTEMISSAO = $("#txtDataEmissao").val();
      nota.NATUREZA = pegaChave("#txtNatureza");
      nota.ITENS = [];

      for (let i = 0; i < itens.length; i++) {
        if ($(seletorPorNome("txtProduto", i)).val() != "" && $(seletorPorNome("txtPreco", i)).val() != "" && $(seletorPorNome("txtQuantidade", i)).val() != "") {
          if ($(seletorPorNome("txtProduto", i)).attr("data-codigo") != undefined && $(seletorPorNome("txtProduto", i)).attr("data-codigo") != "") {
            let item = {};
            item.CODIGO = $(seletorPorNome("txtProduto", i)).attr("data-codigo");
            item.QTDE = parseFloat($(seletorPorNome("txtQuantidade", i)).val());
            item.PRECO = parseFloat($(seletorPorNome("txtPreco", i)).val());
            item.NATUREZA = nota.NATUREZA;
            item.VALOR = item.PRECO * item.QTDE;
            nota.ITENS.push(item);
          }
        }
      }

      if (nota.ITENS.length == 0) {
        zeraTotais();
        return;
      }

      try {
        const response = await requisicao("POST", "/sisplan/fatservico/v1/retornatotais?", '', JSON.stringify(nota), 300000);

        if (!response) {
          return;
        }

        const jsonStr = await response.json();

        let qtdeTotal = 0;
        jsonStr.itens.map(item => { qtdeTotal += item.qtde; });

        $("#txtTotalLiquido").html(parseFloat(jsonStr.valor_liq).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtValorTotal").html(parseFloat(jsonStr.valor).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtTotalQtde").html(parseFloat(qtdeTotal));

        $("#txtValorPis").html(parseFloat(jsonStr.val_pis).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtValorCofins").html(parseFloat(jsonStr.val_cofins).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtValorIss").html(parseFloat(jsonStr.valor_iss).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));

        $("#txtValorCsll").html(parseFloat(jsonStr.val_csll).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtValorInss").html(parseFloat(jsonStr.val_inss).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
        $("#txtValorIrrf").html(parseFloat(jsonStr.val_irrf).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));

        $("#txtValorFinanceiro").html(parseFloat(jsonStr.valor).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));

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

    } finally {
      $.LoadingOverlay("hide");
    }
  };

  async function buscaServicos(background = false) {
    const sCodigo = $("#txtProdutoCodigo").val();
    const sDescricao = $("#txtProdutoDescricao").val().toUpperCase();

    let dataSetCols = [];
    let sWhere = "";

    sWhere += (sCodigo == '' ? '' : ` AND SERVICO.CODIGO LIKE ('[PERCENTUAL]${sCodigo}[PERCENTUAL]') `);
    sWhere += (sDescricao == '' ? '' : ` AND UPPER(SERVICO.DESCRICAO) LIKE ('[PERCENTUAL]${sDescricao}[PERCENTUAL]') `);

    try {
      if (!background) {
        $.LoadingOverlay("show");
      }

      const pesquisaParam = {
        tabela: "SERVICO",
        camposSelect: [
          "SERVICO.CODIGO",
          "SERVICO.DESCRICAO"
        ],
        where: ['1 = 1' + sWhere]
      };

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

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

      const dataSet = jsonStr;
      const keys = Object.keys(dataSet[0]);
      keys.forEach((value) => { dataSetCols.push({ title: value, data: value, }); });

      criaDataTablePadrao('#tabelaProdutos', false, false, true, false, true, false, '300px', dataSet, dataSetCols);

      $("#tabelaProdutos tbody").on("click", "tr", function () {
        $("#tabelaProdutos").dataTable().$("tr.selected").removeClass("selected");
        $(this).addClass("selected");
      });

      $("#tabelaProdutos tbody").on("dblclick", "tr", function () {
        document.firstElementChild.style.zoom = "reset";
        $("#tabelaProdutos").dataTable().$("tr.selected").removeClass("selected");
        $(this).addClass("selected");
        $("#btn_confirmar_produto").click();
      });
    } finally {
      if (!background) {
        $.LoadingOverlay("hide");
      }
    }
  }

  $(".collapse").on("shown.bs.collapse", function (e) {
    let clicked = $(document).find(`[href='#${$(e.target).attr("id")}']`);
    clicked.parent().find(".fa-angle-right").removeClass("fa-angle-right").addClass("fa-angle-down");
  }).on("hidden.bs.collapse", function (e) {
    let clicked = $(document).find(`[href='#${$(e.target).attr("id")}']`);
    clicked.parent().find(".fa-angle-down").removeClass("fa-angle-down").addClass("fa-angle-right");
  });

  $("#txtValorNota, #txtQuantidade").bind("DOMSubtreeModified", function () {
    setTimeout(() => { $(this).css("color", "red"); }, 200);
    setTimeout(() => { $(this).css("color", "inherit"); }, 2000);
  });

  $("#ultimoVoltar").click(async function () {
    if ($("#financeiroFs").hasClass("d-none")) {
      setTimeout(function () {
        $("#voltarFinanceiro").trigger("click");
      }, 100);
    }
  });

  $("#dropdown").trigger("change");

  $("#gravar").click(async function () {
    $(this).attr('disabled', true);

    if (!validaDadosItens()) {
      return;
    }

    $.LoadingOverlay("show");
    try {

      let arrayItens = [];
      for (let index = 0; index < $(".itens").length; index++) {
        if ($(seletorPorNome("txtProduto", index)).attr("data-codigo") != undefined && $(seletorPorNome("txtProduto", index)).attr("data-codigo") != "") {
          arrayItens.push({
            CODIGO: $(seletorPorNome("txtProduto", index)).attr("data-codigo"),
            DESCRICAO: $(seletorPorNome("txtProduto", index)).attr("data-descricao"),
            QUALIDADE: '1',
            QTDE: parseFloat($(seletorPorNome("txtQuantidade", index)).val()),
            PRECO: parseFloat($(seletorPorNome("txtPreco", index)).val()),
            VALOR_TOTAL: (parseFloat($(seletorPorNome("txtQuantidade", index)).val()) * parseFloat($(seletorPorNome("txtPreco", index)).val())).toFixed(2),
          });
        }
      }

      const classOs = {
        NUMERO: pegaValor('#txtNumero'),
        USUARIO: pegaValor('#txtUsuario'),
        CODREP: pegaChave('#txtVendedor'),
        CLIENTE: pegaChave('#txtCliente'),
        DT_CADASTRO: pegaValor('#txtDataEmissao'),
        DT_SAIDA: pegaValor('#txtDataSaida'),
        TERCEIRO: pegaChave('#txtExecutor'),
        DUPLICATA: pegaValor('#txtDuplicata'),
        DESCONTO: pegaValor('#txtPercDesc'),
        STATUS: pegaChave('#txtStatus'),
        REQUISITANTE: pegaValor('#txtRequisitante'),
        SETOR: pegaChave('#txtSetor'),
        OBSERVACAO: pegaValor('#txtObservacao'),
        TAB_PRE: pegaChave('#txtTabPreco'),
        DESCONTO_VALOR: pegaValor('#txtDesconto'),
        DT_BAIXA: pegaValor('#txtDtBaixa'),
        PEDIDO: pegaChave('#txtPedido'),
        EMP_FAT: pegaValor('#selectEmpresa'),
        VEICULO: pegaValor('#txtVeiculo'),
        ANO_MODELO: pegaValor('#txtAnoModelo'),
        KILOMETRAGEM: pegaValor('#txtQuilometragem'),
        CHASSI: pegaValor('#txtChassi'),
        PLACA: pegaValor('#txtPlaca'),
        ITENS: arrayItens
      };

      const response = await requisicao('POST', '/sisplan/os/v1/ordemservico?', '', `JSON=${encodeURIComponent(JSON.stringify(classOs))}`, 90000);

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

      const jsonStr = await response.json();
      if (response.status != 200) {
        $.LoadingOverlay('hide');
        msgErro(jsonStr.mensagem);
        return;
      }

      $.LoadingOverlay('hide');
      criaMensagemSucesso('Ordem de serviço gravada com sucesso.', () => { window.location.href = `${BASE_URI}/ordemservico`; });

    } catch (error) {
      console.error(error);
      $.LoadingOverlay('hide');
      msgErro(`Não foi possível gravar os dados da ordem de serviço: ${error}`);
    } finally {
      $(this).attr('disabled', false);
    }
  });

  function trocaIdClass(seletor, indice) {
    const classe = seletor.substring(1);
    $(`${seletor}-${indice}`).addClass(`${classe}-atual`).removeClass(`${classe}-${indice}`);
    $(`${seletor}-atual`).addClass(`${classe}-${indice - 1}`).removeClass(`${classe}-atual`);
  };

  async function DeleteItem(id) {
    let itens = $(".itens");
    for (let i = 0; i < itens.length; i++) {
      if (i == id) {
        $(`.item-${i}`).addClass(`removido`).removeClass(`item-${i}`);
      } else if (i > id) {
        $(`.item-${i}`).addClass(`atual`).removeClass(`item-${i}`);
        $(`.atual`).addClass(`item-${i - 1}`).removeClass(`atual`);
        trocaIdClass(`.btn-limpa`, i);
        trocaIdClass(`.btn-edit`, i);
        trocaIdClass(`.btn-add`, i);
        trocaIdClass(`.txtItem`, i);
        $(`.contador.item-${i - 1}>span`).html(i);
      }
    }
    await calculaTotaisItens();
  };

  function validaDadosItens() {
    const servico = $($(".classeProduto")[0]).val();
    const qtde = $($(".classeQuantidade")[0]).val();
    const preco = $($(".classePreco")[0]).val();

    if ([servico, qtde, preco].includes('')) {
      msgAlerta('Serviço, quantidade ou preço não informados.\nFavor voltar a aba de itens e verificar.');
      return false;
    }
    return true;
  };

  function zeraTotais() {
    $("#txtTotalLiquido").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtValorTotal").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtTotalQtde").html(parseFloat(0));

    $("#txtValorPis").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtValorCofins").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtValorIss").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));

    $("#txtValorCsll").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtValorInss").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
    $("#txtValorIrrf").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));

    $("#txtValorFinanceiro").html(parseFloat(0).toLocaleString("pt-BR", { style: "currency", currency: "BRL", }));
  };

  async function carregaValoresPadroes() {
    if ($(window.location.href.split('/')).get(-1) != 'create') {
      return;
    }

    const pesquisa = {
      camposSelect: ['CAMPO', 'VALOR'],
      tabela: 'TABPADRAO',
      where: [`TABELA = 'NOTA'`]
    }
    const jsonStr = await retornaJsonPesquisaPadrao(JSON.stringify(pesquisa));

    // jsonStr.map(item => {
    //   switch (item.CAMPO) {
    //     case 'OPERACAO': {
    //       if (item.VALOR != '') {
    //         insereValor('#txtReducao', item.VALOR, 'VALOR PADRÃO');
    //         insereValor('#txtOperacaoVenda', item.VALOR, 'VALOR PADRÃO');
    //         insereValor('#txtOperacaoNota', item.VALOR, 'VALOR PADRÃO');
    //         insereValor('#txtOperacaoMovimentacao', item.VALOR, 'VALOR PADRÃO');
    //       }
    //       break;
    //     }
    //     case 'DEPOSITO': {
    //       if (item.VALOR != '') {
    //         insereValor('#txtDeposito', item.VALOR, 'VALOR PADRÃO');
    //       }
    //       break;
    //     }
    //   }
    // });
  };

  function seletorPorNome(name, i) {
    return `.item-${i}>div>input[name*="${name}"]`;
  };

  function addPesquisaAutocompleta() {
    $("#txtCliente").autocompleta(3, `JSON={ "tabela":"entidade", "camposSelect":["CODCLI CHAVE, NOME DESCRICAO, CNPJ"], "where": ["nome <> 'CONSUMIDOR FINAL' and ativo = 'S'"] }`, ["#txtCNPJ"], ["CNPJ"], ["CNPJ"]);
    $("#btn-cliente").pesquisa_serverside(["#txtCliente", "#txtCNPJ"], ["CODCLI", "CNPJ"], ["NOME", "CNPJ"], `{"tabela":"entidade", "camposSelect":[ "CODCLI", "NOME", "FANTASIA", "CNPJ" ], "where": ["nome <> 'CONSUMIDOR FINAL' and ativo = 'S'"]}`, "Pesquisa Cliente");
    $("#btn-limpa-cliente").on("click", function () { $("#txtCliente").val(""); $("#txtCNPJ").val(""); $("#txtCliente").trigger("blur"); });

    $("#txtRepresentante").autocompleta(1, `JSON={ "tabela":"REPRESEN", "camposSelect":["CODREP CHAVE, NOME DESCRICAO"], "where": null }`);
    $("#btn-Representante").pesquisa_serverside(["#txtRepresentante"], ["CODREP"], ["NOME"], `{"tabela":"REPRESEN", "camposSelect":[ "CODREP", "NOME" ], "where": null}`, "Pesquisa Representante");
    $("#btn-limpa-Representante").on("click", function () { $("#txtRepresentante").val(""); });

    $("#txtObra").autocompleta(1, `JSON={ "tabela":"OBRA", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $("#btn-Obra").pesquisa_serverside(["#txtObra"], ["CODIGO"], ["DESCRICAO"], `{"tabela":"OBRA", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}`, "Pesquisa Obra");
    $("#btn-limpa-Obra").on("click", function () { $("#txtObra").val(""); });

    $("#txtNatureza").autocompleta(1, `JSON={ "tabela":"natureza", "camposSelect":["NATUREZA CHAVE, DESCRICAO DESCRICAO"], "where": ["ativo = 'S'"] }`);
    $("#btn-Natureza").pesquisa("#txtNatureza", "NATUREZA", "DESCRICAO", `/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"natureza", "camposSelect":[ "natureza", "descricao" ], "where": ["ativo = 'S'"]}`, "Pesquisa Natureza", "natureza");
    $("#btn-limpa-Natureza").on("click", function () { $("#txtNatureza").val(""); });

    $("#txtStatus").autocompleta(1, `JSON={ "tabela":"SITPROD", "camposSelect":["CODIGO CHAVE, DESCRICAO DESCRICAO"], "where": null }`);
    $("#btn-Status").pesquisa_serverside(["#txtStatus"], ["CODIGO"], ["DESCRICAO"], `{"tabela":"SITPROD", "camposSelect":[ "CODIGO", "DESCRICAO" ], "where": null}`, "Pesquisa Status");
    $("#btn-limpa-Status").on("click", function () { $("#txtStatus").val(""); });

    $("#txtCidade").autocompleta(1, `JSON={ "tabela":"CIDADE", "camposSelect":["CODIGO CHAVE, NOME DESCRICAO"], "where": null }`);
    $("#btn-Cidade").pesquisa_serverside(["#txtCidade"], ["CODIGO"], ["NOME"], `{"tabela":"CIDADE", "camposSelect":[ "CODIGO", "NOME" ], "where": null}`, "Pesquisa Cidade");
    $("#btn-limpa-Cidade").on("click", function () { $("#txtCidade").val(""); });

    $("#txtSituacao").autocompleta(1, `JSON={ "tabela":"tabsit", "camposSelect":["CODIGO CHAVE, DESCRICAO"], "where": [] }`);
    $("#btn-situacao").pesquisa("#txtSituacao", "CODIGO", "DESCRICAO", '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"tabsit", "camposSelect":[ "codigo", "descricao" ], "where": null}', "Pesquisa Situação", "tabsit");
    $("#btn-limpa-situacao").on("click", function () { $("#txtSituacao").val(""); });

    $("#txtClasseGer").autocompleta(1, `JSON={ "tabela":"classe_ger", "camposSelect":["CODIGO CHAVE, DESCRICAO"], "where": [] }`);
    $("#btn-classeGer").pesquisa("#txtClasseGer", "CODIGO", "DESCRICAO", '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"classe_ger", "camposSelect":[ "codigo", "descricao" ], "where": null}', "Pesquisa Classe Gerencial", "classe_ger");
    $("#btn-limpa-classeGer").on("click", function () { $("#txtClasseGer").val(""); });

    $("#txtMoeda").autocompleta(1, `JSON={ "tabela":"moeda", "camposSelect":["codmoe CHAVE, DESCRICAO"], "where": [] }`);
    $("#btnMoeda").pesquisa("#txtMoeda", "CODMOE", "DESCRICAO", '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"moeda", "camposSelect":[ "codmoe", "descricao" ], "where": null}', "Pesquisa Moeda", "moeda");
    $("#btnAMoeda").on("click", function () { $("#txtMoeda").val(""); });

    $("#txtHistorico").autocompleta(1, `JSON={ "tabela":"histcp", "camposSelect":["HISTORICO CHAVE, DESCRICAO"], "where": [] }`);
    $("#btn-historico").pesquisa("#txtHistorico", "HISTORICO", "DESCRICAO", '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"histcp", "camposSelect":[ "historico", "descricao" ], "where": null}', "Pesquisa Histórico", "histcp");
    $("#btn-limpa-historico").on("click", function () { $("#txtHistorico").val(""); });

    $("#txtBanco").autocompleta(1, `JSON={ "tabela":"cadban", "camposSelect":["BANCO CHAVE, NOME_BANCO DESCRICAO"], "where": [] }`);
    $("#btn-banco").pesquisa("#txtBanco", "BANCO", "NOME_BANCO", '/sisplan/funcoes/v1/pesquisa?JSON={ "tabela":"cadban", "camposSelect":[ "banco", "nome_banco" ], "where": null}', "Pesquisa Banco", "cadban");
    $("#btn-limpa-banco").on("click", function () { $("#txtBanco").val(""); });
  };

  function criaMascaraCampos() {
    $("#txtCom1, #txtCom2").maskMoney({
      decimal: ".",
      thousands: "",
      precision: 2,
    });
  };

});

