package services

import (
	"errors"
	"eta/eta_api/models/system"
	"strconv"
	"strings"
)

// ResearchGroup 研究方向分组表
type ResearchGroupItem struct {
	ResearchGroupId   int                    `json:"research_group_id" description:"研究方向分组ID"`
	ResearchGroupName string                 `json:"research_group_name" description:"研究方向分组名称"`
	ParentId          int                    `json:"parent_id" description:"父类ID"`
	ChartPermissionId int                    `json:"chart_permission_id" description:"品种权限ID"`
	Sort              int                    `json:"sort" description:"排序"`
	Members           []*ResearchGroupMember `json:"members"`
	Children          []*ResearchGroupItem   `json:"children"`
}

// ResearchGroupMember 研究方向组员信息
type ResearchGroupMember struct {
	AdminId   int    `json:"admin_id"`
	AdminName string `json:"admin_name"`
}

// GetResearchGroupTree 获取研究方向分组及组员列表
func GetResearchGroupTree(include int) (respList []*ResearchGroupItem, err error) {
	respList = make([]*ResearchGroupItem, 0)
	list, e := system.GetResearchGroupList()
	if e != nil {
		err = errors.New("获取研究方向分组失败, Err:" + e.Error())
		return
	}
	listLen := len(list)
	if listLen == 0 {
		return
	}
	// 分类
	firstList := make([]*ResearchGroupItem, 0)
	secondList := make([]*ResearchGroupItem, 0)
	for i := 0; i < listLen; i++ {
		item := new(ResearchGroupItem)
		item.ResearchGroupId = list[i].ResearchGroupId
		item.ResearchGroupName = list[i].ResearchGroupName
		item.ParentId = list[i].ParentId
		item.ChartPermissionId = list[i].ChartPermissionId
		item.Sort = list[i].Sort
		if list[i].ParentId == 0 {
			firstList = append(firstList, item)
		} else {
			secondList = append(secondList, item)
		}
	}
	if len(firstList) == 0 {
		return
	}
	// 匹配成员
	relationList, e := system.GetResearchGroupRelationList(include)
	if e != nil {
		err = errors.New("获取研究方向关系失败, Err:" + e.Error())
		return
	}
	for _, v := range secondList {
		members := make([]*ResearchGroupMember, 0)
		for _, r := range relationList {
			if v.ResearchGroupId == r.ResearchGroupId {
				members = append(members, &ResearchGroupMember{
					AdminId:   r.AdminId,
					AdminName: r.AdminName,
				})
			}
		}
		v.Members = members
	}
	// 匹配子分类
	for _, p := range firstList {
		children := make([]*ResearchGroupItem, 0)
		for _, child := range secondList {
			if p.ResearchGroupId == child.ParentId {
				children = append(children, child)
			}
		}
		p.Children = children
	}
	respList = firstList
	return
}

// UpdateAdminResearchGroup 更新研究员研究方向分组
func UpdateAdminResearchGroup(adminId int, groupIds string) (err error) {
	if adminId == 0 {
		return
	}
	items := make([]*system.ResearchGroupRelation, 0)
	groupIdArr := strings.Split(groupIds, ",")
	if groupIds != "" {
		for _, v := range groupIdArr {
			groupId, e := strconv.Atoi(v)
			if e != nil {
				err = errors.New("分组ID有误")
				return
			}
			items = append(items, &system.ResearchGroupRelation{
				ResearchGroupId: groupId,
				AdminId:         adminId,
			})
		}
	}
	if e := system.UpdateAdminResearchGroup(adminId, items); e != nil {
		err = errors.New("更新研究方向分组失败, Err:" + e.Error())
	}
	return
}