/**
 * 랭킹 관련 타입 정의
 * 백엔드 ranking.interface.ts와 동기화
 */

/**
 * 랭킹 기준 타입
 */
export enum RankingCriteriaType {
  GENE = 'GENE', // 유전자 기반 랭킹
  GENOME = 'GENOME', // 유전체 형질 기반 랭킹
  CONCEPTION_RATE = 'CONCEPTION_RATE', // 수태율 랭킹
  BCS = 'BCS', // BCS 랭킹
  MPT = 'MPT', // 혈액대사검사 랭킹
  INBREEDING = 'INBREEDING', // 근친도 기반 랭킹
  COW_PURPOSE = 'COW_PURPOSE', // 암소 용도별 추천
  COMPOSITE = 'COMPOSITE', // 복합 평가
}

/**
 * 정렬 방향
 */
export enum RankingOrder {
  ASC = 'ASC', // 오름차순
  DESC = 'DESC', // 내림차순
}

/**
 * 유전자 기반 랭킹 조건
 */
export interface GeneRankingCondition {
  markerNm: string; // 유전자 마커명
  order?: RankingOrder;
}

/**
 * 유전체 형질 기반 랭킹 조건
 */
export interface TraitRankingCondition {
  traitNm: string; // 형질 이름
  weight?: number; // 가중치
}

/**
 * 수태율 기반 랭킹 조건
 */
export interface ConceptionRateCondition {
  order?: RankingOrder;
}

/**
 * BCS 기반 랭킹 조건
 */
export interface BCSCondition {
  order?: RankingOrder;
}

/**
 * MPT (혈액대사검사) 기반 랭킹 조건
 */
export interface MptRankingCondition {
  criteria: string[]; // 평가할 MPT 항목
  normalRanges?: Record<string, { min: number; max: number }>;
}

/**
 * 근친도 기반 랭킹 조건
 */
export interface InbreedingCondition {
  targetKpnNo?: string; // 특정 KPN과의 근친도 계산
  maxThreshold?: number; // 최대 허용 근친도
  order?: RankingOrder;
}

/**
 * 랭킹 옵션
 */
export interface RankingOptions {
  criteriaType: RankingCriteriaType;
  geneConditions?: GeneRankingCondition[];
  traitConditions?: TraitRankingCondition[];
  conceptionRateCondition?: ConceptionRateCondition;
  bcsCondition?: BCSCondition;
  mptCondition?: MptRankingCondition;
  inbreedingCondition?: InbreedingCondition;
  limit?: number;
  offset?: number;
}

/**
 * 암소 용도별 추천 타입
 */
export enum CowRecommendationType {
  EMBRYO_DONOR = 'EMBRYO_DONOR', // 공란우
  EMBRYO_RECIPIENT = 'EMBRYO_RECIPIENT', // 수란우
  ARTIFICIAL_INSEMINATION = 'ARTIFICIAL_INSEMINATION', // 인공수정
  CULLING = 'CULLING', // 도태대상
  GENERAL = 'GENERAL', // 일반
}

/**
 * 랭킹 상세 정보
 */
export interface RankingDetail {
  code: string; // 평가 항목 명
  value: number; // 실체 측정 값
  weight?: number; // 가중치
}

/**
 * 랭킹 결과 아이템
 */
export interface RankingResultItem<T> {
  entity: T; // 원본 엔티티
  rank: number; // 순위
  sortValue: number; // 정렬에 사용된 값
  details?: RankingDetail[];
  recommendationType?: CowRecommendationType;
  compositeScores?: {
    genomeScore: number;
    geneScore: number;
    inbreedingPercent: number;
  };
}

/**
 * 랭킹 결과
 */
export interface RankingResult<T> {
  items: RankingResultItem<T>[];
  total: number;
  criteriaType: RankingCriteriaType;
  timestamp: Date;
}

/**
 * 필터 연산자 타입
 */
export type FilterOperator =
  | 'eq'        // 같음
  | 'ne'        // 같지 않음
  | 'gt'        // 초과
  | 'gte'       // 이상
  | 'lt'        // 미만
  | 'lte'       // 이하
  | 'like'      // 포함 (문자열)
  | 'in'        // 배열 내 포함
  | 'between';  // 범위

/**
 * 필터 조건
 */
export interface FilterCondition {
  field: string; // 필터링할 컬럼명
  operator: FilterOperator; // 연산자
  value: any; // 비교 값 (between인 경우 [min, max] 배열)
}

/**
 * 정렬 방향
 */
export type SortOrder = 'ASC' | 'DESC';

/**
 * 정렬 옵션
 */
export interface SortOption {
  field: string; // 정렬할 컬럼명
  order: SortOrder; // 정렬 방향
}

/**
 * 페이지네이션 옵션
 */
export interface PaginationOption {
  page: number; // 페이지 번호 (1부터 시작)
  limit: number; // 페이지당 아이템 수
}

/**
 * FilterEngine 옵션
 */
export interface FilterEngineOptions {
  filters?: FilterCondition[]; // 필터 조건 배열
  sorts?: SortOption[]; // 정렬 옵션 배열
  pagination?: PaginationOption; // 페이지네이션 옵션
}

/**
 * FilterEngine 실행 결과
 */
export interface FilterEngineResult<T> {
  data: T[]; // 조회된 데이터
  total: number; // 전체 데이터 개수 (페이지네이션 전)
  page?: number; // 현재 페이지
  limit?: number; // 페이지당 아이템 수
  totalPages?: number; // 전체 페이지 수
}

/**
 * 랭킹 요청 DTO
 */
export interface RankingRequestDto {
  filterOptions?: FilterEngineOptions;
  rankingOptions: RankingOptions;
}

// 타입 alias
export type RankingRequest = RankingRequestDto;
