package api

import (
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/handler/auditloghandler"
	"github.com/pingcap/dbaas/billing2/model/marketing"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

// @Tags MSP
// @Summary Return credits applied to a specific MSP
// @Description  This endpoint retrieves the credits applied to a specific MSP.
// @Schemes
// @Accept json
// @Produce json
// @Success 200 {object} []forms.MspCredit
// @Failure 400  {object}  billing_errors.BaseError
// @Router /credits [GET]
func (s *API) ListMspCredits(c *gin.Context) (ret ginutils.HandlerFuncResult, retErr error) {
	billingCfgStruct, err := getBillingCfgFromURI(c)
	if err != nil {
		return nil, err
	}
	defer func() {
		auditloghandler.Log(auditlog.EventShowCredits, c, billingCfgStruct.TenantID, nil, retErr)
	}()
	creditsPackageModel := &marketing.CreditsPackageModel{}
	creditsPackages, err := creditsPackageModel.ListTenantCreditsPackages(billingCfgStruct.TenantID, billingCfgStruct.BillingConfigID)
	var mspCredits []forms.MspCredit
	for _, credit := range creditsPackages {
		var names []string
		for _, filter := range credit.BindTypes {
			names = append(names, filter.Name)
		}
		mspCredits = append(mspCredits, forms.MspCredit{
			CreditCode:      credit.CreditsCode,
			Status:          credit.Status,
			Services:        strings.Join(names, ", "),
			Credit:          credit.TotalCredits,
			RemainingCredit: credit.RemainingCredits,
			StartDate:       credit.StartDate,
			ExpiryDate:      credit.ExpiredDate,
		})
	}
	return mspCredits, err
}

func InitializeMspOpenAPICreditsRouter(router ginutils.MyRoute) {
	s := &API{}
	router.HandleWithError("GET", "/tenants/:tenant_id/credits", s.ListMspCredits)
	router.HandleWithError("GET", "/credits", s.ListMspCredits)

}
