import {
  Body,
  Controller,
  Get,
  Param,
  ParseUUIDPipe,
  Put,
  Query,
  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 { InteresesMoratoriosService } from './intereses-moratorios.service';
import {
  PreviewInteresQueryDto,
  UpsertConfigInteresesDto,
} from './dto/intereses-moratorios.dto';

@ApiTags('Intereses Moratorios')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), ModuleGuard, PermissionGuard)
@RequireModule('COBRANZAS')
@Controller({ path: 'intereses-moratorios', version: '1' })
export class InteresesMoratoriosController {
  constructor(private readonly service: InteresesMoratoriosService) {}

  @Get('config')
  @RequirePermission('COBRANZAS', 'COB_INT_CONFIG_VER')
  @ApiOperation({ summary: 'Obtener configuración de intereses moratorios' })
  getConfig(@GetUser() user: LoginUserInfo) {
    return this.service.getConfig(user.empresa_id);
  }

  @Put('config')
  @RequirePermission('COBRANZAS', 'COB_INT_CONFIG_EDITAR')
  @ApiOperation({ summary: 'Guardar configuración de intereses moratorios' })
  upsertConfig(
    @Body() dto: UpsertConfigInteresesDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.upsertConfig(user.empresa_id, dto);
  }

  @Get('preview')
  @RequirePermission('COBRANZAS', 'COB_INT_PREVIEW')
  @ApiOperation({
    summary:
      'Calcular interés bruto/neto/IVA para una cuota (con exoneración opcional)',
  })
  preview(@Query() query: PreviewInteresQueryDto, @GetUser() user: LoginUserInfo) {
    return this.service.previewParaCuota(
      user.empresa_id,
      query.factura_cuota_id,
      Number(query.monto_exonerado ?? 0),
    );
  }

  @Get('recibo/:recibo_cobro_id')
  @RequirePermission('COBRANZAS', 'COB_INT_VER')
  @ApiOperation({
    summary: 'Listar intereses moratorios cobrados asociados a un recibo',
  })
  listarPorRecibo(
    @Param('recibo_cobro_id', ParseUUIDPipe) recibo_cobro_id: string,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.listarPorRecibo(user.empresa_id, recibo_cobro_id);
  }

  @Get('factura/:factura_cab_id/desglose')
  @RequirePermission('COBRANZAS', 'COB_INT_VER')
  @ApiOperation({
    summary:
      'Desglose de una factura de intereses moratorios para disputas/soporte (línea por cuota con factura origen, días, tasa, exoneración)',
  })
  desgloseFactura(
    @Param('factura_cab_id', ParseUUIDPipe) factura_cab_id: string,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.desgloseFacturaIntereses(user.empresa_id, factura_cab_id);
  }
}
