/**
 * Utilidades criptográficas sin dependencias externas.
 * - randomTokenBase64Url: genera un token aleatorio (base64url, sin relleno).
 * - sha256Hex: calcula SHA-256 y devuelve en hex.
 */

export function randomTokenBase64Url(bytes: number = 32): string {
  const arr = new Uint8Array(bytes);
  crypto.getRandomValues(arr);
  const b64 = Buffer.from(arr).toString('base64');
  // base64url (RFC 4648) sin padding
  return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
}

export async function sha256Hex(input: string): Promise<string> {
  const data = new TextEncoder().encode(input);
  const hashBuf = await crypto.subtle.digest('SHA-256', data);
  const bytes = new Uint8Array(hashBuf);
  return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
}
