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/creditriskcontrol"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"go.uber.org/zap"
)

type URIStruct struct {
	TenantID uint `uri:"tenant_id" binding:"required"`
}

// IsCreditCardValidationRequired
// @Summary Is Credit Card Validation Required
// @Tags Switch
// @Description access control of function: credit card validation
// @Accept  json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Success 200 {object} forms.SwitchResponse
// @Router /tenants/{tenant_id}/switch/card/validate/is_allowed [GET]
// @Router /tenants/{tenant_id}/switch/card/validation/required [GET]
func (s *API) IsCreditCardValidationRequired(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	uriStruct := &URIStruct{}
	err := c.ShouldBindUri(uriStruct)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	switchResponse := &forms.SwitchResponse{}
	switchResponse.TenantID = uriStruct.TenantID
	switchResponse.RequireCreditCardValidation = (&creditriskcontrol.CreditCardVerifyModel{}).IsCreditCardValidationRequired(uriStruct.TenantID)
	switchResponse.IsAllowed = switchResponse.RequireCreditCardValidation
	log.Info("success to check credit card validation requirement", zap.Uint("tenantID", uriStruct.TenantID), zap.Bool("RequireCreditCardValidation", switchResponse.RequireCreditCardValidation))
	return switchResponse, nil
}

func InitializeSwitchRouter(router ginutils.MyRoute) {
	api := &API{}
	router.HandleWithError("GET", "/tenants/:tenant_id/switch/card/validate/is_allowed", api.IsCreditCardValidationRequired)
	router.HandleWithError("GET", "/tenants/:tenant_id/switch/card/validation/required", api.IsCreditCardValidationRequired)
}
