import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { GenomeService } from './genome.service';
import { ComparisonAveragesDto } from './dto/comparison-averages.dto';

@Controller('genome')
export class GenomeController {
  constructor(private readonly genomeService: GenomeService) { }

  /**
   * GET /genome/dashboard-stats/:farmNo
   * 대시보드용 유전체 분석 통계 데이터
   * @param farmNo - 농장 번호
   */
  @Get('dashboard-stats/:farmNo')
  getDashboardStats(@Param('farmNo') farmNo: string) {
    return this.genomeService.getDashboardStats(+farmNo);
  }

  /**
   * GET /genome/farm-region-ranking/:farmNo
   * 농가의 보은군 내 순위 조회 (대시보드용)
   * @param farmNo - 농장 번호
   */
  @Post('farm-region-ranking/:farmNo')
  getFarmRegionRanking(
    @Param('farmNo') farmNo: string,
    @Body() body: { traitConditions?: { traitNm: string; weight?: number }[] }
  ) {
    return this.genomeService.getFarmRegionRanking(+farmNo, body.traitConditions);
  }

  /**
   * GET /genome/trait-rank/:cowId/:traitName
   * 개별 형질 기준 순위 조회
   * @param cowId - 개체식별번호 (KOR...)
   * @param traitName - 형질명 (도체중, 근내지방도 등)
   */
  @Get('trait-rank/:cowId/:traitName')
  getTraitRank(
    @Param('cowId') cowId: string,
    @Param('traitName') traitName: string
  ) {
    return this.genomeService.getTraitRank(cowId, traitName);
  }

  /**
   * GET /genome/request/:cowId
   * 개체식별번호(KOR...)로 유전체 분석 의뢰 정보 조회
   * @param cowId - 개체식별번호
   */
  @Get('request/:cowId')
  findRequestByCowIdentifier(@Param('cowId') cowId: string) {
    return this.genomeService.findRequestByCowIdentifier(cowId);
  }

  /**
   * GET /genome/comparison-averages/:cowId
   * 개체 기준 전국/지역/농장 카테고리별 평균 EBV 비교 데이터
   * @param cowId - 개체식별번호 (KOR...)
   */
  @Get('comparison-averages/:cowId')
  getComparisonAverages(@Param('cowId') cowId: string): Promise<ComparisonAveragesDto> {
    return this.genomeService.getComparisonAverages(cowId);
  }

  /**
   * GET /genome/trait-comparison-averages/:cowId
   * 개체 기준 전국/지역/농장 형질별 평균 EBV 비교 데이터
   * (폴리곤 차트용 - 형질 단위 비교)
   * @param cowId - 개체식별번호 (KOR...)
   */
  @Get('trait-comparison-averages/:cowId')
  getTraitComparisonAverages(@Param('cowId') cowId: string) {
    return this.genomeService.getTraitComparisonAverages(cowId);
  }

  /**
   * POST /genome/selection-index/:cowId
   * 선발지수(가중 평균) 계산 + 농가/지역 순위
   * @param cowId - 개체식별번호 (KOR...)
   * @param body.traitConditions - 형질별 가중치 조건
   */
  @Post('selection-index/:cowId')
  getSelectionIndex(
    @Param('cowId') cowId: string,
    @Body() body: { traitConditions: { traitNm: string; weight?: number }[] }
  ) {
    return this.genomeService.getSelectionIndex(cowId, body.traitConditions);
  }


  /**
   * GET /genome/yearly-ebv-stats/:farmNo
   * 연도별 EBV 통계 (개체상세 > 유전체 통합비교용)
   * @param farmNo - 농장 번호
   */
  @Get('yearly-ebv-stats/:farmNo')
  getYearlyEbvStats(@Param('farmNo') farmNo: string) {
    return this.genomeService.getYearlyEbvStats(+farmNo);
  }

  /**
   * GET /genome/yearly-trait-trend/:farmNo
   * 연도별 유전능력 추이 (형질별/카테고리별)
   * @param farmNo - 농장 번호
   * @param category - 카테고리명 (성장/생산/체형/무게/비율)
   * @param traitName - 형질명 (선택, 없으면 카테고리 전체)
   */
  @Get('yearly-trait-trend/:farmNo')
  getYearlyTraitTrend(
    @Param('farmNo') farmNo: string,
    @Query('category') category: string,
    @Query('traitName') traitName?: string,
  ) {
    return this.genomeService.getYearlyTraitTrend(+farmNo, category, traitName);
  }

  /**
   * GET /genome/latest-analysis-year/:farmNo
   * 농장의 가장 최근 분석 연도 조회 (chip_report_dt 또는 ms_report_dt 기준)
   * @param farmNo - 농장 번호
   */
  @Get('latest-analysis-year/:farmNo')
  getLatestAnalysisYear(@Param('farmNo') farmNo: string) {
    return this.genomeService.getLatestAnalysisYear(+farmNo);
  }

  /**
 * GET /genome/:cowId
 * cowId(개체식별번호)로 유전체 데이터 조회
 * @Get(':cowId')가 /genome/request 요청을 가로챔
 * 구체적인 경로들(request)이 위에, 와일드카드 경로(@Get(':cowId'))가 맨 아래
 */
  @Get(':cowId')
  findByCowId(@Param('cowId') cowId: string) {
    return this.genomeService.findByCowId(cowId);
  }
}
