package cvt

import (
	"strings"

	coreuser "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/entity/core-server/user/v1"
	"github.com/tidbcloud/devops/entity"
	ubent "github.com/tidbcloud/devops/entity/userbehavior"
	ubmod "github.com/tidbcloud/devops/models/userbehavior"
	"github.com/tidbcloud/devops/pkg/infra/utils/container"
)

type m2e struct{}

// TODO: add type case check
func (cvt m2e) Subscription(m *ubmod.Subscription) *ubent.Subscription {
	ent := &ubent.Subscription{
		ID:                   m.ID.Uint64(),
		Name:                 m.Name,
		SubscribeType:        ubent.SubscribeTp(m.SubscribeType),
		EventType:            ubent.UBEventTp(m.EventType),
		Template:             m.Template,
		Creator:              m.Creator,
		LarkChats:            container.TransformSlice(m.LarkChats, cvt.LarkChatSimplified),
		OnlyPaidTenant:       m.OnlyPaidTenant,
		OnlyExternalTenant:   m.OnlyExternalTenant,
		OnlyDedicatedCluster: m.OnlyDedicatedCluster,
		DetailLink:           m.DetailLink,
		TextFilter:           m.TextFilter,
	}

	selectors := ubent.SelectorTp{}

	if len(m.BizRegionSelector) > 0 {
		regionStringSplits := strings.Split(m.BizRegionSelector, " ")
		regionSels := make([]ubent.RegionSelectorTp, 0, len(regionStringSplits))
		for _, split := range regionStringSplits {
			regionSels = append(regionSels, ubent.RegionSelectorTp(split))
		}
		selectors.RegionSelectors = regionSels
	}

	if len(m.TenantSelector) > 0 {
		tenantStringSplits := strings.Split(m.TenantSelector, " ")
		tenantSels := make([]ubent.TenantSelectorTp, 0, len(tenantStringSplits))
		for _, split := range tenantStringSplits {
			tenantSels = append(tenantSels, ubent.TenantSelectorTp(split))
		}
		selectors.TenantSelectors = tenantSels
	}

	ent.Selector = selectors

	return ent
}

func (cvt m2e) LarkChat(m *ubmod.LarkChat) *entity.LarkChat {
	ent := &entity.LarkChat{
		ID:         m.ID.Uint64(),
		Name:       m.LarkChatName,
		IsExternal: (m.LarkChatType == ubmod.LarkChatTypeExternal),
		ChatID:     m.LarkChatID,
		ChatURL:    m.LarkChatUrl,
		AvatarURL:  m.LarkChatIconUrl,
	}

	if !ent.IsExternal {
		ent.LarkTp = larkTypeFromModel(m.LarkChatType)
	}

	return ent
}

func larkTypeFromModel(value ubmod.LarkChatType) coreuser.LarkType {
	switch value {
	case ubmod.LarkChatTypeGlobal:
		return coreuser.LarkType_LARK_TYPE_GLOBAL
	default:
		return coreuser.LarkType_LARK_TYPE_UNSPECIFIED
	}
}

func (cvt m2e) LarkChatSimplified(m *ubmod.LarkChat) *entity.LarkChatSimplified {
	ent := &entity.LarkChatSimplified{
		ID:         m.ID.Uint64(),
		Name:       m.LarkChatName,
		AvatarUrl:  m.LarkChatIconUrl,
		IsExternal: (m.LarkChatType == ubmod.LarkChatTypeExternal),
	}

	return ent
}
