/**
 * MPT (혈액대사판정시험) 항목별 권장치 참고 범위
 * MPT 참조값의 중앙 관리 파일
 */

export interface MptReferenceRange {
  name: string; // 한글 표시명
  upperLimit: number | null;
  lowerLimit: number | null;
  unit: string;
  category: '에너지' | '단백질' | '간기능' | '미네랄' | '기타';
  description?: string; // 항목 설명 (선택)
}

export const MPT_REFERENCE_RANGES: Record<string, MptReferenceRange> = {
  // 에너지 카테고리
  glucose: {
    name: '혈당',
    upperLimit: 84,
    lowerLimit: 40,
    unit: 'mg/dL',
    category: '에너지',
    description: '에너지 대사 상태 지표',
  },
  cholesterol: {
    name: '콜레스테롤',
    upperLimit: 252,
    lowerLimit: 74,
    unit: 'mg/dL',
    category: '에너지',
    description: '혈액 내 콜레스테롤 수치',
  },
  nefa: {
    name: '유리지방산(NEFA)',
    upperLimit: 660,
    lowerLimit: 115,
    unit: 'μEq/L',
    category: '에너지',
    description: '혈액 내 유리지방산 수치',
  },
  bcs: {
    name: 'BCS',
    upperLimit: 3.5,
    lowerLimit: 2.5,
    unit: '-',
    category: '에너지',
    description: '혈액 내 BCS 수치',
  },

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

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

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

  // 기타 카테고리
  creatinine: {
    name: '크레아티닌',
    upperLimit: 1.3,
    lowerLimit: 1.0,
    unit: 'mg/dL',
    category: '기타',
    description: '혈액 내 크레아티닌 수치',
  },
};

/**
 * MPT 카테고리 목록 (표시 순서)
 */
export const MPT_CATEGORIES = ['에너지', '단백질', '간기능', '미네랄', '기타'] as const;

/**
 * 측정값이 정상 범위 내에 있는지 확인
 */
export function isWithinRange(
  value: number,
  itemKey: string
): 'normal' | 'high' | 'low' | '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';
}

/**
 * 카테고리별로 MPT 항목 그룹화
 */
export function getMptItemsByCategory() {
  const grouped: Record<string, string[]> = {};

  MPT_CATEGORIES.forEach((category) => {
    grouped[category] = [];
  });

  Object.entries(MPT_REFERENCE_RANGES).forEach(([itemKey, reference]) => {
    grouped[reference.category].push(itemKey);
  });

  return grouped;
}
