/**
 * 安全工具函数
 * 用于防重放攻击和生成随机 nonce
 */

/**
 * 生成随机 nonce (32位随机字符串)
 * 使用 crypto.getRandomValues 确保密码学安全
 * @returns {string} nonce
 */
export function generateNonce() {
  const array = new Uint8Array(24); // 24 bytes = 32 base64 chars
  crypto.getRandomValues(array);
  return btoa(String.fromCharCode(...array))
    .replace(/[+/=]/g, '') // 移除特殊字符
    .substring(0, 32);
}

/**
 * 获取当前时间戳 (毫秒)
 * @returns {number} timestamp
 */
export function getTimestamp() {
  return Date.now();
}

/**
 * 获取防重放攻击请求头
 * @returns {Object} 包含 X-Timestamp 和 X-Nonce 的对象
 */
export function getReplayAttackHeaders() {
  return {
    'X-Timestamp': getTimestamp(),
    'X-Nonce': generateNonce()
  };
}

/**
 * 需要防重放攻击验证的请求方法
 */
export const REPLAY_ATTACK_METHODS = ['POST', 'PUT', 'DELETE', 'PATCH'];

/**
 * 检查请求是否需要防重放攻击验证
 * @param {string} method HTTP 方法
 * @param {string} url 请求 URL
 * @returns {boolean}
 */
export function needsReplayAttackValidation(method, url) {
  // GET 请求不需要验证（幂等操作）
  if (!method || method.toUpperCase() === 'GET') {
    return false;
  }
  // 排除登录和注册接口（后端已排除）
  if (url && (
    url.includes('/api/user/login') ||
    url.includes('/api/user/register') ||
    url.includes('/api/system/registration/status')
  )) {
    return false;
  }
  return REPLAY_ATTACK_METHODS.includes(method.toUpperCase());
}

/**
 * HTML 转义函数，防止 XSS
 * @param {string} text 需要转义的文本
 * @returns {string} 转义后的文本
 */
export function escapeHtml(text) {
  if (!text) return '';
  const div = document.createElement('div');
  div.textContent = text;
  return div.innerHTML;
}
