import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { AnularRecepcionCompraDto } from './dto/anular-recepcion-compra.dto';
import { CreateRecepcionCompraDto } from './dto/create-recepcion-compra.dto';
import { UpdateRecepcionCompraDto } from './dto/update-recepcion-compra.dto';
import { RecepcionesCompraService } from './recepciones-compra.service';

@ApiTags('Recepciones de Compra')
@Controller({ path: 'recepciones-compra', version: '1' })
export class RecepcionesCompraController {
  constructor(private readonly recepcionesCompraService: RecepcionesCompraService) {}

  @Post()
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Registrar recepción de compra' })
  create(@Body() dto: CreateRecepcionCompraDto, @GetUser() user: LoginUserInfo) {
    return this.recepcionesCompraService.create(dto, user.empresa_id, user.id);
  }

  @Patch(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Editar recepción de compra' })
  update(@Param('id') id: string, @Body() dto: UpdateRecepcionCompraDto, @GetUser() user: LoginUserInfo) {
    return this.recepcionesCompraService.update(id, dto as CreateRecepcionCompraDto, user.empresa_id, user.id);
  }

  @Get()
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Listar recepciones de compra' })
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @ApiQuery({ name: 'fecha_desde', required: false })
  @ApiQuery({ name: 'fecha_hasta', required: false })
  @ApiQuery({ name: 'proveedor_id', required: false })
  @ApiQuery({ name: 'orden_compra_id', required: false })
  @ApiQuery({ name: 'estado', required: false })
  @ApiQuery({ name: 'search', required: false })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('fecha_desde') fecha_desde?: string,
    @Query('fecha_hasta') fecha_hasta?: string,
    @Query('proveedor_id') proveedor_id?: string,
    @Query('orden_compra_id') orden_compra_id?: string,
    @Query('estado') estado?: string,
    @Query('search') search?: string,
  ) {
    return this.recepcionesCompraService.findAll(user.empresa_id, {
      page,
      limit,
      fecha_desde,
      fecha_hasta,
      proveedor_id,
      orden_compra_id,
      estado,
      search,
    });
  }

  @Get(':id')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Obtener detalle de recepción de compra' })
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.recepcionesCompraService.findOne(id, user.empresa_id);
  }

  @Patch(':id/anular')
  @UseGuards(AuthGuard('jwt'))
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Anular recepción de compra' })
  anular(@Param('id') id: string, @Body() dto: AnularRecepcionCompraDto, @GetUser() user: LoginUserInfo) {
    return this.recepcionesCompraService.anular(id, dto, user.empresa_id, user.id);
  }
}
