/**
 * 前端性能监控工具
 * 收集 Web Vitals 核心性能指标
 */

/**
 * 防抖函数
 * @param {Function} fn 目标函数
 * @param {number} delay 延迟时间（ms）
 */
export function debounce(fn, delay = 300) {
  let timer = null
  return function (...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
      timer = null
    }, delay)
  }
}

/**
 * 节流函数
 * @param {Function} fn 目标函数
 * @param {number} interval 间隔时间（ms）
 */
export function throttle(fn, interval = 300) {
  let lastTime = 0
  return function (...args) {
    const now = Date.now()
    if (now - lastTime >= interval) {
      lastTime = now
      return fn.apply(this, args)
    }
  }
}

/**
 * 获取页面性能指标
 */
export function getPerformanceMetrics() {
  if (!window.performance) return null
  
  const navigation = performance.getEntriesByType('navigation')[0]
  if (!navigation) return null
  
  return {
    // DNS 解析时间
    dns: Math.round(navigation.domainLookupEnd - navigation.domainLookupStart),
    // TCP 连接时间
    tcp: Math.round(navigation.connectEnd - navigation.connectStart),
    // 首字节时间 (TTFB)
    ttfb: Math.round(navigation.responseStart - navigation.requestStart),
    // 内容下载时间
    download: Math.round(navigation.responseEnd - navigation.responseStart),
    // DOM 解析时间
    domParse: Math.round(navigation.domInteractive - navigation.responseEnd),
    // 资源加载时间
    resourceLoad: Math.round(navigation.loadEventStart - navigation.domContentLoadedEventEnd),
    // 页面完全加载时间
    total: Math.round(navigation.loadEventEnd - navigation.startTime),
  }
}

/**
 * 预加载关键资源
 * @param {string[]} urls 资源 URL 列表
 */
export function preloadResources(urls) {
  urls.forEach((url) => {
    const link = document.createElement('link')
    link.rel = 'preload'
    
    if (url.match(/\.(jpg|jpeg|png|gif|webp|svg)$/i)) {
      link.as = 'image'
    } else if (url.match(/\.js$/i)) {
      link.as = 'script'
    } else if (url.match(/\.css$/i)) {
      link.as = 'style'
    } else if (url.match(/\.(woff|woff2|ttf|otf)$/i)) {
      link.as = 'font'
      link.crossOrigin = 'anonymous'
    }
    
    link.href = url
    document.head.appendChild(link)
  })
}

/**
 * 使用 requestIdleCallback 在浏览器空闲时执行任务
 * @param {Function} callback 回调函数
 */
export function runWhenIdle(callback) {
  if ('requestIdleCallback' in window) {
    requestIdleCallback(callback, { timeout: 2000 })
  } else {
    setTimeout(callback, 100)
  }
}

export default {
  debounce,
  throttle,
  getPerformanceMetrics,
  preloadResources,
  runWhenIdle,
}
