import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseIntPipe,
  Post,
  Put,
  UseGuards,
} from '@nestjs/common';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { PermissionsGuard } from '../auth/guards/permissions.guard';
import { Permissions } from '../auth/permissions.decorator';
import { RolesService } from './role.service';
import { CreateRoleDto, UpdateRoleDto } from './dto/role.dto';

@Controller('api/v1/admin/roles')
@UseGuards(JwtAuthGuard, PermissionsGuard)
export class RolesController {
  constructor(private readonly rolesService: RolesService) {}

  @Get()
  @Permissions('role.view')
  async findAll() {
    const data = await this.rolesService.findAll();
    return { success: true, message: 'Success', data };
  }

  @Get(':id')
  @Permissions('role.view')
  async findById(@Param('id', ParseIntPipe) id: number) {
    const role = await this.rolesService.findById(id);
    if (!role) return { success: false, message: 'Role not found' };
    return { success: true, message: 'Success', data: role };
  }

  @Post()
  @Permissions('role.create')
  async create(@Body() dto: CreateRoleDto) {
    const role = await this.rolesService.create(dto);
    return { success: true, message: 'Role created', data: role };
  }

  @Put(':id')
  @Permissions('role.update')
  async update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateRoleDto) {
    const role = await this.rolesService.update(id, dto);
    return { success: true, message: 'Role updated', data: role };
  }

  @Delete(':id')
  @Permissions('role.delete')
  async delete(@Param('id', ParseIntPipe) id: number) {
    const success = await this.rolesService.delete(id);
    return { success, message: success ? 'Role deleted' : 'Role not found' };
  }
}
