import apiClient from "../api-client";
import { GenomeTrait } from "@/types/genome.types";

export interface CategoryAverageDto {
  category: string;
  avgEbv: number;     // 표준화 육종가 평균
  avgEpd: number;     // EPD (원래 육종가) 평균
  count: number;
}

export interface ComparisonAveragesDto {
  nationwide: CategoryAverageDto[];
  region: CategoryAverageDto[];
  farm: CategoryAverageDto[];
}

export interface TraitAverageDto {
  traitName: string;   // 형질명
  category: string;    // 카테고리
  avgEbv: number;      // 평균 EBV (표준화 육종가)
  avgEpd: number;      // 평균 EPD (육종가 원본값)
  count: number;       // 데이터 개수
}

export interface TraitComparisonAveragesDto {
  nationwide: TraitAverageDto[];
  region: TraitAverageDto[];
  farm: TraitAverageDto[];
}

/**
 * 유전체(Genome) 관련 API
 */

/**
 * 유전체 분석 의뢰 정보 타입
 */
export interface GenomeRequestDto {
  pkRequestNo: number;
  fkFarmNo: number | null;
  fkCowNo: number | null;
  cowRemarks: string | null;
  requestDt: string | null;       // 접수일자
  snpTest: string | null;         // SNP 검사
  msTest: string | null;          // MS 검사
  sampleAmount: string | null;    // 모근량
  sampleRemarks: string | null;   // 모근 비고
  chipNo: string | null;          // 분석 Chip 번호
  chipType: string | null;        // 분석 칩 종류
  chipInfo: string | null;        // 칩정보
  chipRemarks: string | null;     // 칩 비고
  chipSireName: string | null;    // 칩분석 아비명 (친자감별 결과)
  chipDamName: string | null;     // 칩분석 어미명
  chipReportDt: string | null;    // 칩분석 보고일자
  msResultStatus: string | null;  // MS 감정결과
  msFatherEstimate: string | null; // MS 추정부
  msReportDt: string | null;      // MS 보고일자
  regDt?: string;
  modDt?: string;
}

export const genomeApi = {
  /**
   * GET /genome/request/:cowNo - 개체식별번호로 유전체 분석 의뢰 정보 조회
   *
   * @param cowNo - 개체식별번호 (예: KOR002115897818)
   */
  getRequest: async (cowNo: string | number): Promise<GenomeRequestDto | null> => {
    return await apiClient.get(`/genome/request/${cowNo}`);
  },

  /**
   * GET /genome/:cowNo - 특정 개체의 유전체 데이터 조회
   *
   * @param cowNo - 개체 번호
   */
  findByCowNo: async (cowNo: string | number): Promise<GenomeTrait[]> => {
    return await apiClient.get(`/genome/${cowNo}`);
  },

  /**
   * GET /genome/comparison-averages/:cowNo - 전국/지역/농장 카테고리별 평균 비교
   *
   * @param cowNo - 개체 번호 (KOR...)
   */
  getComparisonAverages: async (
    cowNo: string | number
  ): Promise<ComparisonAveragesDto> => {
    return await apiClient.get(`/genome/comparison-averages/${cowNo}`);
  },

  /**
   * GET /genome/trait-comparison-averages/:cowNo - 전국/지역/농장 형질별 평균 비교
   * (폴리곤 차트용 - 형질 단위 비교)
   *
   * @param cowNo - 개체 번호 (KOR...)
   */
  getTraitComparisonAverages: async (
    cowNo: string | number
  ): Promise<TraitComparisonAveragesDto> => {
    return await apiClient.get(`/genome/trait-comparison-averages/${cowNo}`);
  },

  /**
   * POST /genome/selection-index/:cowId - 선발지수(가중 평균) 계산
   */
  getSelectionIndex: async (
    cowId: string,
    traitConditions: { traitNm: string; weight?: number }[]
  ): Promise<{
    score: number | null;
    percentile: number | null;
    farmRank: number | null;        // 농가 순위
    farmTotal: number;              // 농가 전체 수
    regionRank: number | null;      // 지역(보은군) 순위
    regionTotal: number;            // 지역 전체 수
    regionName: string | null;      // 지역명
    farmerName: string | null;      // 농가명 (농장주명)
    farmAvgScore: number | null;    // 농가 평균 선발지수
    regionAvgScore: number | null;  // 보은군(지역) 평균 선발지수
    details: { traitNm: string; ebv: number; weight: number; contribution: number }[];
    histogram: { bin: number; count: number; farmCount: number }[];  // 실제 분포
    message?: string;
  }> => {
    return await apiClient.post(`/genome/selection-index/${cowId}`, { traitConditions });
  },

  /**
   * GET /genome/dashboard-stats/:farmNo - 대시보드용 유전체 통계
   */
  getDashboardStats: async (farmNo: number): Promise<DashboardStatsDto> => {
    return await apiClient.get(`/genome/dashboard-stats/${farmNo}`);
  },

  /**
   * GET /genome/yearly-ebv-stats/:farmNo - 연도별 EBV 통계 (개체상세용)
   */
  getYearlyEbvStats: async (farmNo: number): Promise<YearlyEbvStatsDto> => {
    return await apiClient.get(`/genome/yearly-ebv-stats/${farmNo}`);
  },

  /**
   * GET /genome/farm-region-ranking/:farmNo - 농가의 보은군 내 순위 조회 (대시보드용)
   */
  getFarmRegionRanking: async (
    farmNo: number,
    traitConditions?: { traitNm: string; weight?: number }[]
  ): Promise<FarmRegionRankingDto> => {
    return await apiClient.post(`/genome/farm-region-ranking/${farmNo}`, { traitConditions });
  },

  /**
   * GET /genome/trait-rank/:cowId/:traitName - 개별 형질 기준 순위 조회
   */
  getTraitRank: async (cowId: string, traitName: string): Promise<TraitRankDto> => {
    return await apiClient.get(`/genome/trait-rank/${cowId}/${encodeURIComponent(traitName)}`);
  },

  /**
   * GET /genome/yearly-trait-trend/:farmNo - 연도별 유전능력 추이 (형질별/카테고리별)
   * @param farmNo - 농장 번호
   * @param category - 카테고리명 (성장/생산/체형/무게/비율)
   * @param traitName - 형질명 (선택, 없으면 카테고리 전체 평균)
   */
  getYearlyTraitTrend: async (
    farmNo: number,
    category: string,
    traitName?: string
  ): Promise<YearlyTraitTrendDto> => {
    const params = new URLSearchParams({ category });
    if (traitName) params.append('traitName', traitName);
    return await apiClient.get(`/genome/yearly-trait-trend/${farmNo}?${params.toString()}`);
  },
};

