/* ELEVX GROUP — site behaviour (no dependencies) */
(function () {
  "use strict";

  /* ---------- theme ---------- */
  var root = document.documentElement;
  var stored = null;
  try { stored = localStorage.getItem("elevx-theme"); } catch (e) {}
  var prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches;
  var theme = stored || (prefersDark ? "dark" : "light");
  root.setAttribute("data-theme", theme);

  var toggle = document.getElementById("themeToggle");
  function syncToggle() {
    if (!toggle) return;
    var dark = root.getAttribute("data-theme") === "dark";
    toggle.setAttribute("aria-pressed", String(dark));
    toggle.textContent = dark ? "Cambiar a tema claro" : "Cambiar a tema oscuro";
  }
  if (toggle) {
    syncToggle();
    toggle.addEventListener("click", function () {
      var next = root.getAttribute("data-theme") === "dark" ? "light" : "dark";
      root.setAttribute("data-theme", next);
      try { localStorage.setItem("elevx-theme", next); } catch (e) {}
      syncToggle();
    });
  }

  /* ---------- mobile navigation ---------- */
  var navToggle = document.getElementById("navToggle");
  var nav = document.getElementById("siteNav");
  if (navToggle && nav) {
    var setOpen = function (open) {
      nav.classList.toggle("open", open);
      navToggle.setAttribute("aria-expanded", String(open));
      navToggle.setAttribute("aria-label", open ? "Cerrar menú" : "Abrir menú");
    };
    navToggle.addEventListener("click", function () {
      setOpen(!nav.classList.contains("open"));
    });
    nav.addEventListener("click", function (e) {
      if (e.target.closest("a")) setOpen(false);
    });
    document.addEventListener("keydown", function (e) {
      if (e.key === "Escape" && nav.classList.contains("open")) {
        setOpen(false);
        navToggle.focus();
      }
    });
    document.addEventListener("click", function (e) {
      if (!nav.classList.contains("open")) return;
      if (!nav.contains(e.target) && !navToggle.contains(e.target)) setOpen(false);
    });
  }

  /* ---------- footer year ---------- */
  var year = document.getElementById("year");
  if (year) year.textContent = String(new Date().getFullYear());

  /* ---------- contact / access forms ---------- */
  var EMAIL = /^[^\s@]+@[^\s@]+\.[A-Za-z]{2,}$/;

  function fieldError(form, name, message) {
    var el = form.querySelector('[data-error-for="' + name + '"]');
    var input = form.querySelector('[name="' + name + '"]');
    if (el) {
      el.textContent = message || "";
      el.hidden = !message;
    }
    if (input) {
      if (message) input.setAttribute("aria-invalid", "true");
      else input.removeAttribute("aria-invalid");
    }
  }

  function validate(form) {
    var data = new FormData(form);
    var errors = [];
    var name = String(data.get("name") || "").trim();
    var email = String(data.get("email") || "").trim();
    var message = String(data.get("message") || "").trim();
    var consent = data.get("consent");

    if (name.length < 2) errors.push(["name", "Escribe tu nombre (mínimo 2 caracteres)."]);
    else if (name.length > 100) errors.push(["name", "El nombre es demasiado largo."]);
    if (!EMAIL.test(email)) errors.push(["email", "Ingresa un correo electrónico válido."]);
    if (message.length < 10) errors.push(["message", "Cuéntanos un poco más (mínimo 10 caracteres)."]);
    else if (message.length > 2000) errors.push(["message", "El mensaje supera el máximo de 2000 caracteres."]);
    if (!consent) errors.push(["consent", "Debes aceptar la política de privacidad para continuar."]);

    ["name", "email", "message", "consent"].forEach(function (k) { fieldError(form, k, ""); });
    errors.forEach(function (pair) { fieldError(form, pair[0], pair[1]); });

    if (errors.length) {
      var first = form.querySelector('[name="' + errors[0][0] + '"]');
      if (first && first.focus) first.focus();
      return null;
    }
    return {
      name: name,
      email: email,
      org: String(data.get("org") || "").trim(),
      message: message,
      topic: String(data.get("topic") || "general"),
      consent: true,
      website: String(data.get("website") || ""),
      client_token: form.dataset.token || ""
    };
  }

  document.querySelectorAll("form.form").forEach(function (form) {
    var status = form.querySelector(".form-status");
    var button = form.querySelector('button[type="submit"]');
    form.dataset.token = (window.crypto && crypto.randomUUID) ? crypto.randomUUID() : String(Date.now()) + Math.random();

    form.addEventListener("submit", function (e) {
      e.preventDefault();
      if (form.dataset.busy === "1") return;

      var payload = validate(form);
      if (!payload) {
        if (status) { status.className = "form-status err"; status.textContent = "Revisa los campos marcados."; }
        return;
      }

      form.dataset.busy = "1";
      if (button) { button.disabled = true; button.dataset.label = button.textContent; button.textContent = "Enviando…"; }
      if (status) { status.className = "form-status"; status.textContent = "Enviando tu solicitud…"; }

      fetch("/api/contact", {
        method: "POST",
        headers: { "content-type": "application/json" },
        body: JSON.stringify(payload)
      }).then(function (res) {
        return res.json().catch(function () { return {}; }).then(function (body) {
          return { status: res.status, body: body };
        });
      }).then(function (out) {
        if (out.status === 201 && out.body.ok) {
          form.reset();
          form.dataset.token = (window.crypto && crypto.randomUUID) ? crypto.randomUUID() : String(Date.now()) + Math.random();
          if (status) {
            status.className = "form-status ok";
            status.textContent = "Solicitud recibida. Folio " + out.body.id + ". Te contactaremos al correo indicado.";
          }
        } else if (out.status === 429) {
          if (status) { status.className = "form-status err"; status.textContent = "Recibimos varios envíos recientes. Intenta nuevamente en unos minutos."; }
        } else if (out.status === 400 && out.body && out.body.error) {
          if (status) { status.className = "form-status err"; status.textContent = out.body.error; }
        } else {
          if (status) { status.className = "form-status err"; status.textContent = "No pudimos registrar la solicitud. Intenta nuevamente o escríbenos más tarde."; }
        }
      }).catch(function () {
        if (status) { status.className = "form-status err"; status.textContent = "Sin conexión con el servidor. Revisa tu red e intenta otra vez."; }
      }).then(function () {
        form.dataset.busy = "";
        if (button) { button.disabled = false; button.textContent = button.dataset.label || "Enviar"; }
      });
    });
  });
})();
