const API_URL = import.meta.env.VITE_EFC_API_URL;
const HUB_URL = import.meta.env.VITE_HUB_URL || 'https://workspace.aduanasoft.com';

/**
 * Login directo email/password via Hub.
 * Devuelve { access_token, user_id, email, ... }
 * o { needs_tenant: true, tenants: [...] } si es multi-tenant.
 */
export async function login(username, password, tenant_slug) {
  const body = { username, password };
  if (tenant_slug) body.tenant_slug = tenant_slug;

  const response = await fetch(`${API_URL}/auth/login/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'include', // recibir cookie HTTP-only
    body: JSON.stringify(body),
  });

  if (response.status === 401) throw new Error('Credenciales inválidas');
  if (response.status === 403) throw new Error('Usuario inactivo o sin permisos');
  if (!response.ok) throw new Error('Error al iniciar sesión');

  return response.json();
}

/** Canjea relay token del Hub por sesión local (SSO entre productos / Microsoft). */
export async function ssoExchange(relay_token) {
  const response = await fetch(`${API_URL}/auth/sso/exchange/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'include',
    body: JSON.stringify({ relay_token }),
  });

  if (response.status === 401) throw new Error('Relay token inválido o expirado');
  if (!response.ok) throw new Error('Error al completar inicio de sesión SSO');

  return response.json();
}

/** Usuario autenticado actual. */
export async function getMe(token) {
  const headers = { 'Content-Type': 'application/json' };
  if (token) headers['Authorization'] = `Bearer ${token}`;

  const response = await fetch(`${API_URL}/auth/me/`, {
    headers,
    credentials: 'include',
  });

  if (!response.ok) throw new Error('No autenticado');
  return response.json();
}

/** Cierra sesión: limpia estado local de inmediato, backend en background. */
export function logout() {
  // 1. Limpiar localStorage inmediatamente (síncrono, sin esperar al servidor)
  ['access', 'refresh', 'user_id', 'username', 'user_email',
   'user_first_name', 'user_last_name', 'user_groups',
   'user_is_importador', 'user_permissions'].forEach(k => localStorage.removeItem(k));

  // 2. Notificar a los componentes que la sesión terminó
  window.dispatchEvent(new CustomEvent('authStateChanged'));

  // 3. Llamar al backend en segundo plano para limpiar cookies (fire and forget)
  fetch(`${API_URL}/auth/logout/`, { method: 'POST', credentials: 'include' }).catch(() => {});
}

/** URL para login con Microsoft (redirige al Hub). */
export function getMicrosoftLoginUrl() {
  const returnTo = encodeURIComponent(`${window.location.origin}/auth/sso`);
  return `${HUB_URL}/login?return_to=${returnTo}&idp=microsoft`;
}
