import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  UseGuards,
} from "@nestjs/common";
import {
  ApiBearerAuth,
  ApiOperation,
  ApiResponse,
  ApiTags,
} from "@nestjs/swagger";
import { AdminUserGuard } from "../admin-auth/admin-user.guard";
import { ApiErrorResponse } from "../common/swagger/api-error.schema";
import { CreatePricingPlanDto } from "./dto/create-pricing-plan.dto";
import { PricingPlanDto } from "./dto/pricing-plan.dto";
import { PricingPlanService } from "./pricing-plan.service";

@ApiTags("Admin · Billing")
@ApiBearerAuth("adminUserAuth")
@ApiResponse({ status: 401, description: "Token admin faltante o inválido.", type: ApiErrorResponse })
@ApiResponse({ status: 404, description: "Merchant no encontrado.", type: ApiErrorResponse })
@Controller("admin/merchants/:merchantId/pricing-plans")
@UseGuards(AdminUserGuard)
export class PricingPlanAdminController {
  constructor(private readonly service: PricingPlanService) {}

  @Post()
  @ApiOperation({
    operationId: "adminPricingPlansCreate",
    summary: "Crear plan de pricing para el comercio",
    description:
      "Si ya existía un plan activo, se expira automáticamente con `validUntil = now` y el nuevo queda como único activo.",
  })
  @ApiResponse({ status: 201, type: PricingPlanDto })
  create(
    @Param("merchantId") merchantId: string,
    @Body() dto: CreatePricingPlanDto,
  ) {
    return this.service.create(merchantId, dto);
  }

  @Get()
  @ApiOperation({
    operationId: "adminPricingPlansList",
    summary: "Listar planes del comercio (activo + histórico)",
  })
  @ApiResponse({ status: 200, type: PricingPlanDto, isArray: true })
  list(@Param("merchantId") merchantId: string) {
    return this.service.list(merchantId);
  }

  @Get("active")
  @ApiOperation({
    operationId: "adminPricingPlansActive",
    summary: "Plan vigente (puede ser null si nunca se asignó)",
  })
  @ApiResponse({ status: 200, type: PricingPlanDto, nullable: true })
  active(@Param("merchantId") merchantId: string) {
    return this.service.getActive(merchantId);
  }

  @Post(":planId/expire")
  @ApiOperation({
    operationId: "adminPricingPlansExpire",
    summary: "Expirar el plan manualmente",
    description: "Marca `active=false` y setea `validUntil=now`. Idempotente solo si ya estaba activo.",
  })
  @ApiResponse({ status: 200, type: PricingPlanDto })
  @ApiResponse({ status: 409, description: "Plan ya expirado.", type: ApiErrorResponse })
  expire(
    @Param("merchantId") merchantId: string,
    @Param("planId") planId: string,
  ) {
    return this.service.expire(merchantId, planId);
  }
}
