package payload

import (
	"godocms/pkg/dingtalk/payload/message"
	"sort"
	"strconv"
	"strings"
)

// CorpConvMessage 工作通知
type CorpConvMessage struct {
	// 发送消息时使用的微应用的ID。
	AgentId int `json:"agent_id" validate:"required"`

	// 接收者的企业内部用户的userId列表,最大用户列表长度100。
	UserIds []string `json:"-" validate:"lte=100"`

	UserIdList string `json:"userid_list,omitempty"`

	// 接收者的部门id列表,最大列表长度20。接收者是部门Id下包括子部门下的所有用户。
	DeptIdList string `json:"dept_id_list,omitempty"`

	DeptIds []int `json:"-" validate:"lte=20"`

	// 是否发送给企业全部用户。当设置为false时必须指定userid_list或dept_id_list其中一个参数的值。
	All *bool `json:"to_all_user,omitempty"`

	Msg message.Message `json:"msg,omitempty" validate:"required"`
}

type CorpConvMessageResponse struct {
	Response

	TaskId int `json:"task_id"`
}

type corpConvMessageBuilder struct {
	cm *CorpConvMessage
}

func NewCorpConvMessage(msg message.Message) *corpConvMessageBuilder {
	return &corpConvMessageBuilder{cm: &CorpConvMessage{Msg: msg}}
}

func (sb *corpConvMessageBuilder) SetAgentId(agentId int) *corpConvMessageBuilder {
	sb.cm.AgentId = agentId
	return sb
}

func (sb *corpConvMessageBuilder) SetUserIds(userId string, userIds ...string) *corpConvMessageBuilder {
	sb.cm.UserIds = append(userIds, userId)
	return sb
}

func (sb *corpConvMessageBuilder) SetUsers(userIds []string) *corpConvMessageBuilder {
	sb.cm.UserIds = userIds
	return sb
}

func (sb *corpConvMessageBuilder) SetDeptIds(deptId int, deptIds ...int) *corpConvMessageBuilder {
	sb.cm.DeptIds = append(deptIds, deptId)
	return sb
}

func (sb *corpConvMessageBuilder) SetAllUser(all bool) *corpConvMessageBuilder {
	sb.cm.All = &all
	return sb
}

func (sb *corpConvMessageBuilder) Build() *CorpConvMessage {
	cm := sb.cm
	cm.DeptIds = removeIntDuplicates(cm.DeptIds)
	cm.DeptIdList = strings.Join(removeIntDuplicatesToString(cm.DeptIds), ",")

	cm.UserIds = removeStringDuplicates(cm.UserIds)
	cm.UserIdList = strings.Join(cm.UserIds, ",")
	return cm
}

// removeIntDuplicates 去除重复的item
func removeIntDuplicates(item []int) (ids []int) {
	if len(item) <= 0 {
		return ids
	}
	sort.Ints(item)
	for i, id := range item {
		if (i >= 1 && id == item[i-1]) || id <= 0 {
			continue
		}
		ids = append(ids, id)
	}
	return ids
}

// removeIntDuplicatesToString 去除重复的item
func removeIntDuplicatesToString(item []int) (ids []string) {
	if len(item) <= 0 {
		return ids
	}
	sort.Ints(item)
	for i, id := range item {
		if (i >= 1 && id == item[i-1]) || id <= 0 {
			continue
		}
		ids = append(ids, strconv.Itoa(id))
	}
	return ids
}

// removeStringDuplicates 去除重复的item
func removeStringDuplicates(item []string) (ids []string) {
	if len(item) <= 0 {
		return ids
	}
	sort.Strings(item)
	for i, id := range item {
		if (i >= 1 && id == item[i-1]) || len(id) <= 0 {
			continue
		}
		ids = append(ids, id)
	}
	return ids
}