package userevent

// add userevent package just for solve import cycle

import (
	"context"

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

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

func PublishAddUserToOrgEvent(ctx context.Context, orgId, userId uint64, role string) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "PublishAddUserToOrgEvent skip "+config.GetEnv())
		return nil
	}
	data := AddUserToOrgEventData{
		OrgID:  orgId,
		UserID: userId,
		Role:   role,
	}
	event := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeAddUserToOrg,
		EventData: data,
	}
	err := eventbus.Get().PublishEvent(config.EventTypeAddUserToOrg, event)
	if err != nil {
		tilog.Error(ctx, "PublishAddUserToOrgEvent error", zap.Any("event", event), zap.Any("err", err))
		return err
	}
	tilog.Info(ctx, "PublishAddUserToOrgEvent success", zap.Any("event", event))
	return nil

}

func PublishChangeUserOrgRoleEvent(ctx context.Context, orgId, userId uint64, originRole, newRole string) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "PublishChangeUserOrgRoleEvent skip "+config.GetEnv())
		return nil
	}
	data := ChangeUserOrgRoleEventData{
		OrgID:      orgId,
		UserID:     userId,
		OriginRole: originRole,
		NewRole:    newRole,
	}
	event := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeChangeUserOrgRole,
		EventData: data,
	}
	err := eventbus.Get().PublishEvent(config.EventTypeChangeUserOrgRole, event)
	if err != nil {
		tilog.Error(ctx, "PublishChangeUserOrgRoleEvent error", zap.Any("event", event), zap.Any("err", err))
		return err
	}
	tilog.Info(ctx, "PublishChangeUserOrgRoleEvent success", zap.Any("event", event))
	return nil

}

func PublishRemoveUserFromOrgEvent(ctx context.Context, orgId, userId uint64) error {
	if config.IsLocalEnv() {
		tilog.Info(ctx, "PublishRemoveUserFromOrgEvent skip "+config.GetEnv())
		return nil
	}

	data := RemoveUserFromOrgEventData{
		OrgID:  orgId,
		UserID: userId,
	}
	event := &eventbus.Event{
		EventID:   config.Group,
		EventType: config.EventTypeRemoveUserFromOrg,
		EventData: data,
	}
	err := eventbus.Get().PublishEvent(config.EventTypeRemoveUserFromOrg, event)
	if err != nil {
		tilog.Error(ctx, "PublishRemoveUserFromOrgEvent error", zap.Any("event", event), zap.Any("err", err))
		return err
	}
	tilog.Info(ctx, "PublishRemoveUserFromOrgEvent success", zap.Any("event", event))
	return nil
}

type AddUserToOrgEventData struct {
	OrgID  uint64 `json:"org_id"`
	UserID uint64 `json:"user_id"`
	Role   string `json:"role"`
}

type ChangeUserOrgRoleEventData struct {
	OrgID      uint64 `json:"org_id"`
	UserID     uint64 `json:"user_id"`
	OriginRole string `json:"origin_role"`
	NewRole    string `json:"new_role"`
}

type RemoveUserFromOrgEventData struct {
	OrgID  uint64 `json:"org_id"`
	UserID uint64 `json:"user_id"`
}