/**
 * 연도별 유전능력 추이 데이터 타입
 */
export interface YearlyTraitTrendDto {
  category: string;
  traitName: string | null;     // null이면 카테고리 전체 평균
  yearlyData: {
    year: number;
    farmAvgEbv: number;
    regionAvgEbv: number;
    farmCount: number;
    regionCount: number;
  }[];
  traitList: string[];          // 해당 카테고리 내 형질 목록
  // 농가 순위 정보
  farmRank: {
    rank: number | null;        // 보은군 내 순위
    totalFarms: number;         // 전체 농가 수
    percentile: number | null;  // 상위 백분위
    farmAvgEbv: number | null;  // 농가 평균 EBV
    regionAvgEbv: number;       // 보은군 평균 EBV
  };
}

/**
 * 개별 형질 기준 순위 데이터 타입
 */
export interface TraitRankDto {
  traitName: string;
  cowEbv: number | null;
  cowEpd: number | null;        // 개체 육종가(EPD)
  farmRank: number | null;
  farmTotal: number;
  regionRank: number | null;
  regionTotal: number;
  farmAvgEbv: number | null;
  regionAvgEbv: number | null;
  farmAvgEpd: number | null;    // 농가 평균 육종가(EPD)
  regionAvgEpd: number | null;  // 보은군 평균 육종가(EPD)
  histogram: { bin: number; count: number; farmCount: number }[];  // 실제 데이터 분포
}

/**
 * 농가의 보은군 내 순위 데이터 타입
 */
export interface FarmRegionRankingDto {
  farmNo: number;
  farmerName: string | null;
  farmAvgScore: number | null;
  regionAvgScore: number | null;
  farmRankInRegion: number | null;
  totalFarmsInRegion: number;
  percentile: number | null;
  farmCowCount: number;
  regionCowCount: number;
}

/**
 * 대시보드 통계 데이터 타입 (필수 4개만)
 */
export interface DashboardStatsDto {
  // 연도별 분석 현황
  yearlyStats: {
    year: number;
    totalRequests: number;
    analyzedCount: number;
    pendingCount: number;
    sireMatchCount: number;
    analyzeRate: number;
    sireMatchRate: number;
  }[];
  // 형질별 농장 평균
  traitAverages: {
    traitName: string;
    category: string;
    avgEbv: number;
    avgEpd: number;
    regionAvgEpd?: number;
    avgPercentile: number;
    count: number;
    rank: number | null;
    totalFarms: number;
    percentile: number | null;
  }[];
  // 요약
  summary: {
    totalCows: number;
    genomeCowCount: number;
    geneCowCount: number;
    mptCowCount: number;
    totalRequests: number;
    analyzedCount: number;
    pendingCount: number;
    mismatchCount: number;
    maleCount: number;
    femaleCount: number;
  };
  // 친자감별 결과 현황
  paternityStats: {
    analysisComplete: number;
    sireMismatch: number;
    damMismatch: number;
    damNoRecord: number;
    notAnalyzed: number;
  };
}

/**
 * 연도별 EBV 통계 (개체상세용)
 */
export interface YearlyEbvStatsDto {
  yearlyStats: {
    year: number;
    totalRequests: number;
    analyzedCount: number;
    pendingCount: number;
    sireMatchCount: number;
    analyzeRate: number;
    sireMatchRate: number;
  }[];
  yearlyAvgEbv: {
    year: number;
    farmAvgEbv: number;
    regionAvgEbv: number;
    traitCount: number;
  }[];
}
