import { isAppUser } from '@api/helpers/device.helper';
import { JwtAuthGuard } from '@api/modules/auth/user/jwt.guard';
import {
  Controller,
  Get,
  Headers,
  Param,
  Query,
  UseGuards,
} from '@nestjs/common';
import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger';
import { plainToInstance } from 'class-transformer';
import {
  GetBoardByCategoryDto,
  GetBoardByCategoryListDto,
  GetBoardCategoryAllListResponseDto,
  GetBoardCategoryListDto,
  GetBoardCategoryListResponseDto,
} from './board-category.dto';
import { BoardCategoryService } from './board-category.service';

@ApiTags('게시카테고리')
@UseGuards(JwtAuthGuard)
@Controller('board-category')
export class BoardCategoryController {
  constructor(private boardCategoryService: BoardCategoryService) {}

  @ApiOperation({
    summary: `게시카테고리 목록/검색`,
  })
  @Get()
  @ApiOkResponse({ type: GetBoardCategoryListResponseDto })
  async getBoardCategoryList(@Query() query: GetBoardCategoryListDto) {
    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(false);
    return plainToInstance(GetBoardCategoryAllListResponseDto, data, {
      excludeExtraneousValues: true,
    });
  }

  @Get(':bcaId')
  @ApiOperation({
    summary: '카테고리별 게시글',
  })
  @ApiOkResponse({ type: GetBoardByCategoryDto })
  async getBoardByCategoryList(
    @Param('bcaId') bcaId: number,
    @Query() query: GetBoardByCategoryListDto,
    @Headers('user-agent') userAgent: string,
  ) {
    const isApp = isAppUser(userAgent);

    const data = await this.boardCategoryService.getBoardByCategoryList(
      bcaId,
      query,
      isApp,
    );
    return plainToInstance(GetBoardByCategoryDto, data, {
      excludeExtraneousValues: true,
    });
  }
}
