/**
 * ============================================================
 * 랭킹 요청 DTO
 * ============================================================
 *
 * 사용 페이지: 개체 목록 페이지 (/cow)
 *
 * 프론트에서 POST /cow/ranking 호출 시 사용
 *
 * 지원하는 랭킹 기준:
 * 1. GENOME - 35개 유전체 형질 EBV 가중치 기반
 * ============================================================
 */

/**
 * 랭킹 기준 타입
 * - GENOME: 유전체 형질 기반 랭킹 (35개 형질 EBV 가중 평균)
 */
export enum RankingCriteriaType {
  GENOME = 'GENOME',
}

// ============================================================
// 필터 관련 타입 (FilterEngine에서 사용)
// ============================================================

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

export type SortOrder = 'ASC' | 'DESC';

/**
 * 필터 조건
 * 예: { field: 'cowSex', operator: 'eq', value: 'F' }
 */
export interface FilterCondition {
  field: string;
  operator: FilterOperator;
  value: any;
}

/**
 * 정렬 옵션
 */
export interface SortOption {
  field: string;
  order: SortOrder;
}

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

/**
 * 필터 엔진 옵션
 * - 개체 목록 필터링에 사용
 */
export interface FilterEngineOptions {
  filters?: FilterCondition[];
  sorts?: SortOption[];
  pagination?: PaginationOption;
}

// ============================================================
// 랭킹 조건 타입
// ============================================================

/**
 * 유전체 형질 랭킹 조건
 * - 35개 형질 중 사용자가 선택한 형질만 대상
 * - weight: 1~10 가중치 (10이 100%)
 *
 * 예: { traitNm: '도체중', weight: 8 }
 */
export interface TraitRankingCondition {
  traitNm: string;   // 형질명 (예: '도체중', '근내지방도')
  weight?: number;   // 가중치 1~10 (기본값: 1)
}

/**
 * 랭킹 옵션
 */
export interface RankingOptions {
  criteriaType: RankingCriteriaType;          // 랭킹 기준 타입
  traitConditions?: TraitRankingCondition[];  // GENOME용: 형질별 가중치
  limit?: number;
  offset?: number;
}

// ============================================================
// 메인 요청 DTO
// ============================================================

/**
 * 랭킹 요청 DTO
 *
 * 프론트에서 POST /cow/ranking 호출 시 Body로 전송
 *
 * @example
 * {
 *   filterOptions: {
 *     filters: [{ field: 'cowSex', operator: 'eq', value: 'F' }],
 *     pagination: { page: 1, limit: 20 }
 *   },
 *   rankingOptions: {
 *     criteriaType: 'GENOME',
 *     traitConditions: [
 *       { traitNm: '도체중', weight: 8 },
 *       { traitNm: '근내지방도', weight: 10 }
 *     ]
 *   }
 * }
 */
export interface RankingRequestDto {
  filterOptions?: FilterEngineOptions;  // 필터/정렬/페이지네이션
  rankingOptions: RankingOptions;       // 랭킹 조건
}
