/**
 * 图片URL处理工具
 * 将远程图片URL转换为本地路径
 *
 * @author 系统开发团队
 * @date 2023-05-15
 * @version 1.0.0
 * @description
 *   该工具用于处理图片URL，支持将远程图片URL转换为本地路径。
 *   主要用于开发环境中，可以通过环境变量控制是否启用本地图片映射。
 *   支持两种映射方式：
 *   1. URL前缀替换：将远程URL中的API基础路径替换为本地路径
 *   2. 特定路径模式匹配：根据特定的URL模式提取路径信息，构建本地路径
 */
import { getMappedImagePath } from '@/config/image-mapping'

/**
 * 转换图片URL为本地路径
 * @param url 原始图片URL
 * @returns 转换后的URL
 *
 * @example
 * // 返回原始URL（未启用本地映射）
 * convertImageUrl('http://example.com/image.jpg')
 *
 * @example
 * // 返回本地路径（启用本地映射）
 * convertImageUrl('http://localhost:48081/admin-api/infra/file/1/get/image.jpg')
 * // 返回: '/local-images/1/image.jpg'
 */
export const convertImageUrl = (url: string): string => {
  if (!url) return ''

  // 判断是否启用本地图片映射
  const useLocalMapping = import.meta.env.VITE_USE_LOCAL_IMAGES === 'true'
  if (!useLocalMapping) return url

  // 首先检查是否有特定的映射配置
  const mappedPath = getMappedImagePath(url)
  if (mappedPath) {
    return mappedPath
  }

  // 方案1: URL前缀替换
  const apiBaseUrl = import.meta.env.VITE_API_BASE_URL || ''
  const localImageBase = import.meta.env.VITE_LOCAL_IMAGE_BASE || '/local-images'

  // 处理完整URL的情况
  if (url.startsWith('http://') || url.startsWith('https://')) {
    // 如果URL包含API基础路径，替换为本地路径
    if (url.includes(apiBaseUrl)) {
      return url.replace(apiBaseUrl, localImageBase)
    }
  }

  // 方案4: 特定路径模式匹配
  // 处理相对路径或特定格式的URL
  if (url.includes('/admin-api/infra/file')) {
    // 提取图片路径部分
    const matches = url.match(/\/admin-api\/infra\/file\/(\d+)\/get\/(.*)/)
    if (matches && matches.length >= 3) {
      const folderId = matches[1]
      const fileName = matches[2]

      // 构建本地图片路径
      return `${localImageBase}/${folderId}/${fileName}`
    }
  }

  // 如果没有匹配任何规则，返回原始URL
  return url
}

/**
 * 检查URL是否为图片
 * @param url 要检查的URL
 * @returns 是否为图片URL
 *
 * @example
 * isImageUrl('image.jpg') // 返回: true
 * isImageUrl('document.pdf') // 返回: false
 */
export const isImageUrl = (url: string): boolean => {
  if (!url) return false
  return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(url)
}

/**
 * 获取图片文件名
 * @param url 图片URL
 * @returns 文件名
 *
 * @example
 * getImageFileName('http://example.com/images/photo.jpg') // 返回: 'photo.jpg'
 */
export const getImageFileName = (url: string): string => {
  if (!url) return ''
  const parts = url.split('/')
  return parts[parts.length - 1]
}
