import { Body, Controller, Delete, Get, Param, Post, Put, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth } 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 type { CreateNumeracionDto, UpdateNumeracionDto } from './numeraciones.service';
import { NumeracionesService } from './numeraciones.service';

@Controller({ version: '1', path: 'numeraciones' })
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('ADMINISTRACION')
@ApiBearerAuth()
export class NumeracionesController {
  constructor(private readonly numeracionesService: NumeracionesService) {}

  @Post()
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_CREAR')
  create(@Body() createDto: CreateNumeracionDto, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.create(createDto, user.id);
  }

  @Get()
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_VER')
  findAllByPuntoExpedicion(@Query('punto_expedicion_id') punto_expedicion_id: string) {
    return this.numeracionesService.findAllByPuntoExpedicion(punto_expedicion_id);
  }

  @Get('sucursal/:sucursal_id')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_VER')
  findAllBySucursal(@Param('sucursal_id') sucursal_id: string, @Query('tipo_documento_id') tipo_documento_id?: string) {
    return this.numeracionesService.findAllBySucursal(sucursal_id, tipo_documento_id);
  }

  @Get(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_VER')
  findOne(@Param('id') id: string) {
    return this.numeracionesService.findOne(id);
  }

  @Get(':id/next')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_VER')
  getNextNumber(@Param('id') id: string) {
    return this.numeracionesService.getNextNumber(id);
  }

  @Post(':id/reserve')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  reserveNextNumber(@Param('id') id: string) {
    return this.numeracionesService.reserveNextNumber(id);
  }

  @Put(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  update(@Param('id') id: string, @Body() updateDto: UpdateNumeracionDto, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.update(id, updateDto, user.id);
  }

  @Put(':id/increment')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  incrementNumber(@Param('id') id: string) {
    return this.numeracionesService.incrementNumber(id);
  }

  @Put(':id/set-default')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  setDefault(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.setDefault(id, user.id);
  }

  @Put(':id/unset-default')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  unsetDefault(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.unsetDefault(id, user.id);
  }

  @Put('activar-desactivar/:id')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_EDITAR')
  toggleStatus(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.toggleStatus(id, user.id);
  }

  @Delete(':id')
  @RequirePermission('ADMINISTRACION', 'ADM_NUM_NUMERACION_ELIMINAR')
  remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.numeracionesService.remove(id, user.id);
  }
}
