package api

import (
	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/awssubscriptionmngt"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

type AWSSubscriptionUriStruct struct {
	CustomerIdentifier string `uri:"customer_identifier" binding:"required"`
	ProductCode        string `uri:"product_code" binding:"required"`
}

type AWSSubscriptionManagement struct{}

func (s *AWSSubscriptionManagement) CreateOrActiveSubscriptionRecord(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	var subscriptionRecord forms.AWSSubscriptionRecord
	err := c.ShouldBindJSON(&subscriptionRecord)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&awssubscriptionmngt.AWSSubscriptionMngt{}).CreateOrActiveSubscriptionRecord(&subscriptionRecord)
}

func (s *AWSSubscriptionManagement) InActiveSubscriptionRecord(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	uriStruct := &AWSSubscriptionUriStruct{}
	err := c.ShouldBindUri(uriStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&awssubscriptionmngt.AWSSubscriptionMngt{}).InActiveSubscriptionRecord(uriStruct.ProductCode, uriStruct.CustomerIdentifier)
}

func (s *AWSSubscriptionManagement) GetSubscriptionRecord(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	uriStruct := &AWSSubscriptionUriStruct{}
	err := c.ShouldBindUri(uriStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&awssubscriptionmngt.AWSSubscriptionMngt{}).GetSubscriptionRecord(uriStruct.ProductCode, uriStruct.CustomerIdentifier)
}

func InitializeAWSSubscriptionMngtRouter(router ginutils.MyRoute) {
	s := &AWSSubscriptionManagement{}
	router.HandleWithError("POST", "/aws_subscription_record", s.CreateOrActiveSubscriptionRecord)
	router.HandleWithError("PUT", "/identifier_id/:customer_identifier/product_code/:product_code/aws_subscription_record", s.InActiveSubscriptionRecord)
	router.HandleWithError("GET", "/identifier_id/:customer_identifier/product_code/:product_code/aws_subscription_record", s.GetSubscriptionRecord)
}
