import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  UseGuards,
  Req,
  Query,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { RolesGuard } from 'common/guards/roles.guard';
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard';
import { Roles } from 'common/guards/decorators/roles.decorator';
import { UpdateUserDto } from './dto/update-user.dto';
import { PaginationQueryDto } from 'common/dto/pagination-query.dto';
import { UpdateProfileDto } from './dto/update-profile.dto';
import { ChangePasswordDto } from './dto/change-password.dto';
import { DeleteUsersDto } from './dto/delete-bulk-users.dto';
import { UserRole } from 'common/enums/user.enum';
import { ApiBearerAuth, ApiParam, ApiTags, ApiBody } from '@nestjs/swagger';

@ApiTags('Users')
@ApiBearerAuth('access-token')
@Controller('users')
@UseGuards(JwtAuthGuard, RolesGuard)
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  @Roles(UserRole.HR_ADMIN)
  findAll(@Query() query: PaginationQueryDto, @Req() req) {
    return this.usersService.findAll(query, req.user.userId);
  }

  @Get(':id')
  findOne(@Param('id') id: number) {
    return this.usersService.findOne(id);
  }

  @Post()
  @Roles(UserRole.HR_ADMIN)
  create(@Body() createUserDto: CreateUserDto) {
    return this.usersService.create(createUserDto);
  }

  @Get('me')
  @UseGuards(JwtAuthGuard)
  getProfile(@Req() req) {
    return this.usersService.findOne(req.user.userId).then((user) => {
      const { password, ...safeUser } = user;
      return safeUser;
    });
  }

  @Put(':id')
  @Roles(UserRole.HR_ADMIN)
  @ApiParam({ name: 'id', description: 'The ID of the user to update' })
  update(@Param('id') id: number, @Body() updateUserDto: UpdateUserDto) {
    return this.usersService.update(id, updateUserDto);
  }

  @Put('me/update')
  updateProfile(@Req() req, @Body() dto: UpdateProfileDto) {
    return this.usersService.updateProfile(req.user.userId, dto);
  }

  @Put('me/change-password')
  changePassword(@Req() req, @Body() dto: ChangePasswordDto) {
    return this.usersService.changePassword(req.user.userId, dto);
  }

  @Delete(':id')
  @Roles(UserRole.HR_ADMIN)
  @ApiParam({ name: 'id', description: 'The ID of the user to delete' })
  remove(@Param('id') id: number) {
    return this.usersService.remove(id);
  }

  @Delete()
  @Roles(UserRole.HR_ADMIN)
  @ApiBody({ type: DeleteUsersDto })
  removeBulk(@Body() deleteUsersDto: DeleteUsersDto) {
    return this.usersService.removeBulk(deleteUsersDto.ids);
  }
}
