import { Body, Controller, Delete, Get, Param, Post, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { GetUser } from 'src/auth/get-user.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { RequireModule, RequirePermission } from 'src/auth/decorators';
import { ModuleGuard } from 'src/auth/guards/module.guard';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { InteresManualService } from './interes-manual.service';
import { AnularInteresManualDto, CrearInteresManualDto } from './dto/interes-manual.dto';

/**
 * Interés cargado a mano desde Cuentas por Cobrar, a la cuenta o a una cuota.
 * Cargarlo y quitarlo pide su propio privilegio (`COB_CC_INTERES_MANUAL_CARGAR`),
 * que es del administrativo: el cobrador lo cobra, no lo decide.
 */
@ApiTags('Interés manual')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'interes-manual', version: '1' })
export class InteresManualController {
  constructor(private readonly service: InteresManualService) {}

  @Get('factura/:facturaId')
  @RequirePermission('COBRANZAS', 'COB_CC_CUENTA_COBRAR_VER')
  @ApiOperation({ summary: 'Listar los intereses manuales de una factura' })
  listar(@Param('facturaId') facturaId: string, @GetUser() user: LoginUserInfo) {
    return this.service.listarPorFactura(user.empresa_id, facturaId);
  }

  @Post()
  @RequirePermission('COBRANZAS', 'COB_CC_INTERES_MANUAL_CARGAR')
  @ApiOperation({ summary: 'Cargar un interés manual a una cuenta o a una cuota' })
  crear(@Body() dto: CrearInteresManualDto, @GetUser() user: LoginUserInfo) {
    return this.service.crear(user.empresa_id, user.id, dto);
  }

  @Delete(':id')
  @RequirePermission('COBRANZAS', 'COB_CC_INTERES_MANUAL_CARGAR')
  @ApiOperation({ summary: 'Anular un interés manual del que no se cobró nada' })
  anular(@Param('id') id: string, @Body() dto: AnularInteresManualDto, @GetUser() user: LoginUserInfo) {
    return this.service.anular(user.empresa_id, id, user.id, dto?.motivo);
  }
}
