import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { CreateUserSchema, UpdateUserSchema, CreateRoleSchema, UpdateRoleSchema, CreateApiKeySchema, PaginationQuery, CreateUserDto, UpdateUserDto, CreateRoleDto, CreateApiKeyDto, PaginationQueryDto } from '@wms/shared';
import { z } from 'zod';
import { RequirePermissions } from '@/common/auth/decorators';
import { zodBody, zodQuery } from '@/common/validation/zod.pipe';
import { UsersService } from './users.service';

@ApiTags('users')
@ApiBearerAuth()
@Controller()
export class UsersController {
  constructor(private readonly users: UsersService) {}

  @Get('users')
  @RequirePermissions('users.read')
  list(@Query(zodQuery(PaginationQuery)) q: PaginationQueryDto) {
    return this.users.list(q);
  }

  @Get('users/:id')
  @RequirePermissions('users.read')
  get(@Param('id') id: string) {
    return this.users.get(id);
  }

  @Post('users')
  @RequirePermissions('users.manage')
  create(@Body(zodBody(CreateUserSchema)) dto: CreateUserDto) {
    return this.users.create(dto);
  }

  @Patch('users/:id')
  @RequirePermissions('users.manage')
  update(@Param('id') id: string, @Body(zodBody(UpdateUserSchema)) dto: UpdateUserDto) {
    return this.users.update(id, dto);
  }

  @Get('roles')
  @RequirePermissions('users.read')
  listRoles() {
    return this.users.listRoles();
  }

  @Get('roles/permissions')
  @RequirePermissions('users.read')
  listPermissions() {
    return this.users.listPermissions();
  }

  @Post('roles')
  @RequirePermissions('roles.manage')
  createRole(@Body(zodBody(CreateRoleSchema)) dto: CreateRoleDto) {
    return this.users.createRole(dto);
  }

  @Patch('roles/:id')
  @RequirePermissions('roles.manage')
  updateRole(@Param('id') id: string, @Body(zodBody(UpdateRoleSchema)) dto: z.infer<typeof UpdateRoleSchema>) {
    return this.users.updateRole(id, dto);
  }

  @Delete('roles/:id')
  @RequirePermissions('roles.manage')
  deleteRole(@Param('id') id: string) {
    return this.users.deleteRole(id);
  }

  @Get('api-keys')
  @RequirePermissions('apikeys.manage')
  listApiKeys() {
    return this.users.listApiKeys();
  }

  @Post('api-keys')
  @RequirePermissions('apikeys.manage')
  createApiKey(@Body(zodBody(CreateApiKeySchema)) dto: CreateApiKeyDto) {
    return this.users.createApiKey(dto);
  }

  @Delete('api-keys/:id')
  @RequirePermissions('apikeys.manage')
  revokeApiKey(@Param('id') id: string) {
    return this.users.revokeApiKey(id);
  }
}
