import { fileOriginNameFilter } from '@api/helpers/file-helper';
import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  UploadedFiles,
  UseGuards,
  UseInterceptors,
} from '@nestjs/common';
import { FileFieldsInterceptor } from '@nestjs/platform-express';
import {
  ApiBody,
  ApiConsumes,
  ApiExtraModels,
  ApiOkResponse,
  ApiOperation,
  ApiParam,
  ApiTags,
  getSchemaPath,
} from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';
import { AdminJwtAuthGuard } from '../auth/admin/jwt.guard';
import { Roles } from '../auth/admin/roles.decorator';
import { RolesGuard } from '../auth/admin/roles.guard';
import {
  GetAdminInstitutionBlockListResponseDto,
  GetInstitutionBlockDetailDto,
  GetInstitutionBlockParamDto,
  UpdateInstitutionBlockDto,
} from './institution-block.dto';
import { InstitutionCode } from './institution-block.entity';
import { InstitutionBlockService } from './institution-block.service';

@ApiTags('[관리자] 기관 사용중지')
@UseGuards(AdminJwtAuthGuard, RolesGuard)
@Roles('admin')
@Controller('admin/institution-block')
export class AdminInstitutionBlockController {
  constructor(private institutionBlockService: InstitutionBlockService) {}

  @ApiOperation({
    summary: '기관 사용중지 설정 목록 (HIRA/NTS 전체)',
  })
  @Get()
  @ApiOkResponse({ type: GetAdminInstitutionBlockListResponseDto })
  async getList() {
    const data = await this.institutionBlockService.getList();
    return plainToInstance(GetAdminInstitutionBlockListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @ApiOperation({
    summary: '기관 사용중지 설정 상세조회',
  })
  @ApiParam({
    name: 'institution',
    enum: InstitutionCode,
    description: '기관코드(HIRA: 심평원 | NTS: 국세청)',
  })
  @Get(':institution')
  @ApiOkResponse({ type: GetInstitutionBlockDetailDto })
  async getDetail(@Param() param: GetInstitutionBlockParamDto) {
    const data = await this.institutionBlockService.getDetail(param.institution);
    return plainToInstance(GetInstitutionBlockDetailDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Post(':institution')
  @ApiOperation({
    summary: `기관 사용중지 설정 수정
     * 기존 업로드된 이미지는 institutionBlockData 의 isbImg 에 S3 키를 그대로 전달 (예: institution-block/images/xxxx.png)
     * 새로 업로드되는 이미지는 multipart 파일(isbImg)로 전송`,
  })
  @ApiParam({
    name: 'institution',
    enum: InstitutionCode,
    description: '기관코드(HIRA: 심평원 | NTS: 국세청)',
  })
  @ApiConsumes('multipart/form-data')
  @ApiExtraModels(UpdateInstitutionBlockDto)
  @ApiBody({
    description: '기관 사용중지 설정 정보',
    schema: {
      type: 'object',
      properties: {
        isbImg: { type: 'string', format: 'binary', nullable: true },
        institutionBlockData: {
          allOf: [{ $ref: getSchemaPath(UpdateInstitutionBlockDto) }],
        },
      },
    },
  })
  @UseInterceptors(
    FileFieldsInterceptor([{ name: 'isbImg', maxCount: 1 }], {
      fileFilter: fileOriginNameFilter,
    }),
  )
  async update(
    @Param() param: GetInstitutionBlockParamDto,
    @UploadedFiles()
    files: Express.Multer.File[],
    @Body('institutionBlockData') institutionBlockDataString: string,
  ) {
    await this.institutionBlockService.update(
      param.institution,
      institutionBlockDataString,
      files,
    );
    return;
  }
}
