/**
 * ============================================================
 * 개체(Cow) 컨트롤러
 * ============================================================
 *
 * 사용 페이지: 개체 목록 페이지 (/cow)
 *
 * 엔드포인트:
 * - GET /cow - 기본 개체 목록 조회
 * - GET /cow/:id - 개체 상세 조회
 * - POST /cow/ranking - 랭킹 적용 개체 목록 조회
 * - POST /cow/ranking/global - 전체 개체 랭킹 조회
 * ============================================================
 */

import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common';
import { CowService } from './cow.service';
import { CowModel } from './entities/cow.entity';
import { RankingRequestDto } from './dto/ranking-request.dto';

@Controller('cow')
export class CowController {
  constructor(private readonly cowService: CowService) {}

  /**
   * GET /cow
   * 기본 개체 목록 조회
   */
  @Get()
  findAll(@Query('farmId') farmId?: string) {
    if (farmId) {
      return this.cowService.findByFarmId(+farmId);
    }
    return this.cowService.findAll();
  }

  /**
   * POST /cow/ranking
   * 랭킹이 적용된 개체 목록 조회
   *
   * 사용 페이지: 개체 목록 페이지
   */
  @Post('ranking')
  findAllWithRanking(@Body() rankingRequest: RankingRequestDto) {
    return this.cowService.findAllWithRanking(rankingRequest);
  }

  /**
   * POST /cow/ranking/global
   * 전체 개체 랭킹 조회 (모든 농장 포함)
   *
   * 사용 페이지: 대시보드 (농장 순위 비교)
   */
  @Post('ranking/global')
  findAllWithGlobalRanking(@Body() rankingRequest: RankingRequestDto) {
    // farmNo 필터 없이 전체 개체 랭킹 조회
    const globalRequest = {
      ...rankingRequest,
      filterOptions: {
        ...rankingRequest.filterOptions,
        farmNo: undefined,
      },
    };
    return this.cowService.findAllWithRanking(globalRequest);
  }

  /**
   * GET /cow/:cowId
   * 개체 상세 조회 (cowId: 개체식별번호 KOR로 시작)
   */
  @Get(':cowId')
  findOne(@Param('cowId') cowId: string) {
    return this.cowService.findByCowId(cowId);
  }

  @Post()
  create(@Body() data: Partial<CowModel>) {
    return this.cowService.create(data);
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() data: Partial<CowModel>) {
    return this.cowService.update(+id, data);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.cowService.remove(+id);
  }
}
