/* =========================================================
   NOVA X — auth-modal.js
   Modal de acceso (iniciar sesión / crear cuenta) centrado
   sobre la página actual. Reutiliza la lógica de NovaAuth
   (LocalStorage) ya existente en auth.js.
   ========================================================= */

const NovaAuthModal = (() => {
  let onSuccessCallback = null;

  function getModal() {
    return document.querySelector("[data-auth-modal]");
  }

  function bloquearScroll(bloquear) {
    document.body.style.overflow = bloquear ? "hidden" : "";
  }

  function mostrarTab(tab) {
    const modal = getModal();
    if (!modal) return;
    modal.querySelectorAll("[data-auth-tab]").forEach((btn) => {
      btn.classList.toggle("is-active", btn.getAttribute("data-auth-tab") === tab);
    });
    modal.querySelectorAll("[data-auth-panel]").forEach((panel) => {
      panel.classList.toggle("is-active", panel.getAttribute("data-auth-panel") === tab);
    });
  }

  function limpiarErrores() {
    const modal = getModal();
    if (!modal) return;
    modal.querySelectorAll(".auth-error").forEach((box) => {
      box.textContent = "";
      box.classList.remove("is-visible");
    });
    modal.querySelectorAll(".form-field.has-error").forEach((f) => f.classList.remove("has-error"));
    modal.querySelectorAll(".form-check.has-error").forEach((f) => f.classList.remove("has-error"));
  }

  function abrir(tab = "login", callback = null) {
    const modal = getModal();
    if (!modal) return;
    onSuccessCallback = typeof callback === "function" ? callback : null;
    limpiarErrores();
    mostrarTab(tab);
    modal.classList.add("is-open");
    bloquearScroll(true);
    window.setTimeout(() => {
      modal.querySelector(`[data-auth-panel="${tab}"] input`)?.focus();
    }, 250);
  }

  function cerrar() {
    const modal = getModal();
    if (!modal) return;
    modal.classList.remove("is-open");
    bloquearScroll(false);
    onSuccessCallback = null;
  }

  function estaAbierto() {
    return !!getModal()?.classList.contains("is-open");
  }

  function validarCampo(campo) {
    const wrapper = campo.closest(".form-field");
    if (!wrapper) return true;
    const valido = campo.checkValidity() && campo.value.trim() !== "";
    wrapper.classList.toggle("has-error", !valido);
    return valido;
  }

  function initFormLogin() {
    const form = document.querySelector("[data-auth-login-form]");
    if (!form) return;
    const errorBox = document.querySelector("[data-auth-login-error]");

    form.addEventListener("submit", (e) => {
      e.preventDefault();
      const email = document.getElementById("am-login-email");
      const password = document.getElementById("am-login-password");

      let valido = true;
      [email, password].forEach((campo) => {
        if (!validarCampo(campo)) valido = false;
      });
      if (!valido) return;

      const resultado = NovaAuth.iniciarSesion(email.value, password.value);
      if (!resultado.ok) {
        errorBox.textContent = resultado.mensaje;
        errorBox.classList.add("is-visible");
        return;
      }

      errorBox.classList.remove("is-visible");
      NovaToast.show("Sesión iniciada. ¡Bienvenido(a)!", "✅");
      NovaAuth.actualizarUI();
      form.reset();
      const callback = onSuccessCallback;
      cerrar();
      callback?.(NovaAuth.usuarioActual());
    });
  }

  function initFormRegistro() {
    const form = document.querySelector("[data-auth-registro-form]");
    if (!form) return;
    const errorBox = document.querySelector("[data-auth-registro-error]");

    form.addEventListener("submit", (e) => {
      e.preventDefault();
      const nombre = document.getElementById("am-reg-nombre");
      const email = document.getElementById("am-reg-email");
      const password = document.getElementById("am-reg-password");
      const password2 = document.getElementById("am-reg-password2");
      const terminos = document.getElementById("am-reg-terminos");

      let valido = true;
      [nombre, email, password].forEach((campo) => {
        if (!validarCampo(campo)) valido = false;
      });

      const coinciden = password.value === password2.value && password2.value.length >= 4;
      password2.closest(".form-field").classList.toggle("has-error", !coinciden);
      if (!coinciden) valido = false;

      const aceptaTerminos = terminos.checked;
      terminos.closest(".form-check").classList.toggle("has-error", !aceptaTerminos);
      if (!aceptaTerminos) valido = false;

      if (!valido) return;

      const resultado = NovaAuth.registrar(nombre.value, email.value, password.value);
      if (!resultado.ok) {
        errorBox.textContent = resultado.mensaje;
        errorBox.classList.add("is-visible");
        return;
      }

      errorBox.classList.remove("is-visible");
      NovaToast.show("Cuenta creada. ¡Bienvenido(a) a NOVA X!", "🎉");
      NovaAuth.actualizarUI();
      form.reset();
      const callback = onSuccessCallback;
      cerrar();
      callback?.(NovaAuth.usuarioActual());
    });
  }

  /* ---------- Abre el modal desde cualquier enlace de acceso existente ---------- */
  function initAperturaGlobal() {
    const selectorAcceso = 'a[href^="perfil.html"], a[href^="login.html"], a[href^="registro.html"]';

    document.querySelectorAll(selectorAcceso).forEach((link) => {
      link.addEventListener("click", (e) => {
        e.preventDefault();
        if (NovaAuth.estaLogueado()) {
          window.location.href = "perfil.html";
          return;
        }
        const esRegistro = link.getAttribute("href").startsWith("registro.html");
        abrir(esRegistro ? "registro" : "login");
      });
    });
  }

  function initCierre() {
    const modal = getModal();
    if (!modal) return;

    modal.querySelector("[data-auth-modal-close]")?.addEventListener("click", cerrar);
    modal.querySelector("[data-auth-modal-backdrop]")?.addEventListener("click", cerrar);

    document.addEventListener("keydown", (e) => {
      if (e.key === "Escape" && estaAbierto()) cerrar();
    });

    modal.querySelectorAll("[data-auth-tab]").forEach((btn) => {
      btn.addEventListener("click", () => {
        limpiarErrores();
        mostrarTab(btn.getAttribute("data-auth-tab"));
      });
    });

    modal.querySelectorAll("[data-auth-switch]").forEach((link) => {
      link.addEventListener("click", (e) => {
        e.preventDefault();
        limpiarErrores();
        mostrarTab(link.getAttribute("data-auth-switch"));
      });
    });
  }

  function init() {
    if (!getModal()) return;
    initCierre();
    initFormLogin();
    initFormRegistro();
    initAperturaGlobal();
  }

  return { init, abrir, cerrar, estaAbierto };
})();
window.NovaAuthModal = NovaAuthModal;
