import { Controller, Get, Param, Query } from "@nestjs/common";
import { Throttle } from "@nestjs/throttler";
import { ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiTags } from "@nestjs/swagger";
import { Provider } from "@prisma/client";
import {
  ProviderCatalogResponseDto,
  ProviderPaymentMethodsResponseDto,
} from "./dto/provider-catalog.dto";
import { ProviderCatalogService } from "./provider-catalog.service";

@ApiTags("Providers")
@Controller("providers")
export class ProviderCatalogController {
  constructor(private readonly service: ProviderCatalogService) {}

  @Get()
  @Throttle({ default: { limit: 60, ttl: 60_000 } })
  @ApiOperation({
    operationId: "providersList",
    summary: "Listar catálogo público de providers soportados",
    description:
      "Endpoint público (sin auth). Devuelve la lista completa de payment providers reconocidos por el gateway, con su estado de disponibilidad, países y métodos de pago. " +
      "Pensado para que clientes (ERP, dashboards externos, SDKs) hidraten dropdowns sin hardcodear la lista. " +
      "Los providers marcados con `available: false` están en roadmap y aún no aceptan tráfico productivo.",
  })
  @ApiResponse({ status: 200, type: ProviderCatalogResponseDto })
  list(): ProviderCatalogResponseDto {
    return { providers: this.service.list() };
  }

  @Get(":provider/payment-methods")
  @Throttle({ default: { limit: 60, ttl: 60_000 } })
  @ApiOperation({
    operationId: "providerPaymentMethodsList",
    summary: "Listar medios de pago (platformIds) de un provider",
    description:
      "Endpoint público (sin auth). Devuelve el catálogo de medios de pago de un provider para un país " +
      "(ej. los `platformId` de Dpago: QR Ueno, Pix, tarjeta, etc.). Lo usa el ERP para poblar el selector " +
      "de 'QR directo' en Nuevo Cobro y la app de cobradores.",
  })
  @ApiParam({ name: "provider", enum: Provider, example: Provider.dpago })
  @ApiQuery({ name: "country", required: false, example: "PY" })
  @ApiResponse({ status: 200, type: ProviderPaymentMethodsResponseDto })
  async paymentMethods(
    @Param("provider") provider: Provider,
    @Query("country") country?: string,
  ): Promise<ProviderPaymentMethodsResponseDto> {
    const methods = await this.service.listPaymentMethods(provider, country ?? "PY");
    return { methods };
  }
}
