import { beforeUnloadHandler } from "../app.js";
import { showError } from "../utils/error.js";

// Configuración: Cambia estos números para que sean únicos para tu proyecto
const OFFSET = 99887766;  // Un número grande para asegurar longitud mínima
const CLAVE  = 836295738; // Tu "secreto" para el XOR

const desencriptar = (hash) => {
  // 1. Revertimos el string y volvemos a base 10
  const baseNum = parseInt(hash.split('').reverse().join(''), 12);
  // 2. Aplicamos XOR (es reversible) y restamos el Offset
  return (baseNum ^ CLAVE) - OFFSET;
};

function getTableFromUrl() {
  const params = new URLSearchParams(window.location.search);
  const table = params.get("table");
  console.log(table);
  return Number(desencriptar(table));
}

async function login(email, pin) {
  const response = await fetch("/api/users/login", {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ email, pin }) // Enviamos table si el back lo requiere en login
  });
  
  if (response.status == 420) {
    window.removeEventListener("beforeunload", beforeUnloadHandler);
    window.location.replace("/");
  }

  if (response.status === 401 || response.status === 429 || response.status === 404) {
      const errorData = await response.json();
      const msg = errorData.message || "Error de autenticación";
      const attempts = errorData.data?.attempts_remaining ? ` Intentos restantes: ${errorData.data.attempts_remaining}` : "";
      showError(`${msg}.${attempts}`);
      throw new Error(msg);
  } else if (response.status != 200) {
    const errorData = await response.json();
    showError(errorData.message || "Error desconocido");
    throw new Error(errorData.message);
  }

  const JSONdata = await response.json();
  const userData = JSONdata.data;
  if (!userData || !userData.token) {
    showError("Error al iniciar sesión, Intenta mas tarde.");
    throw new Error("Error al iniciar sesión.");
  }

  return userData;
}

async function guestLogin() {
  try {
    const response = await fetch("/api/users/guest");
    const data = await response.json();

    if (!data.success || !data.data || !data.data.token) {
       throw new Error("Error al generar sesión de invitado");
    }
    return data.data; // Retorna { token: "..." }
  } catch (e) {
    console.error(e);
    showError("No se pudo iniciar como invitado.");
    throw e;
  }
}

async function existsTable(table) {
  const responseTableExists = await fetch(`/api/store/tables/exists?q=${table}`, {
    method: "GET",
    headers: {
      "Content-Type": "application/json"
    }
  });
  
  const data = (await responseTableExists.json()).data.exists;
  return data;
}

export { login, existsTable, guestLogin, getTableFromUrl };