/**
 * MPT (혈액대사판정시험) 항목별 권장치 참고 범위
 * 백엔드 중앙 관리 파일 - 프론트엔드에서 API로 조회
 */

export interface MptReferenceRange {
  key: string;
  name: string; // 한글 표시명
  upperLimit: number | null;
  lowerLimit: number | null;
  unit: string;
  category: 'energy' | 'protein' | 'liver' | 'mineral' | 'etc';
  categoryName: string; // 카테고리 한글명
  description?: string; // 항목 설명 (선택)
}

export interface MptCategory {
  key: string;
  name: string;
  color: string;
  items: string[];
}

/**
 * MPT 참조값 범위
 */
export const MPT_REFERENCE_RANGES: Record<string, MptReferenceRange> = {
  // 에너지 카테고리
  glucose: {
    key: 'glucose',
    name: '혈당',
    upperLimit: 84,
    lowerLimit: 40,
    unit: 'mg/dL',
    category: 'energy',
    categoryName: '에너지 대사',
    description: '에너지 대사 상태 지표',
  },
  cholesterol: {
    key: 'cholesterol',
    name: '콜레스테롤',
    upperLimit: 252,
    lowerLimit: 74,
    unit: 'mg/dL',
    category: 'energy',
    categoryName: '에너지 대사',
    description: '혈액 내 콜레스테롤 수치',
  },
  nefa: {
    key: 'nefa',
    name: '유리지방산(NEFA)',
    upperLimit: 660,
    lowerLimit: 115,
    unit: 'μEq/L',
    category: 'energy',
    categoryName: '에너지 대사',
    description: '혈액 내 유리지방산 수치',
  },
  bcs: {
    key: 'bcs',
    name: 'BCS',
    upperLimit: 3.5,
    lowerLimit: 2.5,
    unit: '점',
    category: 'energy',
    categoryName: '에너지 대사',
    description: '체충실지수(Body Condition Score)',
  },

  // 단백질 카테고리
  totalProtein: {
    key: 'totalProtein',
    name: '총단백질',
    upperLimit: 7.7,
    lowerLimit: 6.2,
    unit: 'g/dL',
    category: 'protein',
    categoryName: '단백질 대사',
    description: '혈액 내 총단백질 수치',
  },
  albumin: {
    key: 'albumin',
    name: '알부민',
    upperLimit: 4.3,
    lowerLimit: 3.3,
    unit: 'g/dL',
    category: 'protein',
    categoryName: '단백질 대사',
    description: '혈액 내 알부민 수치',
  },
  globulin: {
    key: 'globulin',
    name: '총글로불린',
    upperLimit: 36.1,
    lowerLimit: 9.1,
    unit: 'g/dL',
    category: 'protein',
    categoryName: '단백질 대사',
    description: '혈액 내 총글로불린 수치',
  },
  agRatio: {
    key: 'agRatio',
    name: 'A/G 비율',
    upperLimit: 0.4,
    lowerLimit: 0.1,
    unit: '',
    category: 'protein',
    categoryName: '단백질 대사',
    description: '알부민/글로불린 비율',
  },
  bun: {
    key: 'bun',
    name: '요소태질소(BUN)',
    upperLimit: 18.9,
    lowerLimit: 11.7,
    unit: 'mg/dL',
    category: 'protein',
    categoryName: '단백질 대사',
    description: '혈액 내 요소태질소 수치',
  },

  // 간기능 카테고리
  ast: {
    key: 'ast',
    name: 'AST',
    upperLimit: 92,
    lowerLimit: 47,
    unit: 'U/L',
    category: 'liver',
    categoryName: '간기능',
    description: '혈액 내 AST 수치',
  },
  ggt: {
    key: 'ggt',
    name: 'GGT',
    upperLimit: 32,
    lowerLimit: 11,
    unit: 'U/L',
    category: 'liver',
    categoryName: '간기능',
    description: '혈액 내 GGT 수치',
  },
  fattyLiverIdx: {
    key: 'fattyLiverIdx',
    name: '지방간 지수',
    upperLimit: 9.9,
    lowerLimit: -1.2,
    unit: '',
    category: 'liver',
    categoryName: '간기능',
    description: '혈액 내 지방간 지수 수치',
  },

  // 미네랄 카테고리
  calcium: {
    key: 'calcium',
    name: '칼슘',
    upperLimit: 10.6,
    lowerLimit: 8.1,
    unit: 'mg/dL',
    category: 'mineral',
    categoryName: '미네랄',
    description: '혈액 내 칼슘 수치',
  },
  phosphorus: {
    key: 'phosphorus',
    name: '인',
    upperLimit: 8.9,
    lowerLimit: 6.2,
    unit: 'mg/dL',
    category: 'mineral',
    categoryName: '미네랄',
    description: '혈액 내 인 수치',
  },
  caPRatio: {
    key: 'caPRatio',
    name: '칼슘/인 비율',
    upperLimit: 1.3,
    lowerLimit: 1.2,
    unit: '',
    category: 'mineral',
    categoryName: '미네랄',
    description: '혈액 내 칼슘/인 비율',
  },
  magnesium: {
    key: 'magnesium',
    name: '마그네슘',
    upperLimit: 3.3,
    lowerLimit: 1.6,
    unit: 'mg/dL',
    category: 'mineral',
    categoryName: '미네랄',
    description: '혈액 내 마그네슘 수치',
  },

  // 별도 카테고리
  creatine: {
    key: 'creatine',
    name: '크레아틴',
    upperLimit: 1.3,
    lowerLimit: 1.0,
    unit: 'mg/dL',
    category: 'etc',
    categoryName: '기타',
    description: '혈액 내 크레아틴 수치',
  },
};

/**
 * MPT 카테고리 목록
 */
export const MPT_CATEGORIES: MptCategory[] = [
  {
    key: 'energy',
    name: '에너지 대사',
    color: 'bg-muted/50',
    items: ['glucose', 'cholesterol', 'nefa', 'bcs'],
  },
  {
    key: 'protein',
    name: '단백질 대사',
    color: 'bg-muted/50',
    items: ['totalProtein', 'albumin', 'globulin', 'agRatio', 'bun'],
  },
  {
    key: 'liver',
    name: '간기능',
    color: 'bg-muted/50',
    items: ['ast', 'ggt', 'fattyLiverIdx'],
  },
  {
    key: 'mineral',
    name: '미네랄',
    color: 'bg-muted/50',
    items: ['calcium', 'phosphorus', 'caPRatio', 'magnesium'],
  },
  {
    key: 'etc',
    name: '기타',
    color: 'bg-muted/50',
    items: ['creatine'],
  },
];

/**
 * 측정값이 정상 범위 내에 있는지 확인
 */
export function checkMptStatus(
  value: number | null,
  itemKey: string,
): 'normal' | 'high' | 'low' | 'unknown' {
  if (value === null || value === undefined) return 'unknown';

  const reference = MPT_REFERENCE_RANGES[itemKey];
  if (!reference || reference.upperLimit === null || reference.lowerLimit === null) {
    return 'unknown';
  }

  if (value > reference.upperLimit) return 'high';
  if (value < reference.lowerLimit) return 'low';
  return 'normal';
}
