import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseBoolPipe,
  Patch,
  Post,
  Put,
  Query,
  UseGuards,
  ValidationPipe,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiQuery, 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 { CreateProveedorMarcaDto } from './dto/create-proveedor-marca.dto';
import { UpdateProveedorMarcaDto } from './dto/update-proveedor-marca.dto';
import { ProveedorMarcaService } from './proveedor-marca.service';

@ApiTags('Proveedor-Marca')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard)
@RequireModule('INVENTARIO')
@Controller({ version: '1', path: 'proveedor-marca' })
export class ProveedorMarcaController {
  constructor(private readonly service: ProveedorMarcaService) {}

  @Get()
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_VER')
  @ApiQuery({ name: 'proveedorId', required: false })
  @ApiQuery({ name: 'marcaId', required: false })
  @ApiQuery({ name: 'activo', required: false, type: Boolean })
  async findAll(
    @GetUser() user: LoginUserInfo,
    @Query('proveedorId') proveedorId?: string,
    @Query('marcaId') marcaId?: string,
    @Query('activo') activo?: string,
  ) {
    return this.service.findAll(user.empresa_id, {
      proveedor_id: proveedorId,
      marca_id: marcaId,
      activo: typeof activo === 'undefined' ? undefined : activo === 'true',
    });
  }

  @Get('proveedor/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_VER')
  async findByProveedor(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findByProveedor(id, user.empresa_id);
  }

  @Get('marca/:id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_VER')
  async findByMarca(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findByMarca(id, user.empresa_id);
  }

  @Get(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_VER')
  async findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findOne(id, user.empresa_id);
  }

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

  @Put(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_VINCULAR')
  async update(
    @Param('id') id: string,
    @Body(ValidationPipe) dto: UpdateProveedorMarcaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.update(id, dto, user.empresa_id, user.id);
  }

  @Patch(':id/desactivar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_DESVINCULAR')
  async desactivar(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.remove(id, user.empresa_id, user.id);
  }

  @Delete(':id')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_DESVINCULAR')
  async remove(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.remove(id, user.empresa_id, user.id);
  }

  @Post('backfill')
  @UseGuards(PermissionGuard)
  @RequirePermission('INVENTARIO', 'INV_PRM_PROVEEDOR_MARCA_BACKFILL')
  async backfill(@GetUser() user: LoginUserInfo) {
    return this.service.backfill(user.empresa_id, user.id);
  }
}
