import {
  Body,
  Controller,
  DefaultValuePipe,
  Delete,
  Get,
  HttpException,
  HttpStatus,
  Param,
  ParseArrayPipe,
  Patch,
  Post,
  Query,
  Req,
} from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { Permission } from '../public/permission.decorator';
import { UpdateUserDto } from './dto/update-user.dto';
import { PaginationQueryDto } from './dto/pagination-query.dto';
import { UpdatePwdAdminDto } from './dto/update-pwd-admin.dto';
import { UpdatePwdUserDto } from './dto/update-pwd-user.dto';
import { I18n, I18nContext } from 'nestjs-i18n';
import { I18nTranslations } from '../.generate/i18n.generated';
import { Reject } from '../public/reject.decorator';
import { ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiParam, ApiProperty } from '@nestjs/swagger';
import { User } from '@app/models';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @ApiOperation({summary: '创建用户'})
  @ApiCreatedResponse({
    type: ()=>User,
    description: '返回创建后的用户'
  })
  @ApiBearerAuth()
  @Post('reg')
  @Permission('user::add')
  async register(@Body() body: CreateUserDto) {
    return this.userService.create(body, false);
  }


  @ApiOperation({summary: '获取用户信息'})
  @ApiParam({
    name: 'email',
    description: '用户邮箱'
  })
  @ApiOkResponse({
    type: ()=>User
  })
  @Get('/info/:email?')
  async getUserInfo(
    @I18n() i18n: I18nContext<I18nTranslations>,
    @Req() request: Request & RequestUser,
    @Param('email') email?: string
  ) {
    const _email = email ? email : request.user.email;
    if (!_email) {
      throw new HttpException(
        i18n.t('exception.common.unauth', { lang: I18nContext.current().lang }),
        HttpStatus.UNAUTHORIZED
      );
    }
    return this.userService.getUserInfo(_email, ['role', 'role.permission']);
  }

  @ApiOperation({summary: '删除用户'})
  @ApiParam({
    name: 'email',
    description: '用户邮箱'
  })
  @ApiOkResponse({
    type: User
  })
  @Reject()
  @Delete('/:email')
  @Permission('user::remove')
  async delUser(@Param('email') email: string) {
    return this.userService.deleteUser(email);
  }

  @ApiOperation({summary: '修改用户信息'})
  @ApiOkResponse({
    type: User,
  })
  @Reject()
  @Patch('/update')
  @Permission('user::update')
  async UpdateUser(@Body() body: UpdateUserDto) {
    return this.userService.updateUserInfo(body);
  }

  @ApiOperation({summary: '分页查询用户'})
  @Get()
  @Permission('user::query')
  async getAllUser(
    @Query() paginationQuery: PaginationQueryDto,
    @Query('name') name?: string,
    @Query('role', new DefaultValuePipe([]), ParseArrayPipe) role?: number[],
    @Query('email') email?: string
  ) {
    return this.userService.getAllUser(paginationQuery, name, role, email);
  }

  @ApiOperation({summary: '修改某位用户的密码', description: '强制性的修改'})
  @Reject()
  @Patch('/admin/updatePwd')
  @Permission('user::password::force-update')
  async updatePwdAdmin(@Body() body: UpdatePwdAdminDto) {
    return this.userService.updatePwdAdmin(body);
  }

  @ApiOperation({summary: '修改自身的密码'})
  @Reject()
  @Patch('/updatePwd')
  @Permission('user::update')
  async updatePwdUser(@Body() body: UpdatePwdUserDto) {
    return this.userService.updatePwdUser(body);
  }

  @ApiOperation({summary: '批量删除用户'})
  @ApiOkResponse({
    type: [User]
  })
  @Reject()
  @Post('/batch')
  @Permission('user::batch-remove')
  async batchRemoveUser(
    @Body() emails: string[],
  ) {
    return this.userService.batchDeleteUser(emails);
  }
}