import { Body, Controller, Post, Res, UseGuards } from '@nestjs/common';
import { ApiBody, ApiOkResponse, ApiSecurity, ApiTags } from '@nestjs/swagger';
import type { Response } from 'express';
import { Throttle, ThrottlerGuard } from '@nestjs/throttler';
import { AppTokenGuard } from 'src/app-token.guard';
import { CodigosVerificacionService } from './codigos-verificacion.service';
import { response_enviar_codigo, response_verificar_codigo } from './dto/doc-swagger';
import { EnviarCodigoDto } from './dto/reenviar-codigo.dto';
import { VerificarCodigoDto } from './dto/verificar-codigo.dto';

@ApiTags('Códigos de Verificación')
@Controller({ path: 'codigos-verificacion', version: '1' })
export class CodigosVerificacionController {
  constructor(private readonly codigosVerificacionService: CodigosVerificacionService) {}

  // Anti fuerza-bruta del OTP: 10 verificaciones por minuto por IP (además, el
  // service invalida el código tras N intentos fallidos).
  @Throttle({ default: { limit: 10, ttl: 60_000 } })
  @UseGuards(AppTokenGuard, ThrottlerGuard)
  @ApiSecurity('AppKey')
  @ApiBody({ type: VerificarCodigoDto })
  @ApiOkResponse(response_verificar_codigo)
  @Post('verificar')
  async verificar(@Body() dto: VerificarCodigoDto, @Res() response: Response) {
    const result = await this.codigosVerificacionService.verificar(dto);
    response.status(200).json(result);
  }

  // Evita spam de envío de OTP (SMS/email): 5 solicitudes por minuto por IP.
  @Throttle({ default: { limit: 5, ttl: 60_000 } })
  @UseGuards(AppTokenGuard, ThrottlerGuard)
  @ApiSecurity('AppKey')
  @ApiBody({ type: EnviarCodigoDto })
  @ApiOkResponse(response_enviar_codigo)
  @Post('enviar-codigo')
  async enviar(@Body() dto: EnviarCodigoDto, @Res() response: Response) {
    const result = await this.codigosVerificacionService.enviar(dto);
    response.status(200).json(result);
  }
}
