import { Controller, Get, Post, Body, Param, Query } from '@nestjs/common';
import { Public } from '../common/decorators/public.decorator';
import { GenomeService } from './genome.service';
import { GenomeRequestModel } from './entities/genome-request.entity';
import { GenomeTraitDetailModel } from './entities/genome-trait-detail.entity';

export interface CategoryAverageDto {
  category: string;
  avgEbv: number;
  count: number;
}

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

@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-trait-comparison/:farmNo
   * 농가별 형질 비교 데이터 (농가 vs 지역 vs 전국)
   * @param farmNo - 농장 번호
   */
  @Get('farm-trait-comparison/:farmNo')
  getFarmTraitComparison(@Param('farmNo') farmNo: string) {
    return this.genomeService.getFarmTraitComparison(+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);
  }

  // Genome Request endpoints
  @Get('request')
  findAllRequests(
    @Query('cowId') cowId?: string,
    @Query('farmId') farmId?: string,
  ) {
    if (cowId) {
      return this.genomeService.findRequestsByCowId(+cowId);
    }
    if (farmId) {
      return this.genomeService.findRequestsByFarmId(+farmId);
    }
    return this.genomeService.findAllRequests();
  }

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

  @Post('request')
  createRequest(@Body() data: Partial<GenomeRequestModel>) {
    return this.genomeService.createRequest(data);
  }

  /**
   * 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);
  }


  // Genome Trait Detail endpoints
  @Get('trait-detail/:requestId')
  findTraitDetailsByRequestId(@Param('requestId') requestId: string) {
    return this.genomeService.findTraitDetailsByRequestId(+requestId);
  }

  @Get('trait-detail/cow/:cowId')
  findTraitDetailsByCowId(@Param('cowId') cowId: string) {
    return this.genomeService.findTraitDetailsByCowId(cowId);
  }

  @Post('trait-detail')
  createTraitDetail(@Body() data: Partial<GenomeTraitDetailModel>) {
    return this.genomeService.createTraitDetail(data);
  }

  /**
   * GET /genome/check-cow/:cowId
   * 특정 개체 상세 정보 조회 (디버깅용)
   */
  @Public()
  @Get('check-cow/:cowId')
  checkSpecificCow(@Param('cowId') cowId: string) {
    return this.genomeService.checkSpecificCows([cowId]);
  }

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