package cvt

import (
	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"
	"github.com/tidbcloud/devops/models/base"
	ubmod "github.com/tidbcloud/devops/models/userbehavior"
	"github.com/tidbcloud/devops/pkg/infra/utils/container"
)

type e2m struct{}

func (cvt e2m) Subscription(e *ubent.Subscription) *ubmod.Subscription {
	mod := &ubmod.Subscription{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},

		Name:                 e.Name,
		SubscribeType:        string(e.SubscribeType),
		EventType:            string(e.EventType),
		Template:             e.Template,
		Creator:              e.Creator,
		LarkChats:            container.TransformSlice(e.LarkChats, cvt.LarkChatSimplifiedToLarkChat),
		OnlyPaidTenant:       e.OnlyPaidTenant,
		OnlyExternalTenant:   e.OnlyExternalTenant,
		OnlyDedicatedCluster: e.OnlyDedicatedCluster,
		DetailLink:           e.DetailLink,
		TextFilter:           e.TextFilter,
	}
	tenantSels := ""
	for _, sel := range e.Selector.TenantSelectors {
		tenantSels = tenantSels + string(sel)
	}
	mod.TenantSelector = tenantSels

	bizSels := ""
	for i, sel := range e.Selector.RegionSelectors {
		bizSels = bizSels + string(sel)
		if i < len(e.Selector.RegionSelectors)-1 {
			bizSels = bizSels + " "
		}
	}
	mod.BizRegionSelector = bizSels

	return mod

}

func (cvt e2m) LarkChat(e *entity.LarkChat) *ubmod.LarkChat {
	mod := &ubmod.LarkChat{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},

		LarkChatID:      e.ChatID,
		LarkChatUrl:     e.ChatURL,
		LarkChatName:    e.Name,
		LarkChatIconUrl: e.AvatarURL,
	}

	if e.IsExternal {
		mod.LarkChatType = ubmod.LarkChatTypeExternal
	} else {
		mod.LarkChatType = larkChatTypeFromEntity(e.LarkTp)
	}

	return mod
}

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

// WARN: this method only filled ubmod.LarkChat with ID.
func (cvt e2m) LarkChatSimplifiedToLarkChat(e *entity.LarkChatSimplified) *ubmod.LarkChat {
	mod := &ubmod.LarkChat{
		Updatable: base.Updatable{
			Base: base.Base{ID: base.ID(e.ID)},
		},
	}

	return mod
}
