import {
  Controller,
  Get,
  Post,
  Body,
  Put,
  Param,
  Delete,
  Query,
  UseGuards,
} from "@nestjs/common"
import { SubscriptionPlanService } from "./subscription-plan.service"
import { CreateSubscriptionPlanDto } from "./dto/create-subscription-plan.dto"
import { UpdateSubscriptionPlanDto } from "./dto/update-subscription-plan.dto"
import { SubscriptionPlanFilterDto } from "./dto/subscription-plan-filter.dto"
import { ApiTags, ApiOperation, ApiBearerAuth } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"

@ApiTags("Subscription Plans")
@Controller("subscription-plans")
export class SubscriptionPlanController {
  constructor(
    private readonly subscriptionPlanService: SubscriptionPlanService,
  ) {}

  @Post()
  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiOperation({ summary: "Create subscription plan" })
  create(@Body() dto: CreateSubscriptionPlanDto) {
    return this.subscriptionPlanService.create(dto)
  }

  @Get()
  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiOperation({ summary: "List subscription plans with pagination (admin)" })
  findAll(@Query() query: SubscriptionPlanFilterDto) {
    return this.subscriptionPlanService.findAll(query)
  }

  @Get("active")
  @ApiOperation({
    summary: "List active subscription plans (public, for pricing page)",
  })
  findAllActive() {
    return this.subscriptionPlanService.findAllActive()
  }

  @Get(":id")
  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiOperation({ summary: "Get subscription plan by ID" })
  findOne(@Param("id") id: string) {
    return this.subscriptionPlanService.findOne(+id)
  }

  @Put(":id")
  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiOperation({ summary: "Update subscription plan by ID" })
  update(@Param("id") id: string, @Body() dto: UpdateSubscriptionPlanDto) {
    return this.subscriptionPlanService.update(+id, dto)
  }

  @Delete(":id")
  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiOperation({ summary: "Delete subscription plan by ID" })
  remove(@Param("id") id: string) {
    return this.subscriptionPlanService.remove(+id)
  }
}
