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

  const colunasNotas = [
    { title: 'Chave', data: 'CHAVE_NFE' },
    { title: 'Volumes', data: 'VOLUMES' },
    { title: 'Peso', data: 'PESO' },
    { title: 'Excluir', data: 'EXCLUIR' },
  ];

  const urlFal = $(window.location.href.split('/')).get(-1);

  addBotoesAvancarVoltar();
  criaDataTablePadrao('#tabelaItens', false, false, false, false, true, true, '500px', undefined, colunasNotas, [], [], [], [1, 2], undefined, undefined, undefined, undefined, undefined, [], [1, 2]);
  criaDataTablePadrao('#tabelaItensResumo', false, false, false, false, true, true, '300px', undefined, colunasNotas, [3], [], [], [1, 2], undefined, undefined, undefined, undefined, undefined, [], [1, 2]);
  addMaskCnpj();
  addMaskTelefone();
  addPesquisa();

  await validaEdicao();

  $('#txtCnpj').on('blur', async function () {
    const cnpj = $('#txtCnpj').val();
    
    if (cnpj == '') {
      return;
    }

    await carregaDados(cnpj);
  });

  $('#txtCep').on('blur', async function () {
    const cep = $('#txtCep').val();
    
    if (cep == '') {
      return;
    }

    const infos = await buscaCadastraCep(cep);

    insereValor('#txtLogradouro', infos.rua);
    insereValor('#txtBairro', infos.bairro);
    insereValor('#txtCidade', infos.cidade);
    insereValor('#txtUF', infos.uf);
  });

  $("#fileXml").change(async function (event) {
    event.preventDefault();
    const x2js = new X2JS();
    let readXml = null;
    let selectedFile = document.getElementById("fileXml").files[0];
    let reader = new FileReader();
    reader.onload = async function (e) {
      readXml = e.target.result;
      jsonXml = JSON.parse(JSON.stringify(x2js.xml_str2json(readXml)));
      insereNota(jsonXml);
    };
    reader.readAsText(selectedFile);
  });

  function insereNota(jsonXml) {
    const chave = jsonXml.nfeProc.NFe.infNFe._Id.replace('NFe', '');
    const volumes = jsonXml?.nfeProc?.NFe?.infNFe?.transp?.vol?.qVol || 1;
    const peso = jsonXml?.nfeProc?.NFe?.infNFe?.transp?.vol?.pesoB || 0;

    if ($('#tabelaItens').DataTable().column(0).data().toArray().includes(chave)) {
      msgAlerta('Nota já adicionada a solicitação.');
      return;
    }

    $('#tabelaItens').DataTable().row.add({
      CHAVE_NFE: chave,
      VOLUMES: volumes,
      PESO: peso,
      EXCLUIR: retornaBotaoExcluir()
    }).draw(false);

    calculaTotais();
  };

  $('#tabelaItens').on('click', '#btn-excluir', async function () {
    $("#tabelaItens").DataTable().row($(this).parents("tr")).remove().draw(false);
    calculaTotais();
  });

  $('#btnVoltar').on('click', function () {
    window.location.href = `${BASE_URI}/solicitacaocoleta`;
  });

  $('#btnGravar').on('click', async function () {
    if ($('#tabelaItens').DataTable().rows().count() == 0) {
      msgAlerta('Necessário adicionar pelo menos um item a solicitação.')
      return;
    }

    await gravaDados();
  });

  $('#avancar2').on('click', function () {
    carregaResumo();
  });

  async function gravaDados() {
    $.LoadingOverlay('show');
    try {
      const solicitacao = {
        ID: pegaValor('#txtID'),
        EMP_ID: getCookie('emp_id'),
        CNPJ_RETIRADA: pegaValor('#txtCnpj'),
        CEP: pegaValor('#txtCep'),
        LOGRADOURO: pegaValor('#txtLogradouro'),
        NUMERO: pegaValor('#txtNumero'),
        BAIRRO: pegaValor('#txtBairro'),
        CIDADE: pegaValor('#txtCidade'),
        UF: pegaValor('#txtUF'),
        COMPLEMENTO: pegaValor('#txtComplemento'),
        DT_RETIRADA: $("#txtDtRetirada").val() != '' ? `${$("#txtDtRetirada").val()}T00:00:00Z` : `1899-01-01T00:00:00Z`,
        HR_RETIRADA_DE: $("#txtHrDe").val() != '' ? `1899-01-01T${$("#txtHrDe").val()}:00Z` : `1899-01-01T00:00:00Z`,
        HR_RETIRADA_ATE: $("#txtHrAte").val() != '' ? `1899-01-01T${$("#txtHrAte").val()}:00Z` : `1899-01-01T23:59:00Z`,
        RESPONSAVEL: pegaValor('#txtResponsavel'),
        CONTATO: pegaValor('#txtContato'),
        TIPO: pegaValor('#rgTipo'),
        OBS: pegaValor('#txtObs'),
        EMAIL: pegaValor('#txtEmail'),  
        COD_USUARIO: getCookie('cod_usuario'),
        ITENS: retornaItens()
      }

      const response = await requisicao('POST', '/sisplan/cadastros/v1/solicitacaocoleta?', '', JSON.stringify(solicitacao));

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

      const jsonStr = await response.json();

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

      $.LoadingOverlay('hide');
        
      criaMensagemSucesso(`Solicitação de coleta cadastrada com sucesso!`, async () => { window.location.href = `${BASE_URI}/solicitacaocoleta` });
    } finally {
      $.LoadingOverlay('hide');
    }
  };

  function carregaResumo() {
    insereValor('#txtIDResumo', $('#txtID').val());
    insereValor('#txtDtRetiradaResumo', $('#txtDtRetirada').val());
    insereValor('#txtHrDeResumo', $('#txtHrDe').val());
    insereValor('#txtHrAteResumo', $('#txtHrAte').val());
    $('#rgTipoResumo').val($('#rgTipo').val()).change();
    insereValor('#txtLocalResumo', `CEP: ${pegaValor('#txtCep')}, ${pegaValor('#txtLogradouro')}, ${pegaValor('#txtNumero')}, ${pegaValor('#txtBairro')}, ${pegaValor('#txtCidade')} - ${pegaValor('#txtUF')}`);
    insereValor('#txtContatoResumo', `${pegaValor('#txtResponsavel')} | ${pegaValor('#txtContato')} | ${pegaValor('#txtEmail')}`);

    $('#tabelaItensResumo').DataTable().clear();
    $('#tabelaItens').DataTable().rows().data().map(item => {
      $('#tabelaItensResumo').DataTable().row.add({
        CHAVE_NFE: item.CHAVE_NFE,
        VOLUMES: item.VOLUMES,
        PESO: item.PESO,
        EXCLUIR: ''
      }).draw(false);
    });
  }

  function retornaItens() {
    let arrItens = [];
    $('#tabelaItens').DataTable().rows().data().map(item => {
      arrItens.push(item);
    });
    return arrItens;
  };

  async function validaEdicao() {
    if (urlFal == 'create') {
      return;
    }

    $.LoadingOverlay('show');
    try {
      const pesquisaParam = {
        tabela: 'SOL_COLETA',
        camposSelect: [
          'SOL_COLETA.CNPJ_RETIRADA', 'ENTIDADE.NOME', 'SOL_COLETA.CEP', 'SOL_COLETA.LOGRADOURO', 'SOL_COLETA.BAIRRO',
          'SOL_COLETA.CIDADE', 'SOL_COLETA.UF', 'SOL_COLETA.NUMERO', 'SOL_COLETA.COMPLEMENTO', 'SOL_COLETA.DT_RETIRADA',
          'SOL_COLETA.HR_RETIRADA_DE', 'SOL_COLETA.HR_RETIRADA_ATE', 'SOL_COLETA.RESPONSAVEL', 'SOL_COLETA.CONTATO',
          'SOL_COLETA.TIPO', 'SOL_COLETA.OBS', 'SOL_COLETA_IT.CHAVE_NFE', 'SOL_COLETA_IT.VOLUMES', 'SOL_COLETA_IT.PESO',
          'SOL_COLETA.EMAIL'
        ],
        leftJoin: [
          { tabela: 'ENTIDADE', condicao: 'SOL_COLETA.CNPJ_RETIRADA = ENTIDADE.CNPJ ' },
          { tabela: 'SOL_COLETA_IT', condicao: 'SOL_COLETA_IT.ID_SOLCOL = SOL_COLETA.ID ' }
        ],
        where: [`SOL_COLETA.ID = ${urlFal}`]
      };

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

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

      insereValor('#txtID', urlFal);
      insereValor('#txtCnpj', jsonStr[0].CNPJ_RETIRADA);
      insereValor('#txtNome', jsonStr[0].NOME);
      insereValor('#txtCep', jsonStr[0].CEP);
      insereValor('#txtLogradouro', jsonStr[0].LOGRADOURO);
      insereValor('#txtBairro', jsonStr[0].BAIRRO);
      insereValor('#txtNumero', jsonStr[0].NUMERO);
      insereValor('#txtComplemento', jsonStr[0].COMPLEMENTO);
      insereValor('#txtCidade', jsonStr[0].CIDADE);
      insereValor('#txtUF', jsonStr[0].UF);
      insereValor('#txtDtRetirada', jsonStr[0].DT_RETIRADA);
      insereValor('#txtHrDe', jsonStr[0].HR_RETIRADA_DE.split(' ')[1].substring(0, 5));
      insereValor('#txtHrAte', jsonStr[0].HR_RETIRADA_ATE.split(' ')[1].substring(0, 5));
      insereValor('#txtResponsavel', jsonStr[0].RESPONSAVEL);
      insereValor('#txtContato', jsonStr[0].CONTATO);
      insereValor('#rgTipo', jsonStr[0].TIPO);
      insereValor('#txtObs', jsonStr[0].OBS);
      insereValor('#txtEmail', jsonStr[0].EMAIL);
      $('#rgTipo').trigger('change');

      jsonStr.map(item => {
        $('#tabelaItens').DataTable().row.add({
          CHAVE_NFE: item.CHAVE_NFE,
          VOLUMES: item.VOLUMES,
          PESO: item.PESO,
          EXCLUIR: retornaBotaoExcluir()
        }).draw(false);
      });

      calculaTotais();

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

  async function carregaDados(cnpj) {
    $.LoadingOverlay('show');
    try {
      if (cnpj[0] == '[') {
        cnpj = pegaChave(cnpj);
        $('#txtCnpj').val(cnpj);
      }

      const pesquisaParam = {
        tabela: 'ENTIDADE',
        camposSelect: [
          'ENTIDADE.NOME', 'ENTIDADE.CEP', 'ENTIDADE.ENDERECO', 'ENTIDADE.BAIRRO',
          'ENTIDADE.NUMERO', 'ENTIDADE.COMPLEMENTO', 'CIDADE.NOME NOME_CIDADE', 'CADCEP.ESTCEP'
        ],
        leftJoin: [
          { tabela: 'CADCEP', condicao: 'CADCEP.CEP = ENTIDADE.CEP ' },
          { tabela: 'CIDADE', condicao: 'CIDADE.CODIGO = CADCEP.CODMUN ' }
        ],
        where: [`ENTIDADE.CNPJ = '${cnpj}'`]
      };

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

      if (jsonStr.length == 0) {
        msgAlerta('CNPJ não cadastrado, favor verificar.');
        $('#txtCnpj').val('');
        return;
      }

      insereValor('#txtNome', jsonStr[0].NOME);
      insereValor('#txtCep', jsonStr[0].CEP);
      insereValor('#txtLogradouro', jsonStr[0].ENDERECO);
      insereValor('#txtBairro', jsonStr[0].BAIRRO);
      insereValor('#txtNumero', jsonStr[0].NUMERO);
      insereValor('#txtComplemento', jsonStr[0].COMPLEMENTO);
      insereValor('#txtCidade', jsonStr[0].NOME_CIDADE);
      insereValor('#txtUF', jsonStr[0].ESTCEP);

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

  function addMaskTelefone() {
    const msk = function (val) {
        return val.replace(/\D/g, '').length === 11 ? '(00) 0 0000-0000' : '(00) 0000-00009';
    },
    options = {
        onKeyPress: function (val, e, field, options) {
            field.mask(msk.apply({}, arguments), options);
        }
    };

    $('#txtContato').mask(msk, options);
  }

  function addMaskCnpj() {
    let options = {
        onKeyPress(cpf, ev, el, op) {
            let masks = ["00.000.000/0000-00"];
            $("#txtCnpj").mask(masks[0], op);
        },
    };

    $("#txtCnpj").mask("00.000.000/0000-00", options);
  }

  function calculaTotais() {
    let totNotas = $('#tabelaItens').DataTable().rows().count();
    let totPeso = 0;
    let totVolumes = 0;

    $('#tabelaItens').DataTable().rows().data().map(item => {
      totPeso += parseFloat(item.PESO);
      totVolumes += parseInt(item.VOLUMES);
    });

    $('#txtQtdeNotas').val(totNotas);
    $('#txtPesoTotal').val(totPeso);
    $('#txtVolumesTotal').val(totVolumes);

    $('#txtQtdeNotasResumo').val(totNotas);
    $('#txtPesoTotalResumo').val(totPeso);
    $('#txtVolumesTotalResumo').val(totVolumes);
  }

  function addPesquisa() {
    $("#btnCnpj").pesquisa_serverside(["#txtCnpj"], ["CNPJ"], ["CNPJ"], `{"tabela":"entidade", "camposSelect":[ "CNPJ", "NOME" ], "where": ["CNPJ IN (select cnpj_retirada from sol_coleta where cod_usuario = '${getCookie('cod_usuario')}') "]}`, "Pesquisa Local Retirada", () => { $('#txtCnpj').trigger('blur'); });
  } 

  function retornaBotaoExcluir() {
    return '<div class="divBtnOpcoes"> ' +
      '       <button class="botaoOpcoes" type="button" title="Excluir" id="btn-excluir"><span class="fas fa-trash-alt" style="color:red"></span></button>  ' +
      '     </div>';
  };

  function addBotoesAvancarVoltar() {
    $(".next").click(async function () {
      if (($(this).attr("id") == "avancar2") && ($('#tabelaItens').DataTable().rows().count() == 0)) {
        msgAlerta('Necessário adicionar pelo menos um item a solicitação.')
        return;
      }

      currentFs = $(this).parent();
      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,
        }
      );
      $("#tabelaItens").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,
        }
      );
      $("#tabelaItens").DataTable().columns.adjust().draw(false);
    });
  };
});