import { Body, Controller, Delete, Get, Param, Post, Put, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiParam } from '@nestjs/swagger';
import { RequireModule } from '../auth/decorators/require-module.decorator';
import { RequirePermission } from '../auth/decorators/require-permission.decorator';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { ModuleGuard } from '../auth/guards/module.guard';
import { PermissionGuard } from '../auth/guards/permission.guard';
import { AsignacionesSucursalService } from './asignaciones-sucursal.service';
import { CreateAsignacionDto } from './dto/create-asignacion.dto';
import { UpdateAsignacionDto } from './dto/update-asignacion.dto';

@Controller({ version: '1', path: 'asignaciones-sucursal' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('ADMINISTRACION')
@ApiBearerAuth()
export class AsignacionesSucursalController {
  constructor(private readonly asignacionesService: AsignacionesSucursalService) {}

  @Post()
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_CREAR')
  @ApiBody({ type: CreateAsignacionDto })
  async create(@Body(ValidationPipe) dto: CreateAsignacionDto, @GetUser() user: LoginUserInfo) {
    return this.asignacionesService.create(dto, user?.empresa_id, user?.id);
  }

  @Get()
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_VER')
  async findAll(@GetUser() user: LoginUserInfo) {
    return this.asignacionesService.findAll(user.empresa_id);
  }

  @Get('usuario/:usuario_id')
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_VER')
  @ApiParam({ name: 'usuario_id', type: 'string', description: 'ID del usuario' })
  async findByUsuario(@Param('usuario_id') usuario_id: string) {
    return this.asignacionesService.findByUsuario(usuario_id);
  }

  @Get('me')
  async findMyAsignaciones(@GetUser() user: LoginUserInfo) {
    return this.asignacionesService.findByUsuario(user.id);
  }

  @Get(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_VER')
  @ApiParam({ name: 'id', type: 'string', description: 'ID de la asignación' })
  async findOne(@Param('id') id: string) {
    return this.asignacionesService.findOne(id);
  }

  @Put(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_EDITAR')
  @ApiParam({ name: 'id', type: 'string', description: 'ID de la asignación' })
  @ApiBody({ type: UpdateAsignacionDto })
  async update(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: UpdateAsignacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.asignacionesService.update(id, dto, user?.empresa_id, user?.id);
  }

  @Delete(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_SUC_SUCURSAL_ELIMINAR')
  @ApiParam({ name: 'id', type: 'string', description: 'ID de la asignación' })
  async remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.asignacionesService.remove(id, user?.empresa_id, user?.id);
  }
}
