/**
 * URL 校验工具函数
 */

/**
 * URL 格式校验（使用 URL 构造函数）
 * @param url URL 地址
 * @returns 是否通过校验
 * 
 * @example
 * validateUrl('https://example.com') // true
 * validateUrl('invalid-url') // false
 */
export function validateUrl(url) {
  if (!url) return true; // 空值不校验，由 required 处理

  try {
    new URL(url);
    return true;
  } catch (error) {
    return false;
  }
}

/**
 * URL 正则校验（备选方法）
 * @param url URL 地址
 * @returns 是否通过校验
 */
export function validateUrlByRegex(url) {
  if (!url) return true;
  var STRICT_URL_REGEX = /^(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/;
  return STRICT_URL_REGEX.test(url);
}

/**
 * 解析 URL 各部分
 * @param url URL 地址
 * @returns URL 各部分或 null
 * 
 * @example
 * parseUrl('https://example.com:8080/path?key=value#hash')
 * // { protocol: 'https', host: 'example.com', port: '8080', ... }
 */
export function parseUrl(url) {
  try {
    var urlObj = new URL(url);
    return {
      protocol: urlObj.protocol.replace(':', ''),
      host: urlObj.hostname,
      port: urlObj.port,
      pathname: urlObj.pathname,
      search: urlObj.search,
      hash: urlObj.hash
    };
  } catch (_unused) {
    return null;
  }
}

/**
 * 协议白名单校验
 * @param url URL 地址
 * @param allowedProtocols 允许的协议列表
 * @returns 校验结果
 */
export function validateUrlProtocol(url, allowedProtocols) {
  var errors = [];
  var parts = parseUrl(url);
  if (!parts) {
    return {
      isValid: true,
      errors: errors
    };
  }
  if (parts.protocol && !allowedProtocols.includes(parts.protocol)) {
    errors.push("\u53EA\u5141\u8BB8\u4EE5\u4E0B\u534F\u8BAE\uFF1A".concat(allowedProtocols.join(', ')));
  }
  return {
    isValid: errors.length === 0,
    errors: errors
  };
}