/**
 * 형질(Trait) 관련 상수 정의
 *
 * @description
 * 유전체 분석에서 사용하는 35개 형질 목록
 * 백엔드 TraitTypes.ts와 동기화 필요
 */

/** 성장형질 (1개) */
export const GROWTH_TRAITS = ['12개월령체중'] as const;

/** 경제형질 (4개) - 생산 카테고리 */
export const ECONOMIC_TRAITS = ['도체중', '등심단면적', '등지방두께', '근내지방도'] as const;

/** 체형형질 (10개) */
export const BODY_TRAITS = [
  '체고', '십자', '체장', '흉심', '흉폭',
  '고장', '요각폭', '좌골폭', '곤폭', '흉위',
] as const;

/** 부위별 무게 (10개) */
export const WEIGHT_TRAITS = [
  '안심weight', '등심weight', '채끝weight', '목심weight', '앞다리weight',
  '우둔weight', '설도weight', '사태weight', '양지weight', '갈비weight',
] as const;

/** 부위별 비율 (10개) */
export const RATE_TRAITS = [
  '안심rate', '등심rate', '채끝rate', '목심rate', '앞다리rate',
  '우둔rate', '설도rate', '사태rate', '양지rate', '갈비rate',
] as const;

/** 전체 형질 (35개) */
export const ALL_TRAITS = [
  ...GROWTH_TRAITS,
  ...ECONOMIC_TRAITS,
  ...BODY_TRAITS,
  ...WEIGHT_TRAITS,
  ...RATE_TRAITS,
] as const;

/** 낮을수록 좋은 형질 (부호 반전 필요) */
export const NEGATIVE_TRAITS: string[] = ['등지방두께'];

/** 기본 선택 형질 (7개) */
export const DEFAULT_TRAITS = ['도체중', '등심단면적', '등지방두께', '근내지방도', '체장', '체고', '등심weight'] as const;

/** 형질 타입 */
export type TraitName = typeof ALL_TRAITS[number];

/** 카테고리 타입 */
export type TraitCategory = '성장' | '생산' | '체형' | '무게' | '비율';

/**
 * 카테고리별 형질 목록
 */
export const TRAIT_CATEGORIES: Record<TraitCategory, readonly string[]> = {
  '성장': GROWTH_TRAITS,
  '생산': ECONOMIC_TRAITS,
  '체형': BODY_TRAITS,
  '무게': WEIGHT_TRAITS,
  '비율': RATE_TRAITS,
};

/**
 * UI용 카테고리 정보 (id, name, traits)
 */
export const TRAIT_CATEGORY_LIST = [
  { id: 'growth', name: '성장형질', traits: [...GROWTH_TRAITS] },
  { id: 'economic', name: '경제형질', traits: [...ECONOMIC_TRAITS] },
  { id: 'body', name: '체형형질', traits: [...BODY_TRAITS] },
  { id: 'weight', name: '부위별무게', traits: [...WEIGHT_TRAITS] },
  { id: 'rate', name: '부위별비율', traits: [...RATE_TRAITS] },
] as const;

/**
 * 형질별 카테고리 매핑
 */
export const TRAIT_CATEGORY_MAP: Record<string, TraitCategory> = {
  // 성장
  '12개월령체중': '성장',
  // 생산
  '도체중': '생산',
  '등심단면적': '생산',
  '등지방두께': '생산',
  '근내지방도': '생산',
  // 체형
  '체고': '체형',
  '십자': '체형',
  '체장': '체형',
  '흉심': '체형',
  '흉폭': '체형',
  '고장': '체형',
  '요각폭': '체형',
  '좌골폭': '체형',
  '곤폭': '체형',
  '흉위': '체형',
  // 무게
  '안심weight': '무게',
  '등심weight': '무게',
  '채끝weight': '무게',
  '목심weight': '무게',
  '앞다리weight': '무게',
  '우둔weight': '무게',
  '설도weight': '무게',
  '사태weight': '무게',
  '양지weight': '무게',
  '갈비weight': '무게',
  // 비율
  '안심rate': '비율',
  '등심rate': '비율',
  '채끝rate': '비율',
  '목심rate': '비율',
  '앞다리rate': '비율',
  '우둔rate': '비율',
  '설도rate': '비율',
  '사태rate': '비율',
  '양지rate': '비율',
  '갈비rate': '비율',
};

