import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Query,
  UseGuards,
} from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';

import { AdminJwtAuthGuard } from '@api/modules/auth/admin/jwt.guard';
import {
  CreateBoardCategoryDto,
  DeleteBoardCategoryDto,
  GetAdminBoardCategoryListDto,
  GetBoardByCategoryDto,
  GetBoardCategoryAllListResponseDto,
  GetBoardCategoryListResponseDto,
  UpdateBoardCategoryDto,
} from './board-category.dto';
import { BoardCategoryService } from './board-category.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/board-category')
export class AdminBoardCategoryController {
  constructor(private boardCategoryService: BoardCategoryService) {}

  @ApiOperation({
    summary: `게시카테고리 목록/검색`,
  })
  @Get()
  @ApiOkResponse({ type: GetBoardCategoryListResponseDto })
  async getBoardCategoryList(@Query() query: GetAdminBoardCategoryListDto) {
    const data = await this.boardCategoryService.getBoardCategoryList(query);
    return plainToInstance(GetBoardCategoryListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @ApiOperation({
    summary: '게시카테고리 전체조회',
  })
  @Get('all')
  @ApiOkResponse({ type: GetBoardCategoryAllListResponseDto })
  async getAllBoardCategoryList() {
    const data = await this.boardCategoryService.getAllBoardCategoryList(true);
    return plainToInstance(GetBoardCategoryAllListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Get(':bcaId')
  @ApiOperation({
    summary: '게시카테고리 상세조회',
  })
  @ApiOkResponse({ type: GetBoardByCategoryDto })
  async getBoardCategory(@Param('bcaId') bcaId: number) {
    const data = await this.boardCategoryService.getDetail(bcaId);
    return plainToInstance(GetBoardByCategoryDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Post()
  @ApiOperation({
    summary: '게시카테고리 신규등록',
  })
  async createBoardCategory(@Body() body: CreateBoardCategoryDto) {
    await this.boardCategoryService.createBoardCategory(body);
    return;
  }

  @Post('edit/:bcaId')
  @ApiOperation({
    summary: '게시카테고리 수정',
  })
  async updateBoardCategory(
    @Param('bcaId') bcaId: number,
    @Body() body: UpdateBoardCategoryDto,
  ) {
    await this.boardCategoryService.updateBoardCategory(bcaId, body);
    return;
  }

  @Post('delete')
  @ApiOperation({
    summary: '게시카테고리 삭제',
  })
  async deleteBoardCategory(@Body() body: DeleteBoardCategoryDto) {
    await this.boardCategoryService.deleteBoardCategory(body);
    return;
  }
}
