package publish

import (
	"context"
	"time"

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

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

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

// PublishCreateTenantEvent
//
//	@Description: org event [create]
//	@Author wangletian 2023-11-29 15:00:59
//	@param ctx
//	@param tenantId
//	@return error
func PublishCreateTenantEvent(ctx context.Context, tenantId uint64) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "PublishCreateTenantEvent skip "+config.GetEnv())
		return nil
	}
	e := dto.CreateTenantEvent{TenantId: tenantId, EventTime: time.Now()}
	tenantEvent := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeCreateTenant,
		EventData: e,
	}
	tilog.Info(ctx, "PublishCreateTenantEvent to eventbus", zap.Any("tenantEvent", tenantEvent))
	if err := eventbus.Get().PublishEvent(config.EventTypeCreateTenant, tenantEvent); err != nil {
		tilog.Error(ctx, "PublishCreateTenantEvent err", zap.Any("event", tenantEvent))
		return err
	}
	tilog.Info(ctx, "PublishRegisterEvent success", zap.Any("event", tenantEvent.EventData))
	return nil

}

// PublishOrgEvent
//
//	@Description: org event [create,update,delete]
//	@Author wangletian 2023-11-29 15:00:25
//	@param ctx
//	@param e
//	@return error
func PublishOrgEvent(ctx context.Context, e dto.OrgEventData) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "local env PublishTenantEvent skip ... "+config.GetEnv())
		return nil
	}
	if e.EventTime == nil {
		eventTime := time.Now()
		e.EventTime = &eventTime
	}
	//e := CreateTenantEvent{TenantId: tenantId, EventTime: time.Now()}
	orgEvent := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeOrg,
		EventData: e,
	}
	tilog.Info(ctx, "PublishOrgEvent to eventbus", zap.Any("orgEvent", orgEvent))
	if err := eventbus.Get().PublishEvent(config.EventTypeOrg, orgEvent); err != nil {
		tilog.Error(ctx, "PublishOrgEvent err", zap.Any("event", orgEvent), zap.Error(err))
		return err
	}
	tilog.Info(ctx, "PublishOrgEvent success", zap.Any("topic", config.EventTypeOrg))
	if e.OrgEventType == entity.EntityEventTypeCreate {
		tilog.Info(ctx, "Compatible with old code ，PublishCreateTenantEvent  ", zap.Any("event", orgEvent))
		return PublishCreateTenantEvent(ctx, e.OrgId)
	}
	return nil

}

func PublishOrgRegistrationProviderSourceEvent(ctx context.Context, orgId uint64, providerSource string) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "local env PublishOrgRegistrationProviderSourceEvent skip ... "+config.GetEnv())
		return nil
	}
	orgEvent := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeEventTypeOrgRegistrationProviderSource,
		EventData: dto.ProviderCreateOrgEvent{
			EventTime:      time.Now(),
			OrgId:          orgId,
			ProviderSource: providerSource,
		},
	}
	tilog.Info(ctx, "PublishOrgRegistrationProviderSourceEvent to eventbus", zap.Any("eventType", config.EventTypeEventTypeOrgRegistrationProviderSource), zap.Any("event", orgEvent))
	if err := eventbus.Get().PublishEvent(config.EventTypeEventTypeOrgRegistrationProviderSource, orgEvent); err != nil {
		tilog.Error(ctx, "PublishOrgRegistrationProviderSourceEvent error", zap.Any("event", orgEvent), zap.Error(err))
		return err
	}
	tilog.Info(ctx, "PublishOrgRegistrationProviderSourceEvent success", zap.Any("eventType", config.EventTypeEventTypeOrgRegistrationProviderSource), zap.Any("event", orgEvent))
	return nil

}
