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

  async function getAllUsers() {
    // <option value="WY">Wyoming</option>
    try {
      try {
        const pesquisa = {
          tabela: 'ACESSO_USUARIOS',
          camposSelect: ['CODIGO', 'NOME'],
          where: [`CODIGO <> '9999'`]
        }
        const url = `/sisplan/funcoes/v1/pesquisa?JSON=${JSON.stringify(pesquisa)}`;
        const response = await requisicao('GET', '', url, null, 20000);

        if (!response) {
          return;
        }

        if (response.status != 200) {
          msgErro(result['RESULT'][0].mensagem);
          return;
        }

        const result = await response.json();
        if (result['RESULT'][0]) {
          const dados = result['RESULT'][0];
          const arrUsuarios = dados.map(dado => {
            return `<option value="${dado.CODIGO}">${dado.NOME}</option>`;
          });
          // $('#txtNotificacaoDestino').append(`<option value=""></option>`);
          $("#txtNotificacaoDestino").empty();
          $('#txtNotificacaoDestino').append(arrUsuarios);

          $("#txtNotificacaoDestino").select2({
            multiple: true,
            allowClear: true,
            placeholder: $traducaoSelecioneOsRegistros[['I', 'E', 'M'].includes(getCookie('idiomaUsuario')) ? getCookie('idiomaUsuario') : 'P']
          });
          $('#txtNotificacaoDestino').val(null).trigger('change');
        }
      } catch (error) {
        msgErro('Erro ao buscar usuários');
        return;
      }
    } finally {

    }

  }

  async function getUnreadNotifications() {
    try {
      try {
        const codUsuario = getCookie('cod_usuario');
        const pesquisa = {
          tabela: 'NOTIFICACAOWEB',
          camposSelect: ['ID', 'DESCRICAO', 'DT_CADASTRO', 'DT_LEITURA', 'LIDO', 'ORIGEM', 'TIPO'],
          where: [`USUARIO_DESTINO = '${codUsuario}' AND LIDO='N'`]
        }
        const url = `/sisplan/funcoes/v1/pesquisa?JSON=${JSON.stringify(pesquisa)}&REPLACE_LINE_BREAK=S`;
        const response = await requisicao('GET', '', url, null, 20000);

        if (!response) {
          return;
        }

        const result = await response.json();
        if (response.status != 200) {
          msgErro(result['RESULT'][0].mensagem);
          return;
        }

        if (result['RESULT'][0]) {
          const dados = result['RESULT'][0];
          const conteudo = dados.map((notificacao => {
            const dataFormatada = new Intl.DateTimeFormat('default', {
              year: 'numeric', month: 'numeric', day: 'numeric',
              hour: 'numeric', minute: 'numeric', second: 'numeric',
              hour12: false
            }).format(new Date(notificacao.DT_CADASTRO));
            return (
              `<div class="dropdown-divider"></div>` +
              ` <a style="width: 100%; display: flex;align-items: center;justify-content: flex-start;grid-gap:1rem" data-id="${notificacao.ID}" href="#" class="dropdown-item notificacao">` +
              `  <i class="fas fa-exclamation-triangle"></i> <span class="text-sm">${notificacao.DESCRICAO.substring(0, 50)+'...'}</span>` +
              `  <span class="float-right text-muted text-sm">${dataFormatada}</span>` +
              `</a>`
            ).replaceAll(',', '|');
          })).toString().replaceAll(',', '').replaceAll('|', ',');

          $('#div_notificacoes').html(
            `<div class="flex align-items-center"><span class="dropdown-item dropdown-header">Notificações</span><button id="btnAddNotificacao" class="btn btn-danger btn-xs"><i class="fas fa-plus"></i></button></div>` +
            `${conteudo}` +
            `<div class="dropdown-divider"></div>`
          );

          $('.notificacao').on('click', async function () {
            $('#txtNotificacaoId').val($(this).attr('data-id'));
            const dados = await getNotificationInfo($(this).attr('data-id'));
            $('#divNotificacaoDestino').addClass('d-none');
            $('#txtNotificacaoDesc').attr('disabled', true).attr('readonly', true).val('');
            $('#txtNotificacaoDestino').val(null).trigger('change');
            adicionaEventoConfirmarNotificacao();
            $('#txtNotificacaoData').val(dados.DT_CADASTRO);
            $('#txtNotificacaoOrigem').val(dados.ORIGEM);
            $('#txtNotificacaoDesc').val(dados.DESCRICAO);
            $('#modalNotificacao').modal('show');
          });


        } else {
          $('#div_notificacoes').html(
            `<div class="flex align-items-center"><span class="dropdown-item dropdown-header">Notificações</span><button id="btnAddNotificacao" class="btn btn-danger btn-xs"><i class="fas fa-plus"></i></button><div>` +
            `<div class="dropdown-divider"></div>`
          );
        }

        $('#btnAddNotificacao').on('click', function () {
          const usuario = getCookie('usuario');
          const today = new Date();//.toISOString().split('T')[0];
          today.setTime(today.getTime() - (3 * 60 * 60 * 1000));
          const dataFormatada = today.toISOString().split('T')[0];
          const horaFormatada = today.toISOString().split('T')[1].substring(0, 5);
          $('#txtNotificacaoData').val(dataFormatada + ' ' + horaFormatada);
          $('#txtNotificacaoOrigem').val(usuario);
          $('#txtNotificacaoDesc').attr('disabled', false).attr('readonly', false).val('');
          $('#modalNotificacao').modal('show');
          $('#divNotificacaoDestino').removeClass('d-none');
          $('#btnConfirmarNotificacao').off('click');
          $('#btnConfirmarNotificacao').on('click', async function () {
            const destinos = $('#txtNotificacaoDestino').val();
            const descricao = $('#txtNotificacaoDesc').val();
            if (destinos.length == 0) {
              msgErro('Necessário informar um destino válido.');
              return;
            }

            if (descricao == '') {
              msgErro('Necessário informar uma descrição.');
              return;
            }

            await saveNotification(descricao, destinos, 'Usuario', getCookie('usuario'));
            await toastr
              .success('Notificação criada com sucesso.', "Confirmação", {
                toastClass: "alert",
                iconClasses: {
                  error: "alert-error",
                  info: "alert-info",
                  success: "alert-success",
                  warning: "alert-warning",
                },
                positionClass: "toast-top-center",
                progressBar: true,
                timeOut: 3000,
                fadeOut: 1000,
                async onHidden() {
                  getNumberOfUnreadNotifications();
                  $('#botao_notificacoes').trigger('click');
                  $('#modalNotificacao').modal('hide');
                },
              })
              .css({
                "margin-top": "20%",
                width: "500px",
                "max-width": "500px",
              });
          });

          $('#txtNotificacaoDesc').focus();
        });


      } catch (error) {
        $('#div_notificacoes').html(
          `<div class="flex align-items-center"><span class="dropdown-item dropdown-header">Notificações</span><button id="btnAddNotificacao" class="btn btn-danger btn-xs"><i class="fas fa-plus"></i></button><div>` +
          `<div class="dropdown-divider"></div>`
        );
      }
    } finally {
      if (!$('#botao_notificacoes').parent().hasClass('show')) {
        $('#botao_notificacoes').parent().addClass('show');
        $('#div_notificacoes').addClass('show');
        $('#div_notificacoes').css('display', 'flex');
      }
    }
  }


  async function getNumberOfUnreadNotifications() {
    try {
      const codUsuario = getCookie('cod_usuario');
      const pesquisa = {
        tabela: 'NOTIFICACAOWEB',
        camposSelect: ['COUNT(*) QUANTIDADE'],
        where: [`USUARIO_DESTINO = '${codUsuario}' AND LIDO = 'N'`]
      }
      const url = `/sisplan/funcoes/v1/pesquisa?JSON=${JSON.stringify(pesquisa)}`;
      const response = await requisicao('GET', '', url, null, 20000);

      if (!response) {
        return;
      }

      const result = await response.json();
      if (response.status != 200) {
        msgErro(jsonStr['RESULT'][0].mensagem);
        return;
      }

      if (result['RESULT'][0][0].QUANTIDADE) {
        $('#numero_notificacoes').html(result['RESULT'][0][0].QUANTIDADE);
      } else {
        $('#numero_notificacoes').html(0);
      }

      if ($('#numero_notificacoes').html() === '0') {
        $('#numero_notificacoes').removeClass('notificacao-pulsando');
      }
    } catch (error) {
      $('#numero_notificacoes').html(0);
    }
  }

  async function getNotificationInfo(id) {
    try {
      const pesquisa = {
        tabela: 'NOTIFICACAOWEB',
        camposSelect: ['DESCRICAO', 'DT_CADASTRO', 'DT_LEITURA', 'LIDO', 'ORIGEM', 'TIPO'],
        where: [`ID = '${id}'`]
      }
      const url = `/sisplan/funcoes/v1/pesquisa?JSON=${JSON.stringify(pesquisa)}`;
      const response = await requisicao('GET', '', url, null, 20000);

      if (!response) {
        return;
      }

      const result = await response.json();
      if (response.status != 200) {
        msgErro(jsonStr['RESULT'][0].mensagem);
        return;
      }

      return result['RESULT'][0][0];
    } catch (error) {
      console.error(error);
    }
  }

  async function saveNotification(descricao, usuario_destino, tipo, origem) {
    const url = `/sisplan/notificacaoweb/v1/salvar?`;
    try {
      try {
        $.LoadingOverlay("show");
        for (let i = 0; i < usuario_destino.length; i++) {
          const usuario = usuario_destino[i];
          const objeto = {
            descricao: descricao,
            usuarioDestino: usuario,
            tipo: tipo,
            origem: origem,
            lido: 'N',
            dt_cadastro: `${formataData(new Date())}T00:00:00Z`,
            id_Ace_Usu_Orig: getCookie('id_usuario')
          }
          const response = await requisicao("POST", url, "", encodeURIComponent(JSON.stringify(objeto)), 120000);

          if (!response) {
            msgErro("Não foi possível salvar a notificação.");
            return;
          }

          // let jsonStr = await response.json();
          if (response.status != 200) {
            msgErro("Não foi possível salvar a notificação.");
            return;
          }
        }
      } catch (error) {
        console.error(error);
        msgErro("Não foi possível salvar a notificação.");
        return;
      }
    } finally {
      $.LoadingOverlay("hide");
    }
  }

  async function setNotificationAsRead(id) {
    const url = `/sisplan/notificacaoweb/v1/setarcomolida?`;
    try {
      try {
        $.LoadingOverlay("show");

        const response = await requisicao("POST", url, `id=${id}`, null, 120000);

        if (!response) {
          msgErro("Não foi possível setar a notificação como lida.");
          return;
        }

        // let jsonStr = await response.json();
        if (response.status != 200) {
          msgErro("Não foi possível setar a notificação como lida.");
          return;
        }
      } catch (error) {
        console.error(error);
        msgErro("Não foi possível setar a notificação como lida.");
        return;
      }
    } finally {
      $.LoadingOverlay("hide");
    }
  }

  await getNumberOfUnreadNotifications();

  $('#botao_notificacoes').on('click', async function () {
    await getAllUsers();
    const dropdownAtivo = $('#botao_notificacoes').parent().hasClass('show');
    if (!dropdownAtivo) {
      await getUnreadNotifications();
    } else {
      $('#botao_notificacoes').parent().removeClass('show');
      $('#div_notificacoes').removeClass('show');
      $('#div_notificacoes').css('display', 'none');
    }
  });

  $('#btnFiltrosNotificacao').on('click', async function () {
    $('#modal-filtros-Notificacao').modal('show');
  });

  // $('#txtUsuarioOrigem').pesquisa_variosServerside(1, '{ "tabela":"ACESSO_USUARIOS", "camposSelect":[ "CODIGO", "NOME" ], "where": null}', 'CODIGO', 'NOME');
  // $('#btn-UsuarioOrigem').pesquisa_serversideSel('#txtUsuarioOrigem', `{ "tabela":"ACESSO_USUARIOS", "camposSelect":[ "CODIGO", "NOME"], "where": null}`, 'Pesquisa de usuários');
  // $('#btn-limpa-UsuarioOrigem').on('click', function () {
  //   $('#txtUsuarioOrigem').empty().trigger('change');
  //   $('#txtUsuarioOrigem').val('');
  //   $('#txtUsuarioOrigem').attr('data-chave', '');
  //   $('#txtUsuarioOrigem').attr('data-desc', '');
  // });

  const txtUsuarioDestino = $('#txtUsuarioDestino');

  if (txtUsuarioDestino.length) {
    txtUsuarioDestino.pesquisa_variosServerside(
      1,
      '{ "tabela":"ACESSO_USUARIOS", "camposSelect":[ "CODIGO", "NOME" ], "where": null}',
      'CODIGO',
      'NOME'
    );
  }
  $('#btn-UsuarioDestino').pesquisa_serversideSel('#txtUsuarioDestino', `{ "tabela":"ACESSO_USUARIOS", "camposSelect":[ "CODIGO", "NOME"], "where": null}`, 'Pesquisa de usuários');
  $('#btn-limpa-UsuarioDestino').on('click', function () {
    $('#txtUsuarioDestino').empty().trigger('change');
    $('#txtUsuarioDestino').val('');
    $('#txtUsuarioDestino').attr('data-chave', '');
    $('#txtUsuarioDestino').attr('data-desc', '');
  });

  $('#btnConsultarNotificacoes').on('click', async function () {
      await consultaNotificacoes();
  });

  async function consultaNotificacoes() {
    $.LoadingOverlay('show');
    try {
      if ($.fn.DataTable.isDataTable('#tabelaNotificacoes')) {
        $('#tabelaNotificacoes').DataTable().destroy();
        $('#tabelaNotificacoes').empty();
      }
      const url = `/sisplan/notificacaoweb/v1/buscanotificacoes?`;
      const fitlros = await retornaFiltrosNotificacao();
      const response = await requisicao('GET', url, fitlros, null);
      if (!response) {
        return;
      }
      const jsonStr = await response.json();

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

      const colunasItens = [
        { title: 'Id', data: 'ID' },
        { title: 'Dt. Cadastro', data: 'DT_CADASTRO' },
        { title: 'Lido', data: 'LIDO' },
        { title: 'Dt. Leitura', data: 'DT_LEITURA' },
        { title: 'Origem', data: 'ORIGEM' },
        { title: 'Usuário Origem', data: 'USUARIO_ORIGEM' },
        { title: 'Nome Usuário Origem', data: 'NOME_USUARIO_ORIGEM' },
        { title: 'Usuário Destino', data: 'USUARIO_DESTINO' },
        { title: 'Nome Usuário Destino', data: 'NOME_USUARIO_DESTINO' },
        { title: 'Descrição', data: 'DESCRICAO' },
      ]

      $('#tabelaNotificacoes').DataTable({
        destroy: true,
        colReorder: true,
        paging: true,
        sort: false,
        sorting: false,
        order: false,
        autoWidth: true,
        search: false,
        filter: false,
        "data": jsonStr,
        "columns": colunasItens,
        "columnDefs": [{
          "type": 'date-br',
          "targets": [1, 3],
          "render": function (data) {
            if (data != undefined) {
              x = data.slice(0, 10).split('-');
              return `${x[2]}/${x[1]}/${x[0]}`;
            } else {
              return ''
            }
          }
        },
        {
          targets: [0],
          "className": 'pr-4 text-right'
        }]
      });
    } catch (error) {
      console.error(error); 
    } finally {
      $.LoadingOverlay('hide');
    }
  }

  $('#cbEnviados').on('click', () => {
    if ($('#cbEnviados').is(':checked')) {
      $('#cbRecebidos').prop('checked', false);
    }
  });

  $('#cbRecebidos').on('click', () => {
    if ($('#cbRecebidos').is(':checked')) {
      $('#cbEnviados').prop('checked', false);
    }
  });

  $('#cbConcluido').on('click', () => {
    if ($('#cbConcluido').is(':checked')) {
      $('#cbPendente').prop('checked', false);
    }
  });

  $('#cbPendente').on('click', () => {
    if ($('#cbPendente').is(':checked')) {
      $('#cbConcluido').prop('checked', false);
    }
  });

  async function retornaFiltrosNotificacao() {
    const cadastroDe = $('#txtCadastroDe').val() ? `${$('#txtCadastroDe').val()} 00:00:00` : '';
    const cadastroAte = $('#txtCadastroAte').val() ? `${$('#txtCadastroAte').val()} 23:59:59` : '';
    const concluidoDe = $('#txtConcluidoDe').val() ? `${$('#txtConcluidoDe').val()} 00:00:00` : '';
    const concluidoAte = $('#txtConcluidoAte').val() ? `${$('#txtConcluidoAte').val()} 23:59:59` : '';
    const usuarioOrigem = await formataListas($('#txtUsuarioOrigem').val().toString());  
    const usuarioDestino = await formataListas($('#txtUsuarioDestino').val().toString());  
    const enviados = isChecked('#cbEnviados') ? 'S' : 'N';
    const recebidos = isChecked('#cbRecebidos') ? 'S' : 'N';
    const concluido = isChecked('#cbConcluido') ? 'S' : 'N';
    const pendente = isChecked('#cbPendente') ? 'S' : 'N';

    const retorno =
      `USUARIO_DESTINO=${usuarioDestino}` +
      `&USUARIO_ORIGEM=${usuarioOrigem}` +
      `&CADASTRO_DE=${cadastroDe}` +
      `&CADASTRO_ATE=${cadastroAte}` +
      `&CONCLUIDO_DE=${concluidoDe}` +
      `&CONCLUIDO_ATE=${concluidoAte}` +
      `&ENVIADOS=${enviados}` +
      `&RECEBIDOS=${recebidos}` +
      `&CONCLUIDO=${concluido}` +
      `&PENDENTE=${pendente}`;

    return retorno;
  }

  async function adicionaEventoConfirmarNotificacao() {
    $('#btnConfirmarNotificacao').off('click');
    $('#btnConfirmarNotificacao').on('click', async function () {
      const id = $('#txtNotificacaoId').val();
      await setNotificationAsRead(id);
      await toastr
        .success('Confirmado leitura da notificação', "Confirmação", {
          toastClass: "alert",
          iconClasses: {
            error: "alert-error",
            info: "alert-info",
            success: "alert-success",
            warning: "alert-warning",
          },
          positionClass: "toast-top-center",
          progressBar: true,
          timeOut: 3000,
          fadeOut: 1000,
          async onHidden() {
            getNumberOfUnreadNotifications();
            $('#botao_notificacoes').trigger('click');
            $('#modalNotificacao').modal('hide');
          },
        })
        .css({
          "margin-top": "20%",
          width: "500px",
          "max-width": "500px",
        });
    });
  }
});