import { Body, Controller, Delete, Get, Param, Post, Put, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiParam, ApiTags } from '@nestjs/swagger';
import { RequireModule } from 'src/auth/decorators/require-module.decorator';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { CreateProductoEspecificacionDto } from './dto/create-producto-especificacion.dto';
import { ReordenarProductoEspecificacionesDto } from './dto/reordenar-producto-especificaciones.dto';
import { UpdateProductoEspecificacionDto } from './dto/update-producto-especificacion.dto';
import { ProductoEspecificacionesService } from './producto-especificaciones.service';

@ApiTags('Producto Especificaciones')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller({ version: '1', path: 'producto-especificaciones' })
export class ProductoEspecificacionesController {
  constructor(private readonly service: ProductoEspecificacionesService) {}

  @Post()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_EDITAR')
  @ApiBody({ type: CreateProductoEspecificacionDto })
  async create(@Body(ValidationPipe) dto: CreateProductoEspecificacionDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get('por-producto/:productoId')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_VER')
  @ApiParam({ name: 'productoId', description: 'ID del producto' })
  async findByProducto(@Param('productoId') productoId: string, @GetUser() user: LoginUserInfo) {
    return this.service.findByProducto(productoId, user.empresa_id);
  }

  @Put('por-producto/:productoId/reordenar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_EDITAR')
  @ApiParam({ name: 'productoId', description: 'ID del producto' })
  @ApiBody({ type: ReordenarProductoEspecificacionesDto })
  async reordenar(
    @Param('productoId') productoId: string,
    @Body(ValidationPipe) dto: ReordenarProductoEspecificacionesDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.reordenar(productoId, dto, user.empresa_id);
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_VER')
  @ApiParam({ name: 'id', description: 'ID de la especificación' })
  async findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findOne(id, user.empresa_id);
  }

  @Put(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID de la especificación' })
  @ApiBody({ type: UpdateProductoEspecificacionDto })
  async update(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: UpdateProductoEspecificacionDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.update(id, dto, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRD_PRODUCTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID de la especificación' })
  async remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.remove(id, user.empresa_id);
  }
}
