import { AdminJwtAuthGuard } from '@api/modules/auth/admin/jwt.guard';
import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Query,
  UseGuards,
} from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';
import {
  ClientContractOptionListDto,
  CreateClientContractDto,
  DeleteClientContractDto,
  GetAgencyContractListResponseDto,
  GetClientContractDto,
  GetClientContractListDto,
  UpdateClientContractDto,
} from './client-contract-admin.dto';
import { AdminClientContractService } from './client-contract-admin.service';
import { RolesGuard } from '@api/modules/auth/admin/roles.guard';
import { Roles } from '@api/modules/auth/admin/roles.decorator';

@ApiTags('[관리자] 고객사 계약정보')
@UseGuards(AdminJwtAuthGuard, RolesGuard)
@Roles('admin')
@Controller('admin/client-contracts')
export class AdminClientContractController {
  constructor(private adminClientContractService: AdminClientContractService) {}

  @ApiOperation({
    summary: '고객사 계약정보 목록/검색',
  })
  @Get()
  @ApiOkResponse({ type: GetAgencyContractListResponseDto })
  async getClientList(@Query() query: GetClientContractListDto) {
    const data =
      await this.adminClientContractService.getClientContractList(query);
    return plainToInstance(GetAgencyContractListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Get('options')
  @ApiOperation({
    summary: '고객사 계약 옵션 리스트 조회',
  })
  @ApiOkResponse({ type: ClientContractOptionListDto })
  async getClientOptions() {
    const data = await this.adminClientContractService.getAnalysisOptionList();
    return plainToInstance(ClientContractOptionListDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Get(':actId')
  @ApiOperation({
    summary: '고객사 계약정보 상세조회',
  })
  @ApiOkResponse({ type: GetClientContractDto })
  async getClient(@Param('actId') actId: number) {
    const data = await this.adminClientContractService.getDetail(actId);
    return plainToInstance(GetClientContractDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Post()
  @ApiOperation({
    summary: '고객사 계약정보 신규등록',
  })
  async createClient(@Body() body: CreateClientContractDto) {
    await this.adminClientContractService.createClientContract(body);
    return;
  }

  @Post('edit/:actId')
  @ApiOperation({
    summary: '고객사 계약정보 수정',
  })
  async updateClient(
    @Param('actId') actId: number,
    @Body() body: UpdateClientContractDto,
  ) {
    await this.adminClientContractService.updateClientContract(actId, body);
    return;
  }

  @Post('delete')
  @ApiOperation({
    summary: '고객사 계약정보 삭제',
  })
  async deleteClient(@Body() body: DeleteClientContractDto) {
    await this.adminClientContractService.deleteClientContract(body);
    return;
  }
}
