import { NOMBRE_SESION } from "../app/constantes.js?v=1.0.0";
import {
  mostrarMensajes,
  validarContrasenia,
} from "../app/funcionesGenerales.js?v=1.0.0";
import metodosFormularios from "../app/metodosFormularios.js?v=1.0.0";
import Usuario from "../models/usuarioModel.js?v=1.0.0";

!(function () {
  document
    .getElementById("login-form")
    .addEventListener("submit", async (e) => {
      e.preventDefault();
      configLogin.autenticar();
    });

  document
    .getElementById("request-password-form")
    .addEventListener("submit", (e) => {
      e.preventDefault();
      configLogin.enviarCorreoRestablecimiento();
    });

  document.getElementById("password-form").addEventListener("submit", (e) => {
    e.preventDefault();
    configLogin.cambiarContrasenia();
  });

  document
    .getElementById("request-password-link")
    .addEventListener("click", (e) => {
      e.preventDefault();
      configLogin.mostrarSolicitudContrasenia();
    });

  document
    .getElementById("back-to-login-link")
    .addEventListener("click", (e) => {
      e.preventDefault();
      configLogin.mostrarPrincipal();
    });
})();

window.onload = () => {
  document.querySelector(".loader") &&
    document.querySelector(".loader").classList.add("d-none");

  configLogin.campos.nuevaContrasenia.addEventListener("focus", function () {
    document.getElementById("password-contain").style.display = "block";
  });
  configLogin.campos.nuevaContrasenia.addEventListener("blur", function () {
    document.getElementById("password-contain").style.display = "none";
  });

  configLogin.campos.nuevaContrasenia.addEventListener("keyup", function () {
    validarContrasenia(this.value);
  });

  configLogin.campos.confirmacionContrasenia.addEventListener(
    "keyup",
    function () {
      validarContrasenia(this.value);
    }
  );
};

const configLogin = {
  id: 0,
  campos: {
    usuario: document.getElementById("txt-username"),
    contrasenia: document.getElementById("txt-password"),
    nuevaContrasenia: document.getElementById("txt-nueva-contrasenia"),
    confirmacionContrasenia: document.getElementById(
      "txt-confirmacion-contrasenia"
    ),
    usuarioRecuperacion: document.getElementById("txt-username-request"),
    correoRecuperacion: document.getElementById("txt-email"),
  },
  contenedores: {
    principal: document.getElementById("main-container"),
    login: document.getElementById("login-container"),
    cambioContrasenia: document.getElementById("change-password-container"),
    restablecerContrasenia: document.getElementById(
      "request-password-container"
    ),
  },
  form: "login-form",
  autenticar: async function () {
    if (!metodosFormularios.validar({ id: this.form })) return;

    try {
      const usuario = new Usuario({
        username: this.campos.usuario.value,
      });

      const respuesta = await usuario.autenticar({
        contrasenia: this.campos.contrasenia.value,
      });

      this.evaluarRespuesta(respuesta);
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  cambiarContrasenia: async function () {
    if (!metodosFormularios.validar({ id: "password-form" })) return;

    let contrasenia = this.campos.contrasenia.value,
      nuevaContrasenia = this.campos.nuevaContrasenia.value,
      confirmacionContrasenia = this.campos.confirmacionContrasenia.value;

    if (!validarContrasenia(nuevaContrasenia)) {
      mostrarMensajes.warning({
        message: "La contraseña no cumple con los requisitos de seguridad.",
      });
      return;
    }

    if (nuevaContrasenia != confirmacionContrasenia) {
      mostrarMensajes.warning({ message: "Las contraseñas no coinciden." });
      return;
    }

    if (contrasenia == nuevaContrasenia) {
      mostrarMensajes.warning({
        message: "La contraseña nueva no puede ser igual a la anterior.",
      });
      return;
    }

    try {
      let usuario = new Usuario({
        id: this.id,
        username: this.campos.usuario.value,
      });

      const respuesta = await usuario.cambiarContrasenia({
        contrasenia,
        nuevaContrasenia,
        origen: "Login",
      });

      this.evaluarRespuesta(respuesta);
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  evaluarRespuesta: async function (respuesta) {
    switch (respuesta.message) {
      case "success":
        localStorage.setItem(`${NOMBRE_SESION}-UId`, respuesta.id);
        localStorage.setItem(
          `${NOMBRE_SESION}-${respuesta.id}-UName`,
          respuesta.nombreCompleto
        );
        window.location.href = "./";
        break;
      case "correoEnviado":
        Swal.fire({
          title: "¡Éxito!",
          html: `Se envió una clave temporal al correo <strong>${respuesta.email}</strong>.`,
          icon: "success",
        }).then(() => {
          window.top.location.href = "./";
        });
        break;
      case "noEncontrado":
        mostrarMensajes.warning({ message: "Usuario no encontrado" });
        break;
      case "bloqueadoIntentosFallidos":
        mostrarMensajes.warning({
          message: "Usuario bloqueado por exceso de intentos",
        });
        break;
      case "usuarioBloqueado":
        mostrarMensajes.warning({ message: "Usuario bloqueado" });
        break;
      case "contraseniaIncorrecta":
        mostrarMensajes.warning({
          message:
            "Contraseña incorrecta <br />Intentos restantes: " +
            respuesta.intentosRestantes,
        });
        break;
      case "correoIncorrecto":
        mostrarMensajes.warning({
          message: "El correo ingresado no está asignado a tu usuario",
        });
        break;
      case "contraseniaActualIncorrecta":
        mostrarMensajes.warning({ message: "Contraseña actual incorrecta" });
        break;
      case "primerIngreso":
      case "cambioContrasenia":
        const mensaje =
          respuesta.message === "primerIngreso"
            ? "Es la primera vez que ingresas al sistema, por favor cambia tu contraseña"
            : "Se ha restablecido tu contraseña, por favor cambia tu contraseña";
        const confirmacion = await mostrarMensajes.confirm({
          message: mensaje,
          title: "¡Bienvenido!",
          confirmButtonText: "Cambiar contraseña",
          icon: "info",
        });

        if (confirmacion) {
          this.id = respuesta.id;
          this.mostrarCambioContrasenia();
        }

        if (!confirmacion) {
          mostrarMensajes.warning({
            message: "No se puede continuar sin cambiar la contraseña",
          });
        }
        break;
      default:
        mostrarMensajes.error(respuesta);
        break;
    }
  },
  mostrarSolicitudContrasenia: function () {
    this.contenedores.principal.classList.add("d-none");
    this.contenedores.restablecerContrasenia.classList.remove("d-none");
  },
  mostrarPrincipal: function () {
    this.contenedores.principal.classList.remove("d-none");
    this.contenedores.restablecerContrasenia.classList.add("d-none");
  },
  mostrarCambioContrasenia: function () {
    document.getElementById("spn-indicaciones").innerHTML =
      "Por favor ingresa tu nueva contraseña";
    this.contenedores.login.classList.add("d-none");
    this.contenedores.cambioContrasenia.classList.remove("d-none");
  },
  enviarCorreoRestablecimiento: async function () {
    if (!metodosFormularios.validar({ id: "request-password-form" })) return;

    let usuario = new Usuario({
      username: this.campos.usuarioRecuperacion.value,
      email: this.campos.correoRecuperacion.value,
    });

    const respuesta = await usuario.solicitarRestablecimientoContrasenia();

    this.evaluarRespuesta(respuesta);
  },
};
