import { Body, Controller, Get, Param, ParseUUIDPipe, Post, Query, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { RequirePermission } from 'src/auth/decorators/require-permission.decorator';
import { RequireSubmodulo } from 'src/auth/decorators/require-submodulo.decorator';
import type { LoginUserInfo } from 'src/auth/dto/login.dto';
import { GetUser } from 'src/auth/get-user.decorator';
import { PermissionGuard } from 'src/auth/guards/permission.guard';
import { SubmoduloGuard } from 'src/auth/guards/submodulo.guard';
import { CarteraInmService } from '../cartera/cartera.service';
import { CobrosInmService } from './cobros.service';
import { CobrarCuotasDto } from './dto/cobro.dto';

@ApiTags('Inmobiliario · Cobranza')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_COBRANZA')
@Controller({ path: 'inmobiliario', version: '1' })
export class CobranzaInmController {
  constructor(
    private readonly cobros: CobrosInmService,
    private readonly cartera: CarteraInmService,
  ) {}

  @Get('cartera')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COB_CARTERA_VER')
  @ApiQuery({ name: 'proyecto_id', required: false })
  @ApiQuery({ name: 'solo_vencidas', required: false })
  verCartera(
    @GetUser() user: LoginUserInfo,
    @Query('proyecto_id') proyecto_id?: string,
    @Query('solo_vencidas') soloVencidas?: string,
  ) {
    return this.cartera.cartera(user.empresa_id, { proyecto_id, solo_vencidas: soloVencidas === 'true' });
  }

  @Post('operaciones/:id/cobros/preview')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COB_COBRO_CREAR')
  @ApiOperation({ summary: 'Qué se va a facturar (ajuste por IPC, cotización, moneda de pago), sin emitir' })
  previsualizar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: CobrarCuotasDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.cobros.previsualizar(id, dto, user.empresa_id);
  }

  @Post('operaciones/:id/cobros')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_COB_COBRO_CREAR')
  @ApiOperation({ summary: 'Cobra cuotas y emite la factura de contado (decisión 1: factura al cobro)' })
  cobrar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: CobrarCuotasDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.cobros.cobrar(id, dto, user.empresa_id, user.id);
  }
}
