import { Body, Controller, Get, Param, Patch, Post, Put, Query, Request, UseGuards } from '@nestjs/common';
import { SubscriptionService } from './subscription.service';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from '../auth/auth.guard';
import * as dto from './dto/index';

@ApiTags('Subscription')
@Controller('subscription')
export class SubscriptionController {
    constructor(
        private readonly subscriptionService: SubscriptionService
    ) { }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Post('/plan')
    async create_plan(@Body() body: dto.subscription_plan.create_plan) {
        try {
            return await this.subscriptionService.create_plan(body);
        } catch (error) {
            throw error;
        }
    }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Put('/plan/:_id')
    async update_plan(@Body() body: dto.subscription_plan.update_plan, @Param('_id') _id: string) {
        try {
            return await this.subscriptionService.update_plan(body, _id);
        } catch (error) {
            throw error;
        }
    }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Get('/plan/:workspace_id/workspace')
    async get_my_plan_list(@Request() req: any, @Query() query: dto.subscription_plan.plan_list, @Param('workspace_id') workspace_id: string) {
        try {
            return await this.subscriptionService.getPlanListWithActivePlan(req, query, workspace_id);
        } catch (error) {
            throw error;
        }
    }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Get('/:workspace_id/active')
    async get_active_subscription(@Param('workspace_id') workspace_id: string) {
        try {
            return await this.subscriptionService.get_active_subscription(workspace_id);
        } catch (error) {
            throw error;
        }
    }

    @Get('/all/plan')
    async get_plan_list() {
        try {
            return await this.subscriptionService.getPlanList();
        } catch (error) {
            throw error;
        }
    }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Post('/purchase')
    async purchase_plan(@Body() body: dto.subscription_plan.purchase_plan, @Request() req: any) {
        try {
            return await this.subscriptionService.purchase_subscription_plan(body, req);
        } catch (error) {
            throw error;
        }
    }

    @UseGuards(AuthGuard)
    @ApiBearerAuth('authorization')
    @Patch('/:subscription_id/payment')
    async payment_initiated_success(@Param('subscription_id') subscription_id: string) {
        try {
            return await this.subscriptionService.payment_initiated_success(subscription_id);
        } catch (error) {
            throw error;
        }
    }
}
