package marketing

import (
	"fmt"
	"time"

	"github.com/pingcap/dbaas/billing2/handler/centralhandler"
	"github.com/pingcap/dbaas/billing2/handler/eventbushandler"
	"github.com/pingcap/dbaas/billing2/utils/log"
	"go.uber.org/zap"
)

const ProviderSourceAlibaba = "alicloud"
const AlibabaFlag = "enable_alibaba_cloud_orgs"

const OrgRegistrationProviderSourceEvent = "OrgRegistrationProviderSourceEvent"

type OrgRegistrationProviderSourceEventStruct struct {
	EventTime      time.Time `json:"event_time"`
	OrgId          uint64    `json:"org_id"`
	ProviderSource string    `json:"provider_source"`
}

func ConfigFeatureAlibabaOrg(e *OrgRegistrationProviderSourceEventStruct) error {
	if e.ProviderSource == ProviderSourceAlibaba {
		log.Info("ConfigFeatureAlibabaOrg", zap.Any("event", e))
		err := centralhandler.GetCentralHandler().ConfigFeatureFlagOrg(e.OrgId, AlibabaFlag)
		if err != nil {
			return err
		}
	}
	return nil
}

func RegisterMarketEventHandler() error {
	group := "market"

	eventHandlerFunc := func(event *eventbushandler.Event) error {
		orgEvent, ok := event.EventData.(*OrgRegistrationProviderSourceEventStruct)
		if !ok {
			log.Error("RegisterOrgRegistrationProviderSourceEventHandler: invalid event data type")
			return fmt.Errorf("invalid event data type")
		}
		log.Info("RegisterOrgRegistrationProviderSourceEventHandler: received event", zap.Any("event", orgEvent))

		return ConfigFeatureAlibabaOrg(orgEvent)
	}

	err := eventbushandler.Get().RegisterEventHandleFunc(OrgRegistrationProviderSourceEvent, group, OrgRegistrationProviderSourceEventStruct{}, eventHandlerFunc)
	if err != nil {
		return err
	}
	return nil
}
