/**
 * 개체(Cow) 관련 타입 정의
 * 백엔드 CowModel Entity 기준으로 작성
 */

import { BaseFields } from './base.types';
import { FarmDto } from './farm.types';

/**
 * 개체 기본 정보
 * 백엔드 CowModel Entity와 일치
 */
export interface CowDto extends BaseFields {
  pkCowNo: number; // 내부 PK (자동증가)
  cowId: string; // 개체식별번호 (KOR 또는 KPN) - 필수
  cowSex?: string; // 성별 (M/F)
  cowBirthDt?: string; // 생년월일
  sireKpn?: string; // 부(씨수소) KPN번호
  damCowId?: string; // 모(어미소) 개체식별번호 (KOR)
  fkFarmNo?: number; // 농장번호 FK
  cowStatus?: string; // 개체상태
  delDt?: string; // 삭제일시 (Soft Delete)

  // Relations
  farm?: FarmDto; // 농장 정보 (조인)
}

/**
 * 개체 목록 응답
 */
export interface CowListResponseDto {
  totalCount: number; // 전체 개체 수
  cows: CowDto[]; // 개체 목록
}

/**
 * 개체 상세 응답 (프론트엔드 확장)
 */
export interface CowDetailResponseDto extends CowDto {
  // 계산된 필드 (프론트엔드에서 계산)
  age?: number; // 나이 (년)
  cowShortNo?: string; // 개체 요약번호 (4자리, cowId에서 추출)

  // 추가 분석 정보 (백엔드 별도 API에서 조회)
  grade?: 'A' | 'B' | 'C' | 'D' | 'E'; // 등급
  overallScore?: number; // 종합지수
  genomeScore?: number; // 유전체 점수
  farmRank?: number; // 농장 내 순위
  totalCows?: number; // 농장 총 개체 수
  inbreedingCoef?: number; // 근친계수 (0.0~1.0)
  calvingCount?: number; // 분만회차
}

/**
 * 개체 검색 DTO
 */
export interface CowSearchDto {
  keyword?: string; // 검색 키워드 (개체번호, 이름 등)
  farmNo?: number; // 농장 번호로 필터링
  gender?: 'M' | 'F'; // 성별로 필터링
  minBirthDate?: string; // 최소 생년월일 (YYYY-MM-DD)
  maxBirthDate?: string; // 최대 생년월일 (YYYY-MM-DD)
}

/**
 * 개체 생성 DTO
 */
export interface CreateCowDto {
  cowId: string; // 개체식별번호 (필수)
  cowSex: 'M' | 'F'; // 성별 (필수)
  cowBirthDt?: string; // 생년월일 (YYYY-MM-DD)
  fkFarmNo: number; // 농장 번호 (필수)
  sireKpn?: string; // 부(씨수소) KPN번호
  damCowId?: string; // 모(어미소) 개체식별번호
  cowStatus?: string; // 개체상태
}

/**
 * 개체 수정 DTO
 */
export interface UpdateCowDto {
  cowBirthDt?: string; // 생년월일 수정 (YYYY-MM-DD)
  sireKpn?: string; // 부(씨수소) KPN번호 수정
  damCowId?: string; // 모(어미소) 개체식별번호 수정
  cowStatus?: string; // 개체상태 수정
}

// 타입 alias (호환성)
export type Cow = CowDto;
export type CowList = CowListResponseDto;
export type CowDetail = CowDetailResponseDto;
