import type { AuthTokens, User } from '@avanzacast/shared-types';

const TOKEN_KEY = 'avanzacast_tokens';
const USER_KEY = 'avanzacast_user';

/**
 * Guarda los tokens de autenticación en localStorage
 */
export const saveTokens = (tokens: AuthTokens): void => {
  if (typeof window === 'undefined') return;
  localStorage.setItem(TOKEN_KEY, JSON.stringify(tokens));
};

/**
 * Obtiene los tokens de autenticación desde localStorage
 */
export const getTokens = (): AuthTokens | null => {
  if (typeof window === 'undefined') return null;
  const tokens = localStorage.getItem(TOKEN_KEY);
  return tokens ? JSON.parse(tokens) : null;
};

/**
 * Elimina los tokens de autenticación
 */
export const removeTokens = (): void => {
  if (typeof window === 'undefined') return;
  localStorage.removeItem(TOKEN_KEY);
};

/**
 * Guarda los datos del usuario en localStorage
 */
export const saveUser = (user: User): void => {
  if (typeof window === 'undefined') return;
  localStorage.setItem(USER_KEY, JSON.stringify(user));
};

/**
 * Obtiene los datos del usuario desde localStorage
 */
export const getUser = (): User | null => {
  if (typeof window === 'undefined') return null;
  const user = localStorage.getItem(USER_KEY);
  return user ? JSON.parse(user) : null;
};

/**
 * Elimina los datos del usuario
 */
export const removeUser = (): void => {
  if (typeof window === 'undefined') return;
  localStorage.removeItem(USER_KEY);
};

/**
 * Limpia toda la información de autenticación
 */
export const clearAuth = (): void => {
  removeTokens();
  removeUser();
};

/**
 * Verifica si el token de acceso ha expirado
 */
export const isTokenExpired = (tokens: AuthTokens | null): boolean => {
  if (!tokens) return true;
  const expirationTime = Date.now() + tokens.expiresIn * 1000;
  return Date.now() >= expirationTime;
};

/**
 * Obtiene el header de autorización para peticiones HTTP
 */
export const getAuthHeader = (): Record<string, string> => {
  const tokens = getTokens();
  if (!tokens) return {};
  return {
    Authorization: `Bearer ${tokens.accessToken}`,
  };
};

/**
 * Verifica si el usuario está autenticado
 */
export const isAuthenticated = (): boolean => {
  const tokens = getTokens();
  const user = getUser();
  return !!(tokens && user && !isTokenExpired(tokens));
};

/**
 * Redirige al login si no está autenticado
 */
export const requireAuth = (redirectUrl: string = '/auth/login'): void => {
  if (!isAuthenticated() && typeof window !== 'undefined') {
    const currentPath = window.location.pathname;
    window.location.href = `${redirectUrl}?redirect=${encodeURIComponent(currentPath)}`;
  }
};
