/**
 * ========================================
 * 개체(Cow) 관련 타입 정의
 * ========================================
 *
 * @description
 * - 실제 사용되는 타입만 정의
 * - 백엔드 CowModel Entity와 1:1 매핑
 */

// ========================================
// 1. 개체 기본 정보
// ========================================

/**
 * 개체 기본 정보
 *
 * @backend CowModel Entity
 * @description 한우 개체 1마리의 기본 정보
 */
export interface CowDto {
  // === 기본 키 ===
  pkCowNo: number                  // 개체 내부 번호 (Primary Key)
  cowId: string                    // 개체식별번호 (KOR 또는 KPN)

  // === 개체 정보 ===
  cowSex?: string                  // 성별 (M/F)
  cowBirthDt?: string              // 생년월일 (YYYY-MM-DD)
  cowStatus?: string               // 개체 상태

  // === 혈통 정보 ===
  sireKpn?: string                 // 부(씨수소) KPN 번호
  damCowId?: string                // 모(어미소) 개체식별번호

  // === 연결 정보 ===
  fkFarmNo?: number                // 농장번호 (Foreign Key)

  // === 분석 정보 ===
  anlysDt?: string                 // 분석일자
  unavailableReason?: string       // 분석 불가 사유

  // === 번식능력검사(MPT) 정보 ===
  hasMpt?: boolean                 // MPT 검사 여부
  mptTestDt?: string               // MPT 검사일
  mptMonthAge?: number             // MPT 검사 월령

  // === 시스템 필드 ===
  delDt?: string                   // 삭제일시

  // === 관계 데이터 ===
  farm?: {
    pkFarmNo: number
    farmNm?: string
    farmAddr?: string
  }
}

/**
 * 개체 상세 정보
 *
 * @description CowDto 확장 + 계산 필드 + 분석 정보
 */
export interface CowDetailResponseDto extends CowDto {
  // === 계산 필드 ===
  age?: number                     // 나이 (년 단위)
  cowShortNo?: string              // 개체 요약번호 (뒷 4자리)

  // === 유전체 분석 정보 ===
  genomeScore?: number             // 유전체 종합 점수
  farmRank?: number                // 농장 내 순위
  totalCows?: number               // 농장 총 개체 수
  inbreedingCoef?: number          // 근친계수 (0.0~1.0)
  calvingCount?: number            // 분만 회차

  // === 데이터 상태 ===
  dataStatus?: {
    hasGenomeData: boolean
    hasGeneData: boolean
  }
}

// ========================================
// 2. 확장 타입 (순위 포함)
// ========================================

/**
 * 유전자 정보 포함 개체
 *
 * @description 개체 목록에서 사용 (유전자 + 순위 정보)
 */
export interface CowWithGenes extends CowDto {
  genes?: { name: string; genotype: string }[]
  traits?: Record<string, { breedVal: number | null; traitVal: number | null } | number>
  rank?: number
  genomeScore?: number
  cowShortNo?: string
}

/**
 * 순위 API 응답 항목
 *
 * @description /cow/ranking API 응답의 개별 항목
 */
export interface RankingItem {
  entity: CowDto & {
    genes?: Record<string, number>
    calvingCount?: number
    bcs?: number
    inseminationCount?: number
    inbreedingPercent?: number
    sireKpn?: string
    anlysDt?: string
    unavailableReason?: string
    hasMpt?: boolean
    mptTestDt?: string
    mptMonthAge?: number
  }
  rank: number                     // 순위
  sortValue: number                // 정렬 기준값
  ranking?: {
    traits?: {
      traitName: string
      traitEbv: number | null
      traitVal: number | null
    }[]
  }
}

// ========================================
// 3. 타입 별칭
// ========================================

/**
 * @description 실제 사용 중인 별칭
 */
export type Cow = CowDto
export type CowDetail = CowDetailResponseDto
