import crypto from 'crypto';

export interface GravatarOptions {
  size?: number;
  defaultImage?:
    | '404'
    | 'mp'
    | 'identicon'
    | 'monsterid'
    | 'wavatar'
    | 'retro'
    | 'robohash'
    | 'blank';
  rating?: 'g' | 'pg' | 'r' | 'x';
  forcedefault?: 'y' | 'n';
}

/**
 * Génère une URL Gravatar à partir d'une adresse email
 * @param email Email de l'utilisateur
 * @param options Options pour personnaliser l'avatar
 * @returns URL de l'avatar Gravatar
 */
export function getGravatarUrl(
  email: string,
  options: GravatarOptions = {}
): string {
  const {
    size = 200,
    defaultImage = 'identicon',
    rating = 'g',
    forcedefault = 'n',
  } = options;

  // Hacher l'email en MD5 (en minuscules et trimé)
  const normalizedEmail = email.toLowerCase().trim();
  const hash = crypto.createHash('md5').update(normalizedEmail).digest('hex');

  // Construire l'URL
  const params = new URLSearchParams({
    size: size.toString(),
    default: defaultImage,
    rating,
    forcedefault,
  });

  return `https://www.gravatar.com/avatar/${hash}?${params.toString()}`;
}

/**
 * Valide si une URL est une URL Gravatar valide
 */
export function isGravatarUrl(url: string): boolean {
  return (
    url.startsWith('https://www.gravatar.com/avatar/') ||
    url.startsWith('https://gravatar.com/avatar/')
  );
}

/**
 * Vérifie si l'avatar Gravatar existe réellement
 * @param email Email de l'utilisateur
 * @returns Promise<boolean> true si l'avatar existe, false sinon
 */
export async function checkGravatarExists(email: string): Promise<boolean> {
  try {
    const gravatarUrl = getGravatarUrl(email, {
      defaultImage: '404',
      forcedefault: 'y',
    });

    const response = await fetch(gravatarUrl, {
      method: 'HEAD',
      signal: AbortSignal.timeout(5000), // 5s timeout
    });

    return response.ok;
  } catch {
    return false;
  }
}
