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 { RequirePermission, RequireSubmodulo } from 'src/auth/decorators';
import { SubmoduloGuard } from 'src/auth/guards';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { CreateNotaCreditoCompraDto } from './dto/create-nota-credito-compra.dto';
import { NotaCreditoComprasService } from './nota-credito-compras.service';

@ApiTags('Notas de Crédito de Compra')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard, PermissionGuard)
@RequireSubmodulo('COMP_NOTAS_CREDITO')
@Controller({ path: 'nota-credito-compras', version: '1' })
export class NotaCreditoComprasController {
  constructor(private readonly service: NotaCreditoComprasService) {}

  @Post()
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_CREAR')
  @ApiOperation({ summary: 'Registrar nota de crédito de compra (documento recibido del proveedor)' })
  create(@Body() dto: CreateNotaCreditoCompraDto, @GetUser() user: LoginUserInfo) {
    return this.service.create(dto, user.empresa_id, user.id);
  }

  @Get()
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_VER')
  @ApiOperation({ summary: 'Listar notas de crédito de compra' })
  @ApiQuery({ name: 'page', required: false })
  @ApiQuery({ name: 'limit', required: false })
  @ApiQuery({ name: 'proveedor_id', required: false })
  @ApiQuery({ name: 'search', required: false })
  @ApiQuery({ name: 'estado', required: false, enum: ['registrada', 'anulada'] })
  @ApiQuery({ name: 'fecha_desde', required: false, example: '2026-09-01', description: 'Filtra por fecha de emisión, inclusive' })
  @ApiQuery({ name: 'fecha_hasta', required: false, example: '2026-09-30', description: 'Filtra por fecha de emisión, inclusive' })
  findAll(
    @GetUser() user: LoginUserInfo,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
    @Query('proveedor_id') proveedorId?: string,
    @Query('search') search?: string,
    @Query('estado') estado?: string,
    @Query('fecha_desde') fechaDesde?: string,
    @Query('fecha_hasta') fechaHasta?: string,
  ) {
    return this.service.findAll(user.empresa_id, Number(page) || 1, Number(limit) || 20, {
      proveedorId,
      search,
      estado,
      fechaDesde,
      fechaHasta,
    });
  }

  // ── Origen "factura de gasto" (declarar antes de :id para no colisionar) ────────
  @Get('gastos-origen')
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_VER')
  @ApiOperation({ summary: 'Facturas de gasto del proveedor con saldo, para asociar a una NC' })
  @ApiQuery({ name: 'proveedor_id', required: true })
  @ApiQuery({ name: 'search', required: false })
  gastosOrigen(
    @GetUser() user: LoginUserInfo,
    @Query('proveedor_id') proveedorId: string,
    @Query('search') search?: string,
  ) {
    return this.service.gastosOrigen(user.empresa_id, proveedorId, search);
  }

  @Get('gastos-origen/:gastoId')
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_VER')
  @ApiOperation({ summary: 'Detalle de una factura de gasto para precargar los ítems de la NC' })
  gastoOrigenDetalle(@Param('gastoId') gastoId: string, @GetUser() user: LoginUserInfo) {
    return this.service.gastoOrigenDetalle(user.empresa_id, gastoId);
  }

  @Get(':id')
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_VER')
  @ApiOperation({ summary: 'Detalle de una nota de crédito de compra' })
  findOne(@Param('id') id: string, @GetUser() user: LoginUserInfo) {
    return this.service.findOne(id, user.empresa_id);
  }

  @Patch(':id/anular')
  @RequirePermission('COMPRAS', 'CMP_NCC_NOTA_CREDITO_ANULAR')
  @ApiOperation({ summary: 'Anular nota de crédito de compra (repone stock + restaura CxP)' })
  anular(@Param('id') id: string, @Body('motivo') motivo: string, @GetUser() user: LoginUserInfo) {
    return this.service.anular(id, user.empresa_id, motivo, user.id);
  }
}
