import { Body, Controller, Get, Param, Post, UseGuards, UseInterceptors } from "@nestjs/common";
import { ApiOperation, ApiTags } from "@nestjs/swagger";
import { PublicRateLimitGuard } from "../common/guards/public-rate-limit.guard";
import { PublicTenantGuard } from "../tenancy/public-tenant.guard";
import { TenantReleaseInterceptor } from "../tenancy/tenant-release.interceptor";
import { CotizacionesService } from "./cotizaciones.service";
import { PublicDecisionDto } from "./dto/public-decision.dto";

// PublicTenantGuard corre DESPUES de PublicRateLimitGuard (el orden entre
// esos dos no importa entre si, pero PublicTenantGuard tiene que ser el que
// resuelve/adquiere el tenant antes de que el handler llame a
// CotizacionesService — que ahora depende del contexto ambiental, no de un
// repositorio inyectado). Ver tenancy/public-tenant.guard.ts para el
// diseño completo (token = "<tenantId>.<token original>").
@ApiTags("public-cotizaciones")
@UseGuards(PublicRateLimitGuard, PublicTenantGuard)
@UseInterceptors(TenantReleaseInterceptor)
@Controller("public/cotizaciones")
export class PublicCotizacionesController {
  constructor(private readonly cotizacionesService: CotizacionesService) {}

  @Get(":token")
  @ApiOperation({ summary: "Obtener cotizacion publica por token" })
  async findByToken(@Param("token") token: string) {
    return this.cotizacionesService.findPublicByToken(token);
  }

  @Post(":token/decision")
  @ApiOperation({ summary: "Aceptar o rechazar cotizacion publica" })
  async decide(@Param("token") token: string, @Body() dto: PublicDecisionDto) {
    return this.cotizacionesService.decidePublic(token, dto);
  }
}
