/**
 * 体积单位换算工具
 * 单位关系（基于SI单位制）：
 * 1 L = 1000 mL
 * 1 mL = 1000 μL (ul)
 * 1 μL = 1000 nL
 * 1 nL = 1000 pL
 */
const VolumeUnit = {
  // 完整单位名称和缩写
  LITER: { name: 'liter', symbol: 'l', factor: 1e0 },      // 基础单位：升
  MILLILITER: { name: 'milliliter', symbol: 'ml', factor: 1e-3 },  // 10^-3 升
  MICROLITER: { name: 'microliter', symbol: 'μl', factor: 1e-6 },  // 10^-6 升 (也可用ul)
  NANOLITER: { name: 'nanoliter', symbol: 'nl', factor: 1e-9 },    // 10^-9 升
  PICOLITER: { name: 'picoliter', symbol: 'pl', factor: 1e-12 }    // 10^-12 升
}

// 单位符号到标准单位的映射
const UNIT_MAP = {
  // 标准符号
  'l': VolumeUnit.LITER,
  'ml': VolumeUnit.MILLILITER,
  'μl': VolumeUnit.MICROLITER,
  'ul': VolumeUnit.MICROLITER, // ul 是 μl 的替代写法
  'nl': VolumeUnit.NANOLITER,
  'pl': VolumeUnit.PICOLITER,
  
  // 大写形式
  'L': VolumeUnit.LITER,
  'ML': VolumeUnit.MILLILITER,
  'ML': VolumeUnit.MILLILITER,
  'UL': VolumeUnit.MICROLITER,
  'NL': VolumeUnit.NANOLITER,
  'PL': VolumeUnit.PICOLITER
}

/**
 * 将任意单位的值转换为升（基础单位）
 * @param {number} value - 数值
 * @param {string} unit - 单位符号 (l/ml/μl/ul/nl/pl)
 * @returns {number} 换算为升的值
 */
export function convertToLiter(value, unit) {
  const normalizedUnit = unit.toLowerCase()
  const unitConfig = UNIT_MAP[normalizedUnit]
  
  if (!unitConfig) {
    console.warn(`不支持的体积单位: ${unit}. 支持的单位: ${Object.keys(UNIT_MAP).join(', ')}`)
  }
  
  return value * unitConfig.factor
}

/**
 * 将值从一种单位转换为另一种单位
 * @param {number} value - 原始值
 * @param {string} fromUnit - 原始单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 转换后的值
 */
export function convertVolume(value, fromUnit, toUnit) {
  // 先转换为升，再转换为目标单位
  const valueInLiters = convertToLiter(value, fromUnit)
  const toUnitConfig = UNIT_MAP[toUnit.toLowerCase()]
  
  if (!toUnitConfig) {
    console.warn(`不支持的体积单位: ${toUnit}`)
  }
  
  // 从升转换为目标单位
  return valueInLiters / toUnitConfig.factor
}

/**
 * 比较两个不同单位的体积值
 * @param {number} value1 - 第一个值
 * @param {string} unit1 - 第一个值的单位
 * @param {number} value2 - 第二个值
 * @param {string} unit2 - 第二个值的单位
 * @returns {number} 
 *   -1: value1 < value2
 *    0: value1 = value2
 *    1: value1 > value2
 */
export function compareVolume(value1, unit1, value2, unit2) {
  const v1InLiters = convertToLiter(value1, unit1)
  const v2InLiters = convertToLiter(value2, unit2)
  
  if (Math.abs(v1InLiters - v2InLiters) < 1e-15) { // 处理浮点数精度
    return 0
  }
  return v1InLiters < v2InLiters ? -1 : 1
}

/**
 * 获取单位换算比例
 * @param {string} fromUnit - 原始单位
 * @param {string} toUnit - 目标单位
 * @returns {number} 换算比例（fromUnit * ratio = toUnit）
 */
export function getConversionRatio(fromUnit, toUnit) {
  const fromConfig = UNIT_MAP[fromUnit.toLowerCase()]
  const toConfig = UNIT_MAP[toUnit.toLowerCase()]
  
  if (!fromConfig || !toConfig) {
    console.warn('不支持的体积单位')
  }
  
  return fromConfig.factor / toConfig.factor
}