/**
 * 유전체 분석 유효성 조건 설정
 *
 * @description
 * 유전체 분석 데이터가 유효한지 판단하는 조건 정의
 * 백엔드 GenomeAnalysisConfig.ts와 동일한 로직 유지
 *
 * ====================유효 조건====================
 * 1. chipSireName === '일치' (아비 칩 데이터 일치)
 * 2. chipDamName !== '불일치' (어미 칩 데이터 불일치가 아님)
 * 3. chipDamName !== '이력제부재' (어미 이력제 부재가 아님)
 * 4. cowId가 EXCLUDED_COW_IDS에 포함되지 않음
 *
 * ====================제외되는 경우====================
 * - chipSireName !== '일치' (아비 불일치, 이력제부재 등)
 * - chipDamName === '불일치' (어미 불일치)
 * - chipDamName === '이력제부재' (어미 이력제 부재)
 * - 분석불가 개체 (EXCLUDED_COW_IDS)
 */

/** 유효한 아비 칩 이름 값 */
export const VALID_CHIP_SIRE_NAME = '일치';

/** 제외할 어미 칩 이름 값 목록 */
export const INVALID_CHIP_DAM_NAMES = ['불일치', '이력제부재'];

/** 개별 제외 개체 목록 (분석불가 등 특수 사유) */
export const EXCLUDED_COW_IDS = [
  'KOR002191642861', // 모근량 갯수 적은데 1회분은 가능 아비명도 일치하는데 유전체 분석 정보가 없음
  // 김정태님
];

/**
 * 분석불가 개체인지 확인 (모근 오염/불량 등 특수 사유)
 *
 * @param cowId - 개체식별번호
 * @returns 분석불가 개체 여부
 */
export function isExcludedCow(cowId?: string | null): boolean {
  if (!cowId) return false;
  return EXCLUDED_COW_IDS.includes(cowId);
}

/**
 * 유전체 분석 데이터 유효성 검사
 *
 * @param chipSireName - 아비 칩 이름 (친자감별 결과)
 * @param chipDamName - 어미 칩 이름 (친자감별 결과)
 * @param cowId - 개체식별번호 (선택, 개별 제외 목록 확인용)
 * @returns 유효한 분석 데이터인지 여부
 *
 * @example
 * // 유효한 경우
 * isValidGenomeAnalysis('일치', '일치')       // true
 * isValidGenomeAnalysis('일치', null)         // true
 * isValidGenomeAnalysis('일치', '정보없음')   // true
 *
 * // 유효하지 않은 경우
 * isValidGenomeAnalysis('불일치', '일치')     // false (아비 불일치)
 * isValidGenomeAnalysis('일치', '불일치')     // false (어미 불일치)
 * isValidGenomeAnalysis('일치', '이력제부재') // false (어미 이력제부재)
 * isValidGenomeAnalysis('일치', '일치', 'KOR002191642861') // false (제외 개체)
 */
export function isValidGenomeAnalysis(
  chipSireName: string | null | undefined,
  chipDamName: string | null | undefined,
  cowId?: string | null,
): boolean {
  // 1. 분석불가 개체 (모근 오염/불량 등 특수 사유)
  if (cowId && EXCLUDED_COW_IDS.includes(cowId)) return false;

  // 2. 아비명 일치 필수
  if (chipSireName !== VALID_CHIP_SIRE_NAME) return false;

  // 3. 어미명 불일치/이력제부재 제외
  if (chipDamName && INVALID_CHIP_DAM_NAMES.includes(chipDamName)) return false;

  return true;
}

/**
 * 유효성 검사 실패 사유 반환
 *
 * @param chipSireName - 아비 칩 이름
 * @param chipDamName - 어미 칩 이름
 * @param cowId - 개체식별번호
 * @returns 실패 사유 문자열 또는 null (유효한 경우)
 */
export function getInvalidReason(
  chipSireName: string | null | undefined,
  chipDamName: string | null | undefined,
  cowId?: string | null,
): string | null {
  // 1. 개별 제외 개체
  if (cowId && EXCLUDED_COW_IDS.includes(cowId)) {
    return '분석불가';
  }

  // 2. 아비명 상태별 분류
  if (chipSireName !== VALID_CHIP_SIRE_NAME) {
    if (chipSireName === '분석불가') return '분석불가';
    if (chipSireName === '정보없음') return '분석불가';
    if (!chipSireName) return null; // null은 '-' 표시
    return '부 불일치'; // 불일치 등
  }

  // 3. 어미명 상태별 분류
  if (chipDamName && INVALID_CHIP_DAM_NAMES.includes(chipDamName)) {
    if (chipDamName === '이력제부재') return '모 이력제부재';
    return '모 불일치';
  }

  return null;
}

/**
 * 유효성 검사 실패 시 안내 메시지 반환
 *
 * @param chipSireName - 아비 칩 이름
 * @param chipDamName - 어미 칩 이름
 * @param cowId - 개체식별번호
 * @returns 안내 메시지
 */
export function getInvalidMessage(
  chipSireName: string | null | undefined,
  chipDamName: string | null | undefined,
  cowId?: string | null,
): string {
  // 1. 개별 제외 개체
  if (cowId && EXCLUDED_COW_IDS.includes(cowId)) {
    return '모근 오염 및 불량 등 기타 사유로 유전체 분석 보고서를 제공할 수 없습니다.';
  }

  // 2. 아비명 상태별 분류
  if (chipSireName !== VALID_CHIP_SIRE_NAME) {
    if (chipSireName === '분석불가') return '모근 오염 및 불량 등 기타 사유로 유전체 분석 보고서를 제공할 수 없습니다.';
    if (chipSireName === '정보없음') return '개체 식별번호 및 형식오류로 유전체 분석 보고서를 제공할 수 없습니다.';
    if (!chipSireName) return ''; // null은 '-' 표시
    return '부 친자감별 결과가 불일치하여 유전체 분석 보고서를 제공할 수 없습니다.';
  }

  // 3. 어미명 상태별 분류
  if (chipDamName && INVALID_CHIP_DAM_NAMES.includes(chipDamName)) {
    if (chipDamName === '이력제부재') return '모 이력제 정보가 부재하여 유전체 분석 보고서를 제공할 수 없습니다.';
    return '모 친자감별 결과가 불일치하여 유전체 분석 보고서를 제공할 수 없습니다.';
  }

  return '유전체 분석 보고서를 제공할 수 없습니다.';
}
