import { Controller, Get, Query, Req, UseGuards } from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';
import { AdminOptionalGuard } from '../auth/admin/admin-optional.guard';
import { AnalysisTargetGuard } from '../auth/analysis-target.guard';
import { JwtOptionalGuard } from '../auth/user/jwt-optional.guard';
import {
  GetRecommendedExaminationDto,
  GetRecommendedExaminationResponseDto,
} from './clinical-result.dto';
import { ClinicalResultService } from './clinical-result.service';

@ApiTags('[공개] 검사기준')
@Controller('examination-standard')
export class ClinicalResultPublicController {
  constructor(
    private clinicalResultService: ClinicalResultService,
  ) {}

  //* AdminOptionalGuard: 관리자 admin-view(iframe) 열람 — 소유자 검증의 대체 통과 경로(req.admin)
  //* AnalysisTargetGuard: bodId(B2C) · codId(고객사) 분기 인가 + 대상 ID 하나만
  @Get('recommended-examination')
  @UseGuards(JwtOptionalGuard, AdminOptionalGuard, AnalysisTargetGuard)
  @ApiOperation({
    summary: '검사기준 추천 조회 (정회원/B2C/고객사)',
    description: 'oddId 또는 bodId 또는 codId를 기준으로 검사기준 추천 목록을 조회합니다. B2C는 bodId, 고객사는 codId, 정회원은 JWT + oddId 필요',
  })
  @ApiOkResponse({ type: GetRecommendedExaminationResponseDto })
  async getRecommendedExamination(@Query() query: GetRecommendedExaminationDto, @Req() req: any) {
    const memId = req.user?.memId || null; // B2C/고객사는 memId가 없음
    const data = await this.clinicalResultService.getRecommendedExamination(query.oddId, query.bodId, query.codId, memId, req.admin);
    return plainToInstance(GetRecommendedExaminationResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }
}
