/**
 * BMI 计算和分类工具函数
 */

export interface BMIResult {
  value: number;
  category: BMICategory;
  color: string;
  backgroundColor: string;
  description: string;
}

export interface BMICategory {
  name: string;
  range: string;
  description: string;
  advice: string;
  encouragement: string;
}

// BMI 分类标准（基于中国成人标准）
export const BMI_CATEGORIES: BMICategory[] = [
  {
    name: '偏瘦',
    range: '< 18.5',
    description: '体重偏轻',
    advice: '建议适当增加营养摄入，进行力量训练增加肌肉量',
    encouragement: '每一份营养都是对身体的投资，坚持下去你会更强壮！💪'
  },
  {
    name: '正常',
    range: '18.5 - 23.9',
    description: '体重正常',
    advice: '保持良好的饮食和运动习惯，继续维持健康体重',
    encouragement: '太棒了！你的身体状态很健康，继续保持这份活力！✨'
  },
  {
    name: '偏胖',
    range: '24.0 - 27.9',
    description: '体重偏重',
    advice: '建议控制饮食，增加有氧运动，逐步减重',
    encouragement: '改变从今天开始，每一次运动都让你更接近理想的自己！🌟'
  },
  {
    name: '肥胖',
    range: '≥ 28.0',
    description: '肥胖',
    advice: '建议咨询专业医生，制定科学的减重计划',
    encouragement: '健康之路虽有挑战，但你有勇气迈出第一步就已经很了不起！🚀'
  }
];

// BMI 颜色方案（越健康颜色越绿）
const BMI_COLORS = {
  underweight: {
    color: '#8B7355', // 棕色文字
    backgroundColor: '#FFF4E6', // 浅橙色背景
  },
  normal: {
    color: '#2D5016', // 深绿色文字
    backgroundColor: '#E8F5E8', // 浅绿色背景
  },
  overweight: {
    color: '#B45309', // 橙色文字
    backgroundColor: '#FEF3C7', // 浅黄色背景
  },
  obese: {
    color: '#B91C1C', // 红色文字
    backgroundColor: '#FEE2E2', // 浅红色背景
  }
};

/**
 * 计算 BMI 值
 * @param weight 体重（kg）
 * @param height 身高（cm）
 * @returns BMI 值，保留一位小数
 */
export function calculateBMI(weight: number, height: number): number {
  if (weight <= 0 || height <= 0) {
    throw new Error('体重和身高必须大于0');
  }

  // 身高转换为米
  const heightInMeters = height / 100;
  const bmi = weight / (heightInMeters * heightInMeters);

  return Math.round(bmi * 10) / 10;
}

/**
 * 根据 BMI 值获取分类
 * @param bmi BMI 值
 * @returns BMI 分类信息
 */
export function getBMICategory(bmi: number): BMICategory {
  if (bmi < 18.5) {
    return BMI_CATEGORIES[0]; // 偏瘦
  } else if (bmi < 24.0) {
    return BMI_CATEGORIES[1]; // 正常
  } else if (bmi < 28.0) {
    return BMI_CATEGORIES[2]; // 偏胖
  } else {
    return BMI_CATEGORIES[3]; // 肥胖
  }
}

/**
 * 根据 BMI 值获取颜色
 * @param bmi BMI 值
 * @returns 颜色配置
 */
export function getBMIColors(bmi: number): { color: string; backgroundColor: string } {
  if (bmi < 18.5) {
    return BMI_COLORS.underweight;
  } else if (bmi < 24.0) {
    return BMI_COLORS.normal;
  } else if (bmi < 28.0) {
    return BMI_COLORS.overweight;
  } else {
    return BMI_COLORS.obese;
  }
}

/**
 * 获取完整的 BMI 结果
 * @param weight 体重（kg）
 * @param height 身高（cm）
 * @returns 完整的 BMI 分析结果
 */
export function getBMIResult(weight: number, height: number): BMIResult {
  const bmi = calculateBMI(weight, height);
  const category = getBMICategory(bmi);
  const colors = getBMIColors(bmi);

  return {
    value: bmi,
    category,
    color: colors.color,
    backgroundColor: colors.backgroundColor,
    description: category.description
  };
}

/**
 * 检查是否有足够的数据计算 BMI
 * @param weight 体重
 * @param height 身高
 * @returns 是否可以计算 BMI
 */
export function canCalculateBMI(weight?: number, height?: number): boolean {
  return typeof weight === 'number' && weight > 0 &&
    typeof height === 'number' && height > 0;
}