package api

import (
	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/partner"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
	"github.com/tidbcloud/tiinf/sdk/auth"
)

type PartnerConfigsAPI struct{}

var partnerConfigModel partner.Configs

// @Id Billing_GetPartnerConfigs
// @Tags Partner
// @Host tcpn.tidbapi.com
// @Summary Get partner configurations
// @Description This endpoint retrieves the partner configuration for a specific Partner.
// @Schemes
// @Accept json
// @Produce json
// @Param accessOrgId query string true "org_id"
// @Success 200 {object} forms.PartnerConfigs
// @Failure 400  {object}  billing_errors.BaseError
// @Router /partnerConfigs [GET]
func (s *PartnerConfigsAPI) GetPartnerConfigs(c *gin.Context) (ret ginutils.HandlerFuncResult, retErr error) {
	authInfo, err := auth.GetIdentityInfoFromGinContext(c)
	if err != nil {
		return nil, err
	}
	partnerConfigs, err := partnerConfigModel.GetPartnerConfigs(uint(authInfo.OrgID))
	if err != nil {
		return nil, err
	}
	return partnerConfigs, nil
}

// @Id Billing_UpdatePartnerConfigs
// @Tags Partner, PartnerBilling
// @Host tcpn.tidbapi.com
// @Summary Update the Partner configurations for a Partner
// @Description This endpoint retrieves the partner configuration for a specific Partner.
// @Schemes
// @Accept json
// @Produce json
// @Param accessOrgId query string true "org_id"
// @Param partnerConfigs body forms.PartnerConfigs true "partner_configs"
// @Success 200 {object} forms.PartnerConfigs
// @Failure 400  {object}  billing_errors.BaseError
// @Router /partnerConfigs [PATCH]
func (s *PartnerConfigsAPI) UpdatePartnerConfigs(c *gin.Context) (ret ginutils.HandlerFuncResult, retErr error) {
	authInfo, err := auth.GetIdentityInfoFromGinContext(c)
	if err != nil {
		return nil, err
	}
	var input forms.PartnerConfigs
	err = c.ShouldBindJSON(&input)
	if err != nil {
		return nil, err
	}
	partnerConfigs, err := partnerConfigModel.UpdatePartnerConfigs(uint(authInfo.OrgID), &input)
	if err != nil {
		return nil, err
	}
	return partnerConfigs, nil
}

// @Id Billing_GetCustomerPartnerConfigs
// @Host tcpn.tidbapi.com
// @Summary Return Partner Configs for a Partner
// @Description This endpoint retrieves the partner configuration for a specific Partner.
// @Schemes
// @Accept json
// @Produce json
// @Param accessOrgId query string true "org_id"
// @Success 200 {object} forms.PartnerConfigs
// @Failure 400  {object}  billing_errors.BaseError
// @Router /customers/{customerId}/partnerConfigs [GET]
func (s *PartnerConfigsAPI) GetCustomerPartnerConfigs(c *gin.Context) (ret ginutils.HandlerFuncResult, retErr error) {
	authInfo, err := auth.GetIdentityInfoFromGinContext(c)
	if err != nil {
		return nil, err
	}
	customerId, err := getCustomerIDFromUri(c, uint(authInfo.OrgID))
	if err != nil {
		return nil, err
	}
	partnerConfigs, err := partnerConfigModel.GetCustomerPartnerConfigs(uint(authInfo.OrgID), customerId)
	if err != nil {
		return nil, err
	}
	return partnerConfigs, nil
}

// @Id Billing_UpdateCustomerPartnerConfigs
// @Host tcpn.tidbapi.com
// @Summary Return Partner Configs for a Partner
// @Description This endpoint retrieves the partner configuration for a specific Partner.
// @Schemes
// @Accept json
// @Produce json
// @Param accessOrgId query string true "org_id"
// @Param partnerConfigs body forms.PartnerConfigs true "partner_configs"
// @Success 200 {object} forms.PartnerConfigs
// @Failure 400  {object}  billing_errors.BaseError
// @Router /customers/{customerId}/partnerConfigs [PATCH]
func (s *PartnerConfigsAPI) UpdateCustomerPartnerConfigs(c *gin.Context) (ret ginutils.HandlerFuncResult, retErr error) {
	authInfo, err := auth.GetIdentityInfoFromGinContext(c)
	if err != nil {
		return nil, err
	}
	customerId, err := getCustomerIDFromUri(c, uint(authInfo.OrgID))
	if err != nil {
		return nil, err
	}
	var input forms.PartnerConfigs
	err = c.ShouldBindJSON(&input)
	if err != nil {
		return nil, err
	}
	partnerConfigs, err := partnerConfigModel.UpdateCustomerPartnerConfigs(uint(authInfo.OrgID), customerId, &input)
	if err != nil {
		return nil, err
	}
	return partnerConfigs, nil
}

func InitializePartnerOpenAPIPartnerConfigsRouter(router ginutils.MyRoute) {
	s := &PartnerConfigsAPI{}

	router.HandleWithError("GET", "/partnerConfigs", s.GetPartnerConfigs)
	router.HandleWithError("PATCH", "/partnerConfigs", s.UpdatePartnerConfigs)
	router.HandleWithError("GET", "/customers/:customerId/partnerConfigs", s.GetCustomerPartnerConfigs)
	router.HandleWithError("PATCH", "/customers/:customerId/partnerConfigs", s.UpdateCustomerPartnerConfigs)
}
