/**
 * Utilitários para manipulação de tokens JWT.
 */

/**
 * Decodifica um token JWT sem validar a assinatura.
 * ATENÇÃO: Esta função apenas decodifica o payload, não valida a autenticidade do token.
 * 
 * @param {string} token - Token JWT a ser decodificado
 * @returns {Object|null} Payload decodificado ou null se inválido
 * 
 * @example
 * const payload = decodeJWT(token);
 * console.log(payload.email); // "usuario@exemplo.com"
 */
export const decodeJWT = (token) => {
  try {
    if (!token || typeof token !== 'string') {
      return null;
    }

    // JWT tem 3 partes separadas por ponto: header.payload.signature
    const parts = token.split('.');
    
    if (parts.length !== 3) {
      console.warn('Token JWT inválido: formato incorreto');
      return null;
    }

    // O payload é a segunda parte (índice 1)
    const payload = parts[1];
    
    // Decodifica de Base64URL para string JSON
    const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
    const jsonPayload = decodeURIComponent(
      atob(base64)
        .split('')
        .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
        .join('')
    );

    return JSON.parse(jsonPayload);
  } catch (error) {
    console.error('Erro ao decodificar JWT:', error);
    return null;
  }
};

/**
 * Verifica se um token JWT está expirado.
 * 
 * @param {string} token - Token JWT a ser verificado
 * @returns {boolean} True se o token está expirado
 */
export const isTokenExpired = (token) => {
  const payload = decodeJWT(token);
  
  if (!payload || !payload.exp) {
    return true; // Se não conseguir decodificar ou não tiver exp, considera expirado
  }

  // exp está em segundos, Date.now() está em milissegundos
  const expirationTime = payload.exp * 1000;
  const currentTime = Date.now();

  return currentTime >= expirationTime;
};

/**
 * Extrai informações do usuário de um token JWT.
 * 
 * @param {string} token - Token JWT
 * @returns {Object|null} Objeto com informações do usuário ou null
 */
export const extractUserFromToken = (token) => {
  const payload = decodeJWT(token);
  
  if (!payload) {
    return null;
  }

  // Extrai campos comuns de JWT
  return {
    email: payload.email || null,
    database: payload.database || null,
    exp: payload.exp || null,
    iat: payload.iat || null,
    // Adicione outros campos conforme necessário
  };
};
