import { Body, Controller, Get, Param, ParseUUIDPipe, Post, UseGuards, ValidationPipe } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { ApiBearerAuth, ApiOperation, 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 { AdendasInmService } from './adendas.service';
import { CrearAdendaDto, PreviewAdendaDto, RechazarAdendaDto } from './dto/adenda.dto';

@ApiTags('Inmobiliario · Adendas')
@ApiBearerAuth()
@UseGuards(AuthGuard('jwt'), SubmoduloGuard)
@RequireSubmodulo('INM_OPERACIONES')
@Controller({ path: 'inmobiliario', version: '1' })
export class AdendasInmController {
  constructor(private readonly service: AdendasInmService) {}

  @Get('operaciones/:id/adendas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_OPE_OPERACION_VER')
  listar(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.listar(id, user.empresa_id);
  }

  @Post('operaciones/:id/adendas/preview')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_OPE_ADENDA_CREAR')
  @ApiOperation({ summary: 'Qué haría la adenda (cuotas que se anulan, nuevas, liquidación), sin crearla' })
  previsualizar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: PreviewAdendaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.previsualizar(id, dto, user.empresa_id);
  }

  @Post('operaciones/:id/adendas')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_OPE_ADENDA_CREAR')
  @ApiOperation({
    summary: 'Pide una adenda (queda PENDIENTE con lo que haría): cambio de plan, de unidad, cesión o rescisión',
  })
  crear(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: CrearAdendaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.crear(id, dto, user.empresa_id, user.id);
  }

  @Post('adendas/:id/aprobar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_OPE_ADENDA_APROBAR')
  @ApiOperation({ summary: 'Aplica la adenda. La rescisión además exige INM_OPE_RESCISION_APROBAR' })
  aprobar(@Param('id', ParseUUIDPipe) id: string, @GetUser() user: LoginUserInfo) {
    return this.service.aprobar(id, user.empresa_id, user.id);
  }

  @Post('adendas/:id/rechazar')
  @UseGuards(PermissionGuard)
  @RequirePermission('INMOBILIARIO', 'INM_OPE_ADENDA_APROBAR')
  rechazar(
    @Param('id', ParseUUIDPipe) id: string,
    @Body(ValidationPipe) dto: RechazarAdendaDto,
    @GetUser() user: LoginUserInfo,
  ) {
    return this.service.rechazar(id, dto, user.empresa_id, user.id);
  }
}
