/**
 * 跨浏览器兼容的文件下载工具
 * 特别针对 Safari/iOS 进行了优化
 */

/**
 * 检测是否为 Safari 浏览器
 */
export const isSafari = () => {
  const ua = navigator.userAgent.toLowerCase()
  return ua.includes('safari') && !ua.includes('chrome') && !ua.includes('android')
}

/**
 * 检测是否为 iOS 设备
 */
export const isIOS = () => {
  return /iPad|iPhone|iPod/.test(navigator.userAgent) || 
    (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)
}

/**
 * 通用文件下载函数
 * @param {string} url - 文件URL
 * @param {string} filename - 下载文件名
 * @param {string} mimeType - 文件MIME类型（可选）
 * @returns {Promise<boolean>} - 下载是否成功
 */
export const downloadFile = async (url, filename, mimeType = '') => {
  try {
    // Safari 和 iOS 特殊处理
    if (isSafari() || isIOS()) {
      return await downloadForSafari(url, filename, mimeType)
    }
    
    // 其他浏览器使用标准方式
    return await downloadStandard(url, filename)
  } catch (error) {
    console.error('下载失败，尝试备用方案:', error)
    // 最终备用方案：新窗口打开
    window.open(url, '_blank')
    return false
  }
}

/**
 * Safari/iOS 专用下载方法
 */
const downloadForSafari = async (url, filename, mimeType) => {
  try {
    // 方案1：尝试使用 fetch + blob
    const response = await fetch(url, {
      mode: 'cors',
      credentials: 'omit'
    })
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    
    const blob = await response.blob()
    
    // 创建带正确 MIME 类型的 blob
    const finalMimeType = mimeType || blob.type || getMimeType(filename)
    const finalBlob = new Blob([blob], { type: finalMimeType })
    
    // Safari 需要使用 FileReader 转换为 data URL
    return new Promise((resolve) => {
      const reader = new FileReader()
      reader.onloadend = () => {
        const dataUrl = reader.result
        
        // 创建临时链接
        const link = document.createElement('a')
        link.href = dataUrl
        link.download = filename
        link.style.display = 'none'
        
        // Safari 需要将链接添加到 DOM
        document.body.appendChild(link)
        
        // 使用 setTimeout 确保 Safari 能正确处理
        setTimeout(() => {
          link.click()
          
          // 延迟移除链接
          setTimeout(() => {
            document.body.removeChild(link)
          }, 100)
          
          resolve(true)
        }, 0)
      }
      
      reader.onerror = () => {
        // FileReader 失败，尝试直接打开
        window.open(url, '_blank')
        resolve(false)
      }
      
      reader.readAsDataURL(finalBlob)
    })
  } catch (error) {
    console.error('Safari 下载失败:', error)
    
    // 备用方案：直接打开新窗口
    // 对于视频文件，Safari 会显示播放器，用户可以长按保存
    window.open(url, '_blank')
    return false
  }
}

/**
 * 标准浏览器下载方法
 */
const downloadStandard = async (url, filename) => {
  try {
    const response = await fetch(url, {
      mode: 'cors',
      credentials: 'omit'
    })
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    
    const blob = await response.blob()
    const blobUrl = window.URL.createObjectURL(blob)
    
    const link = document.createElement('a')
    link.href = blobUrl
    link.download = filename
    link.style.display = 'none'
    
    document.body.appendChild(link)
    link.click()
    
    // 清理
    setTimeout(() => {
      document.body.removeChild(link)
      window.URL.revokeObjectURL(blobUrl)
    }, 100)
    
    return true
  } catch (error) {
    console.error('标准下载失败:', error)
    throw error
  }
}

/**
 * 根据文件名获取 MIME 类型
 */
const getMimeType = (filename) => {
  const ext = filename.split('.').pop()?.toLowerCase()
  const mimeTypes = {
    'mp4': 'video/mp4',
    'webm': 'video/webm',
    'mov': 'video/quicktime',
    'avi': 'video/x-msvideo',
    'png': 'image/png',
    'jpg': 'image/jpeg',
    'jpeg': 'image/jpeg',
    'gif': 'image/gif',
    'webp': 'image/webp'
  }
  return mimeTypes[ext] || 'application/octet-stream'
}

/**
 * 下载视频文件
 */
export const downloadVideo = async (url, taskId) => {
  const filename = `video_${taskId || Date.now()}.mp4`
  return downloadFile(url, filename, 'video/mp4')
}

/**
 * 下载图片文件
 */
export const downloadImage = async (url, taskId, prefix = 'image') => {
  // 根据 URL 判断图片格式
  let ext = 'png'
  if (url.includes('.jpg') || url.includes('.jpeg')) {
    ext = 'jpg'
  } else if (url.includes('.webp')) {
    ext = 'webp'
  }
  
  const filename = `${prefix}_${taskId || Date.now()}.${ext}`
  const mimeType = ext === 'jpg' ? 'image/jpeg' : `image/${ext}`
  return downloadFile(url, filename, mimeType)
}
