import {
  Body,
  Controller,
  DefaultValuePipe,
  Delete,
  Get,
  Param,
  ParseIntPipe,
  Patch,
  Post,
  Query,
} from '@nestjs/common';
import { PermissionService } from './permission.service';
import { CreatePermissionDto } from './dto/create-permission.dto';
import { Permission } from '../public/permission.decorator';
import { UpdatePermissionDto } from './dto/update-permission.dto';
import { Reject } from '../public/reject.decorator';
import { ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiParam, ApiQuery } from '@nestjs/swagger';
import { Permission as PermissionEntity } from '@app/models';
import { GetAllPermission } from './entity/get-all-permission.entry';

@Controller('permission')
export class PermissionController {
  constructor(private readonly permissionService: PermissionService) {}

  @ApiOperation({summary: '创建一个权限字段'})
  @ApiCreatedResponse({
    description: '数据库记录',
    type: PermissionEntity
  })
  @Permission('permission::add')
  @Post()
  create(@Body() dto: CreatePermissionDto) {
    return this.permissionService.create(dto, false);
  }


  @ApiOperation({summary: '修改一个权限字段'})
  @Reject()
  @Patch()
  @Permission('permission::update')
  update(@Body() dto: UpdatePermissionDto) {
    return this.permissionService.updatePermission(dto);
  }

  @ApiOperation({summary: '分页查询权限'})
  @ApiQuery({name: 'page', description: '页码, 必须是一个正整数'})
  @ApiQuery({name: 'limit', description: '页大小, 必须是一个正整数'})
  @ApiQuery({name: 'name', description: '模糊查找条件'})
  @ApiOkResponse({type: GetAllPermission })
  @Get()
  @Permission('permission::get')
  find(
    @Query('page', new DefaultValuePipe('1'), ParseIntPipe) page: number,
    @Query('limit', new DefaultValuePipe('0'), ParseIntPipe) limit: number,
    @Query('name') name?: string
  ) {
    return this.permissionService.findPermission(page, limit, name);
  }

  @ApiOperation({summary: '删除权限字段'})
  @ApiParam({name: 'id', description: '你想删除的权限字段的数据库主键'})
  @ApiOkResponse({type: PermissionEntity })
  @Reject()
  @Delete('/:id')
  @Permission('permission::remove')
  del(@Param('id') id: number) {
    return this.permissionService.delPermission(id);
  }
}