/**
 * 형질 설명 (툴팁용)
 */
export const TRAIT_DESCRIPTIONS: Record<string, string> = {
  // 성장형질
  '12개월령체중': '12개월 시점 체중',
  // 경제형질
  '도체중': '도축 후 고기 무게',
  '등심단면적': '등심의 단면 크기',
  '등지방두께': '등 부위 지방 두께 (낮을수록 좋음)',
  '근내지방도': '마블링 정도 (높을수록 고급육)',
  // 체형형질
  '체고': '어깨 높이',
  '십자': '십자부(엉덩이) 높이',
  '체장': '몸통 길이',
  '흉심': '가슴 깊이',
  '흉폭': '가슴 너비',
  '고장': '엉덩이 길이',
  '요각폭': '허리뼈 너비',
  '좌골폭': '좌골 너비',
  '곤폭': '좌골단 너비',
  '흉위': '가슴둘레',
  // 부위별 무게
  '안심weight': '안심 부위 무게',
  '등심weight': '등심 부위 무게',
  '채끝weight': '채끝 부위 무게',
  '목심weight': '목심 부위 무게',
  '앞다리weight': '앞다리 부위 무게',
  '우둔weight': '우둔 부위 무게',
  '설도weight': '설도 부위 무게',
  '사태weight': '사태 부위 무게',
  '양지weight': '양지 부위 무게',
  '갈비weight': '갈비 부위 무게',
  // 부위별 비율
  '안심rate': '전체 대비 안심 비율',
  '등심rate': '전체 대비 등심 비율',
  '채끝rate': '전체 대비 채끝 비율',
  '목심rate': '전체 대비 목심 비율',
  '앞다리rate': '전체 대비 앞다리 비율',
  '우둔rate': '전체 대비 우둔 비율',
  '설도rate': '전체 대비 설도 비율',
  '사태rate': '전체 대비 사태 비율',
  '양지rate': '전체 대비 양지 비율',
  '갈비rate': '전체 대비 갈비 비율',
};

/**
 * 형질명으로 카테고리 조회
 */
export function getTraitCategory(traitName: string): TraitCategory | '기타' {
  return TRAIT_CATEGORY_MAP[traitName] ?? '기타';
}

/**
 * 형질명으로 설명 조회
 */
export function getTraitDescription(traitName: string): string {
  return TRAIT_DESCRIPTIONS[traitName] ?? traitName;
}

/**
 * 형질 표시 이름 (DB 키 -> 화면 표시용)
 * weight → 중량, rate → 비율로 변환
 */
export const TRAIT_DISPLAY_NAMES: Record<string, string> = {
  '안심weight': '안심중량',
  '등심weight': '등심중량',
  '채끝weight': '채끝중량',
  '목심weight': '목심중량',
  '앞다리weight': '앞다리중량',
  '우둔weight': '우둔중량',
  '설도weight': '설도중량',
  '사태weight': '사태중량',
  '양지weight': '양지중량',
  '갈비weight': '갈비중량',
  '안심rate': '안심비율',
  '등심rate': '등심비율',
  '채끝rate': '채끝비율',
  '목심rate': '목심비율',
  '앞다리rate': '앞다리비율',
  '우둔rate': '우둔비율',
  '설도rate': '설도비율',
  '사태rate': '사태비율',
  '양지rate': '양지비율',
  '갈비rate': '갈비비율',
};

/**
 * 형질명을 화면 표시용 이름으로 변환
 */
export function getTraitDisplayName(traitName: string): string {
  return TRAIT_DISPLAY_NAMES[traitName] ?? traitName;
}
