import { Controller, Get, Query } from '@nestjs/common';
import { ApiExtraModels, ApiOperation, ApiTags } from '@nestjs/swagger';
import { ApiOkStandard } from 'src/common/decorators/api-ok-response.decorator';
import { AssemblyMonitoringService } from './assembly-monitoring.service';
import {
  AssemblyMonitoringOverviewItemResponseDto,
  AssemblyMonitoringOverviewProcessResponseDto,
  AssemblyMonitoringOverviewResponseDto,
  AssemblyMonitoringInactiveWorkerResponseDto,
  AssemblyMonitoringUnitDetailResponseDto,
  AssemblyMonitoringUnitListResponseDto,
} from './dto/response';
import {
  AssemblyMonitoringDailyQueryDto,
  AssemblyMonitoringProcessesQueryDto,
  AssemblyMonitoringRealtimeQueryDto,
  AssemblyMonitoringUnitDetailQueryDto,
  AssemblyMonitoringUnitListQueryDto,
} from './dto/request';

@ApiTags('CP Assembly Monitoring')
@ApiExtraModels(
  AssemblyMonitoringOverviewItemResponseDto,
  AssemblyMonitoringOverviewProcessResponseDto,
  AssemblyMonitoringInactiveWorkerResponseDto,
)
@Controller('/api/monitoring/cp/assembly')
export class AssemblyMonitoringController {
  constructor(private readonly monitoringService: AssemblyMonitoringService) {}

  /**
   * GET /api/monitoring/cp/assembly
   * CP 조립 공정 모니터링 전체 현황 조회 (기본: 실시간)
   *
   * Query params:
   * - factUnit: 공장단위 (선택, 기본값: 2)
   */
  @Get()
  @ApiOperation({
    summary: 'CP 조립 공정 모니터링 전체 현황 조회 (기본: 실시간)',
  })
  @ApiOkStandard(AssemblyMonitoringOverviewResponseDto, {
    description: 'Monitoring overview',
  })
  async findMonitoring(
    @Query() query: AssemblyMonitoringRealtimeQueryDto,
  ): Promise<AssemblyMonitoringOverviewResponseDto> {
    return this.monitoringService.findRealtimeData(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/realtime
   * CP 조립 공정 모니터링 조회조회
   *
   * Query params:
   * - factUnit: 공장단위 (선택, 기본값: 2)
   */
  @Get('realtime')
  @ApiOperation({ summary: 'CP 조립 공정 모니터링 실시간 현황 조회' })
  @ApiOkStandard(AssemblyMonitoringOverviewResponseDto, {
    description: 'Monitoring overview (realtime)',
  })
  async findRealtime(
    @Query() query: AssemblyMonitoringRealtimeQueryDto,
  ): Promise<AssemblyMonitoringOverviewResponseDto> {
    return this.monitoringService.findRealtimeData(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/daily
   * CP 조립 공정 모니터링 일일 현황 조회
   *
   * Query params:
   * - date: YYYY-MM-DD (필수)
   * - factUnit: 공장단위 (선택, 기본값: 2)
   */
  @Get('daily')
  @ApiOperation({ summary: 'CP 조립 공정 모니터링 일일 현황 조회' })
  @ApiOkStandard(AssemblyMonitoringOverviewResponseDto, {
    description: 'Monitoring overview (daily)',
  })
  async findDaily(
    @Query() query: AssemblyMonitoringDailyQueryDto,
  ): Promise<AssemblyMonitoringOverviewResponseDto> {
    return this.monitoringService.findDailyData(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/processes
   * CP 조립 공정 상태 조회
   *
   * Query params:
   * - factUnit: 공장단위 (선택, 기본값: 2)
   */
  @Get('processes')
  @ApiOperation({ summary: 'CP 조립 공정 상태 조회' })
  @ApiOkStandard(AssemblyMonitoringOverviewResponseDto, {
    description: 'Process status overview',
  })
  async findProcesses(
    @Query() query: AssemblyMonitoringProcessesQueryDto,
  ): Promise<AssemblyMonitoringOverviewResponseDto> {
    return this.monitoringService.findProcesses(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/processes/waiting
   * CP 조립 공정 상태 조회 (대기/재공)
   *
   * Query params:
   * - factUnit: 공장단위 (선택, 기본값: 2)
   */
  @Get('processes/waiting')
  @ApiOperation({ summary: 'CP 조립 공정 상태 조회 (대기/재공)' })
  @ApiOkStandard(AssemblyMonitoringOverviewResponseDto, {
    description: 'Waiting process status overview',
  })
  async findWaitingProcesses(
    @Query() query: AssemblyMonitoringProcessesQueryDto,
  ): Promise<AssemblyMonitoringOverviewResponseDto> {
    return this.monitoringService.findWaitingProcesses(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/units
   * 호기 목록 조회
   *
   * Query params:
   * - prodPlanMonth: 생산계획월 (선택, 예: "202512")
   * - prodPlanSeq: 생산계획순번 (선택)
   * - modelSeq: 모델순번 (선택)
   * - serialNo: 시리얼번호 (선택)
   * - specSeq: 스펙순번 (선택)
   * - factUnit: 공장단위 (선택, 기본값: 2)
   * - workingEndDate: 작업종료일 (선택)
   */
  @Get('units')
  @ApiOperation({ summary: '호기 목록 조회' })
  @ApiOkStandard(AssemblyMonitoringUnitListResponseDto, {
    description: 'Unit list',
    isArray: true,
  })
  async findUnitList(
    @Query() query: AssemblyMonitoringUnitListQueryDto,
  ): Promise<AssemblyMonitoringUnitListResponseDto[]> {
    return this.monitoringService.findUnitList(query);
  }

  /**
   * GET /api/monitoring/cp/assembly/units/detail
   * 특정 호기 공정 상세 조회
   *
   * Query params:
   * - prodPlanSeq: 생산계획순번 (필수)
   * - modelSeq: 모델순번 (필수)
   * - serialNo: 시리얼번호 (필수)
   * - specSeq: 스펙순번 (선택, 기본값: 0)
   * - factUnit: 공장단위 (선택, 기본값: 2)
   * - workingEndDate: 작업종료일 (선택, 기본값: "")
   */
  @Get('units/detail')
  @ApiOperation({ summary: '특정 호기 공정 상세 조회' })
  @ApiOkStandard(AssemblyMonitoringUnitDetailResponseDto, {
    description: 'Unit detail (null when not found)',
    nullable: true,
  })
  async findUnitDetail(
    @Query() query: AssemblyMonitoringUnitDetailQueryDto,
  ): Promise<AssemblyMonitoringUnitDetailResponseDto | null> {
    return this.monitoringService.findUnitDetail(query);
  }
}
