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/aliyunsubscriptionmngt"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

type AliyunSubscriptionManagement struct{}

type BizIdStruct struct {
	BizId string `uri:"biz_id" binding:"required"`
}
type AliUidStruct struct {
	AliUid string `uri:"ali_uid" binding:"required"`
}

// @Summary Create Aliyun Subscription Record
// @Description Create or activate an Aliyun subscription record
// @Tags AliyunSubscription
// @Accept json
// @Produce json
// @Param subscriptionRecord body forms.AliyunSubscriptionRecord true "Aliyun Subscription Record"
// @Success 200 {object} forms.AliyunSubscriptionRecord
// @Failure 400 {object} billing_errors.BaseError
// @Router /aliyun_subscription_record [post]
func (s *AliyunSubscriptionManagement) CreateSubscriptionRecord(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	var subscriptionRecord forms.AliyunSubscriptionRecord
	err := c.ShouldBindJSON(&subscriptionRecord)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&aliyunsubscriptionmngt.AliyunSubscriptionMngt{}).CreateOrActiveSubscriptionRecord(&subscriptionRecord)
}

// @Summary Inactive Aliyun Subscription Record
// @Description Inactive an Aliyun subscription record by biz_id
// @Tags AliyunSubscription
// @Accept json
// @Produce json
// @Param biz_id path string true "Business ID"
// @Success 200 {object} forms.AliyunSubscriptionRecord
// @Failure 400 {object} billing_errors.BaseError
// @Router /biz_id/{biz_id}/aliyun_subscription_record [put]
func (s *AliyunSubscriptionManagement) InActiveSubscriptionRecord(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	bizIdStruct := &BizIdStruct{}
	err := c.ShouldBindUri(bizIdStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&aliyunsubscriptionmngt.AliyunSubscriptionMngt{}).InActiveSubscriptionRecordWithBizId(bizIdStruct.BizId)
}

// @Summary Get Active Aliyun Subscription Record by AliUid
// @Description Get active Aliyun subscription record by AliUid
// @Tags AliyunSubscription
// @Accept json
// @Produce json
// @Param ali_uid path string true "Aliyun User ID"
// @Success 200 {object} forms.AliyunSubscriptionRecord
// @Failure 400 {object} billing_errors.BaseError
// @Router /ali_uid/{ali_uid}/aliyun_subscription_record [get]
func (s *AliyunSubscriptionManagement) GetActiveSubscriptionRecordByAliUid(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	aliUidStruct := &AliUidStruct{}
	err := c.ShouldBindUri(aliUidStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&aliyunsubscriptionmngt.AliyunSubscriptionMngt{}).GetActiveSubscriptionRecordByAliUid(aliUidStruct.AliUid)
}

// @Summary Get Aliyun Subscription Record by BizId
// @Description Get Aliyun subscription record by BizId
// @Tags AliyunSubscription
// @Accept json
// @Produce json
// @Param biz_id path string true "Business ID"
// @Success 200 {object} forms.AliyunSubscriptionRecord
// @Failure 400 {object} billing_errors.BaseError
// @Router /biz_id/{biz_id}/aliyun_subscription_record [get]
func (s *AliyunSubscriptionManagement) GetSubscriptionRecordByBizId(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	bizIdStruct := &BizIdStruct{}
	err := c.ShouldBindUri(bizIdStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	return (&aliyunsubscriptionmngt.AliyunSubscriptionMngt{}).GetSubscriptionRecordByBizId(bizIdStruct.BizId)
}

// @Summary Get Aliyun Subscription Record by TenantId
// @Description Get Aliyun subscription record by TenantId
// @Tags AliyunSubscription
// @Accept json
// @Produce json
// @Param tenant_id path string true "Tenant ID"
// @Success 200 {object} forms.AliyunSubscriptionRecord
// @Failure 400 {object} billing_errors.BaseError
// @Router /tenant_id/{tenant_id}/aliyun_subscription_record [get]
func (s *AliyunSubscriptionManagement) GetSubscriptionRecordByTenantId(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	tenantID, err := getTenantIDFromURI(c)
	if err != nil {
		return nil, err
	}
	return (&aliyunsubscriptionmngt.AliyunSubscriptionMngt{}).GetSubscriptionRecordByTenantId(tenantID)
}

func InitializeAliyunSubscriptionMngtRouter(router ginutils.MyRoute) {
	s := &AliyunSubscriptionManagement{}
	router.HandleWithError("POST", "/aliyun_subscription_record", s.CreateSubscriptionRecord)
	router.HandleWithError("PUT", "/biz_id/:biz_id/aliyun_subscription_record", s.InActiveSubscriptionRecord)
	router.HandleWithError("GET", "/ali_uid/:ali_uid/aliyun_subscription_record", s.GetActiveSubscriptionRecordByAliUid)
	router.HandleWithError("GET", "/biz_id/:biz_id/aliyun_subscription_record", s.GetSubscriptionRecordByBizId)
	router.HandleWithError("GET", "/tenants/:tenant_id/aliyun_subscription_record", s.GetSubscriptionRecordByTenantId)
}
