package receive

import (
	"context"
	"fmt"
	"time"

	"gorm.io/gorm"

	"github.com/tidbcloud/account/internel/dto"

	"github.com/tidbcloud/account/internel/svc/msp"
	orgsvc "github.com/tidbcloud/account/internel/svc/org"

	"github.com/tidbcloud/account/internel/dao/entity"

	"go.opentelemetry.io/otel"

	"github.com/tidbcloud/account/commons/config"

	"github.com/tidbcloud/account/commons/eventbus"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

func RegisterOrgEventHandler() error {
	eventHandlerFunc := func(e *eventbus.Event) error {
		return receiveOrgEvent(e)
	}

	err := eventbus.Get().RegisterEventHandleFunc(config.EventTypeOrg, config.Group, dto.OrgEventData{}, eventHandlerFunc)
	if err != nil {
		tilog.Error(context.Background(), "RegisterOrgEventHandler", zap.Error(err))
		return err
	}

	return nil
}

// receiveOrgEvent
//
//	@Description:
//	@Author wangletian 2024-07-12 17:00:30
//	@param event
//	@return error
func receiveOrgEvent(event *eventbus.Event) error {
	ctx, span := otel.Tracer(config.TraceComponentNameCentral).Start(context.Background(), "ReceiveOrgEvent")
	defer span.End()
	data := event.EventData.(*dto.OrgEventData)
	tilog.Info(ctx, "receiveOrgEvent ", zap.Any("data", data))
	time.Sleep(2 * time.Second)
	orgSvc, _ := orgsvc.GetOrgSvc()
	org, err := orgSvc.GetOrgByID(ctx, data.OrgId)
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			tilog.Info(ctx, fmt.Sprintf("org not found, ignore, orgID: %d", data.OrgId), zap.Error(err))
			return nil
		}
		tilog.Error(ctx, "GetOrgByID err", zap.Error(err))
		return err
	}
	if data.OrgEventType == entity.EntityEventTypeActivate && org.OrgTag == string(entity.OrgTagMspCustomer) {
		mspSvc, _ := msp.GetMspSvc()
		err := mspSvc.CustomerRegistrationNotice(ctx, data.OrgId)
		tilog.Info(ctx, "MspCustomer create Send CustomerRegistrationNotice end", zap.Any("result", err == nil))
	}

	return nil
}
