import { Body, Controller, Delete, Get, Param, Patch, 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 { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import type { LoginUserInfo } from '../auth/dto/login.dto';
import { GetUser } from '../auth/get-user.decorator';
import { CreateAtributoDto } from './dto/create-atributo.dto';
import { UpdateAtributoDto } from './dto/update-atributo.dto';
import { CreateAtributoValorDto } from './dto/create-atributo-valor.dto';
import { UpdateAtributoValorDto } from './dto/update-atributo-valor.dto';
import { ProductoAtributosService } from './producto-atributos.service';

@ApiTags('Producto Atributos')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller({ version: '1', path: 'producto-atributos' })
export class ProductoAtributosController {
  constructor(private readonly service: ProductoAtributosService) {}

  // ─── ATRIBUTOS ──────────────────────────────────────────────

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

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_VER')
  async findAllAtributos(@GetUser() user: LoginUserInfo) {
    return this.service.findAllAtributos(user.empresa_id);
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_VER')
  @ApiParam({ name: 'id', description: 'ID del atributo' })
  async findOneAtributo(@Param('id') id: string) {
    return this.service.findOneAtributo(id);
  }

  @Put(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del atributo' })
  @ApiBody({ type: UpdateAtributoDto })
  async updateAtributo(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateAtributoDto, @GetUser() user: LoginUserInfo) {
    return this.service.updateAtributo(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/toggle')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del atributo' })
  async toggleAtributo(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.toggleAtributo(id, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_ELIMINAR')
  @ApiParam({ name: 'id', description: 'ID del atributo' })
  async removeAtributo(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.removeAtributo(id, user.empresa_id, user.id);
  }

  // ─── VALORES DE ATRIBUTO ───────────────────────────────────

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

  @Get(':atributoId/valores')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_VER')
  @ApiParam({ name: 'atributoId', description: 'ID del atributo' })
  async findValores(@Param('atributoId') atributoId: string) {
    return this.service.findValoresByAtributo(atributoId);
  }

  @Put('valores/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del valor' })
  @ApiBody({ type: UpdateAtributoValorDto })
  async updateValor(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateAtributoValorDto, @GetUser() user: LoginUserInfo) {
    return this.service.updateValor(id, dto, user.empresa_id, user.id);
  }

  @Patch('valores/:id/toggle')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del valor' })
  async toggleValor(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.toggleValor(id, user.empresa_id, user.id);
  }

  @Delete('valores/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_ATR_ATRIBUTO_ELIMINAR')
  @ApiParam({ name: 'id', description: 'ID del valor' })
  async removeValor(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.removeValor(id, user.empresa_id, user.id);
  }
}
