import { Controller, Get, Param, Query, UseGuards } from "@nestjs/common";
import {
  ApiBearerAuth,
  ApiOperation,
  ApiQuery,
  ApiResponse,
  ApiTags,
} from "@nestjs/swagger";
import { AdminUserGuard } from "../admin-auth/admin-user.guard";
import { ApiErrorResponse } from "../common/swagger/api-error.schema";
import { BillingStatsService } from "./billing-stats.service";
import {
  GlobalBillingStatsDto,
  MerchantBillingStatsDto,
} from "./dto/billing-stats.dto";

@ApiTags("Admin · Billing")
@ApiBearerAuth("adminUserAuth")
@ApiResponse({ status: 401, description: "Token admin faltante o inválido.", type: ApiErrorResponse })
@ApiResponse({ status: 429, description: "Rate limit excedido.", type: ApiErrorResponse })
@Controller("admin")
@UseGuards(AdminUserGuard)
export class BillingAdminController {
  constructor(private readonly stats: BillingStatsService) {}

  @Get("billing/stats")
  @ApiOperation({
    operationId: "adminBillingGlobalStats",
    summary: "Métricas globales de la pasarela en un período",
    description:
      "Agrega tx aprobadas/rechazadas, volumen por moneda y top 5 comercios. " +
      "Si no se pasa `period`, usa el mes calendario actual (UTC).",
  })
  @ApiQuery({
    name: "period",
    required: false,
    type: String,
    example: "2026-06",
    description: "Formato YYYY-MM (UTC).",
  })
  @ApiResponse({ status: 200, type: GlobalBillingStatsDto })
  global(@Query("period") period?: string): Promise<GlobalBillingStatsDto> {
    return this.stats.globalStats(period);
  }

  @Get("merchants/:id/billing/stats")
  @ApiOperation({
    operationId: "adminBillingMerchantStats",
    summary: "Métricas del comercio en un período",
  })
  @ApiQuery({
    name: "period",
    required: false,
    type: String,
    example: "2026-06",
  })
  @ApiResponse({ status: 200, type: MerchantBillingStatsDto })
  merchant(
    @Param("id") id: string,
    @Query("period") period?: string,
  ): Promise<MerchantBillingStatsDto> {
    return this.stats.merchantStats(id, period);
  }
}
