import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Req,
} from '@nestjs/common';
import type { Request } from 'express';

import { Roles } from '../../common/auth/roles.decorator';
import { UserRole } from '../../generated/prisma/enums';
import { AuthRequestUser } from '../auth/interfaces/auth-request-user.interface';
import { CreateUserDto } from './dto/create-user.dto';
import { ListUsersQueryDto } from './dto/list-users-query.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { UsersService } from './users.service';

@Controller('users')
@Roles(UserRole.super_admin)
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get('allUsers')
  listUsers(@Query() query: ListUsersQueryDto) {
    return this.usersService.listUsers(query);
  }

  @Get('assignees')
  listAssignableUsers() {
    return this.usersService.listAssignableUsers();
  }

  @Get('seo-managers')
  listSeoManagers() {
    return this.usersService.listSeoManagers();
  }

  @Post()
  createUser(
    @Body() dto: CreateUserDto,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.usersService.createUser(dto, request.user?.id);
  }

  @Patch(':id')
  updateUser(
    @Param('id') userId: string,
    @Body() dto: UpdateUserDto,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.usersService.updateUser(userId, dto, request.user?.id);
  }

  @Delete(':id')
  deleteUser(
    @Param('id') userId: string,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.usersService.softDeleteUser(userId, request.user?.id);
  }

  @Patch(':id/restore')
  restoreUser(
    @Param('id') userId: string,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.usersService.restoreUser(userId, request.user?.id);
  }

  // Legacy invitation endpoint retained as commented code for future reuse.
  // @Post(':id/resend-password-setup')
  // resendPasswordSetupEmail(
  //   @Param('id') userId: string,
  //   @Req() request: Request & { user: AuthRequestUser },
  // ) {
  //   return this.usersService.resendPasswordSetupEmail(userId, request.user?.id);
  // }
}
