import {
    Body,
    Controller,
    Delete,
    Get,
    Param,
    Patch,
    Post,
    Put,
    Query,
    UseGuards,
    ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiBody, ApiParam, ApiQuery } 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 { DepositosService } from './depositos.service';
import { CreateDepositoDto } from './dto/create-deposito.dto';
import { UpdateDepositoDto } from './dto/update-deposito.dto';

@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller({ version: '1', path: 'depositos' })
export class DepositosController {
  constructor(private readonly depositosService: DepositosService) {}

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

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_VER')
  @ApiQuery({ name: 'sucursal_id', required: false, description: 'Filtrar por sucursal' })
  async findAll(@GetUser() user: LoginUserInfo, @Query('sucursal_id') sucursal_id?: string) {
    return this.depositosService.findAll(user.empresa_id, sucursal_id, user.id);
  }

  @Get('principal/:sucursal_id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_VER')
  @ApiParam({ name: 'sucursal_id', description: 'ID de la sucursal' })
  async findPrincipal(@Param('sucursal_id') sucursal_id: string, @GetUser() user: LoginUserInfo) {
    return this.depositosService.findPrincipal(user.empresa_id, sucursal_id);
  }

  @Get('validar-principal/:sucursal_id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_VER')
  @ApiParam({ name: 'sucursal_id', description: 'ID de la sucursal' })
  async validarPrincipal(@Param('sucursal_id') sucursal_id: string, @GetUser() user: LoginUserInfo) {
    return this.depositosService.validarDepositoPrincipal(user.empresa_id, sucursal_id);
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_VER')
  @ApiParam({ name: 'id', description: 'ID del depósito' })
  async findOne(@Param('id') id: string) {
    return this.depositosService.findOne(id);
  }

  @Put(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del depósito' })
  @ApiBody({ type: UpdateDepositoDto })
  async update(@Param('id') id: string, @Body(ValidationPipe) dto: UpdateDepositoDto, @GetUser() user: LoginUserInfo) {
    return this.depositosService.update(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/toggle')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_EDITAR')
  @ApiParam({ name: 'id', description: 'ID del depósito' })
  async toggleActive(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.depositosService.toggleActive(id, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_DEP_DEPOSITO_ELIMINAR')
  @ApiParam({ name: 'id', description: 'ID del depósito' })
  async remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.depositosService.remove(id, user.empresa_id, user.id);
  }
}
