package service

import (
	"fmt"
	IC "jyBXSubscribe/rpc/init"
	"log"

	util "app.yhyue.com/moapp/jybase/common"
	"github.com/zeromicro/go-zero/core/logx"
)

//用户基本信息
type UserInfo struct {
	Entniche *Entniche
	SubSet   map[string]interface{}
}

//
type Entniche struct {
	EntId    int    //企业id
	EntName  string //企业名称
	DeptId   int    //部门id
	DeptName string //部门名称
	DisId    string //分发id
	UserId   int
}
type MatchJob struct {
}

func (m *MatchJob) Start(entId, entUserId int) (map[string]interface{}, int) {
	defer util.Catch()
	defer ClearEnt()
	InitEnt(IC.MainMysql, &IC.Mgo, "qfw", entId, entUserId)
	users := m.LoadSubSet(entId)
	return FinalSub(entUserId, users), EntUserDept[entUserId].DeptId
}

func (m *MatchJob) LoadSubSet(entId int) map[*UserInfo]bool {
	defer util.Catch()
	Users := map[*UserInfo]bool{}
	sess := IC.Mgo.GetMgoConn()
	defer IC.Mgo.DestoryMongoConn(sess)
	it := sess.DB("qfw").C("entniche_rule").Find(map[string]interface{}{
		"i_entid": entId,
	}).Select(map[string]interface{}{
		"i_entid":    1,
		"i_deptid":   1,
		"i_userid":   1,
		"o_entniche": 1,
		"i_type":     1,
	}).Iter()
	log.Println("it", it)
	for _temp := make(map[string]interface{}); it.Next(&_temp); {
		func(temp map[string]interface{}) {
			log.Println("temp", temp)
			entId := util.IntAll(temp["i_entid"])
			deptId := util.IntAll(temp["i_deptid"])
			userId := util.IntAll(temp["i_userid"])
			if entId == 0 || (deptId == 0 && userId == 0) {
				return
			}
			entName := fmt.Sprint(entId)
			if deptId > 0 && EntDepts[deptId] == nil {
				logx.Info("没有找到该部门", entName, entId, deptId)
				return
			}
			deptName := ""
			if EntDepts[deptId] != nil {
				deptName = EntDepts[deptId].Name
			}
			subSet, _ := temp["o_entniche"].(map[string]interface{})
			if subSet == nil || len(subSet) == 0 {
				logx.Info("订阅设置为空，过滤掉", entName, entId, deptName, deptId, userId)
				return
			}
			subSet["i_type"] = temp["i_type"]
			//
			if deptId > 0 { //部门订阅
				if EntDepts[deptId].Subdis == 0 {
					logx.Info("该部门的订阅分发没有开启，过滤掉", entName, entId, deptName, deptId)
					return
				} else if EntDepts[deptId].Nodiff == 0 && EntDeptDis[deptId] == nil {
					logx.Info("该部门开启了订阅分发，没有开启全员无差别接收，但是没有分发规则，过滤掉", entName, entId, deptName, deptId)
					return
				}
				//如果我的上级部门打开了订阅分发，并且开启了全员无差别接收，本部门规则无效
				for _, dept := range EntParentDept[deptId] {
					if EntDepts[dept.Pid].Subdis == 1 && EntDepts[dept.Pid].Nodiff == 1 {
						logx.Info("我的上级部门", dept.Pid, "开启了订阅分发和全员无差别，过滤掉", entName, entId, deptName, deptId)
						return
					}
				}
			} else if userId > 0 { //个人订阅
				if EntUsers[userId] == nil {
					logx.Info("没有找到该用户，过滤掉", entName, entId, userId)
					return
				}
			}
			user := &UserInfo{
				Entniche: &Entniche{
					EntId:    entId,
					EntName:  entName,
					DeptId:   deptId,
					DeptName: deptName,
					UserId:   userId,
				},
				SubSet: subSet,
			}
			logx.Info("加载订阅设置", "entId", entId, "entName", entName, "deptId", deptId, "deptName", deptName, "userId", userId)
			Users[user] = true
			//分发规则
			itemMap := map[string]interface{}{}
			items, _ := subSet["a_items"].([]interface{})
			for _, v := range items {
				item, _ := v.(map[string]interface{})
				if item == nil {
					continue
				}
				item_name, _ := item["s_item"].(string)
				if item_name == "" {
					continue
				}
				itemMap[item_name] = item
			}
			for _, dis := range EntDeptDis[deptId] {
				child_items := []interface{}{}
				for _, item_name := range dis.Items {
					if itemMap[item_name] == nil {
						continue
					}
					child_items = append(child_items, itemMap[item_name])
				}
				child_subSet := map[string]interface{}{}
				if len(dis.Buyerclass) > 0 {
					child_subSet["a_buyerclass"] = dis.Buyerclass
				}
				if len(dis.Area) > 0 {
					child_subSet["o_area"] = dis.Area
				}
				if len(child_items) > 0 {
					child_subSet["a_items"] = child_items
				}
				if len(child_subSet) == 0 {
					continue
				}
				child_user := &UserInfo{
					Entniche: &Entniche{
						EntId:    user.Entniche.EntId,
						EntName:  user.Entniche.EntName,
						DeptId:   user.Entniche.DeptId,
						DeptName: user.Entniche.DeptName,
						DisId:    dis.Id,
					},
					SubSet: child_subSet,
				}
				Users[child_user] = true
			}
		}(_temp)
		_temp = make(map[string]interface{})
	}
	return Users
}
func FinalSub(entUserId int, users map[*UserInfo]bool) map[string]interface{} {
	for k, _ := range users {
		if k.Entniche.DeptId > 0 {
			k.Entniche.DeptName = EntDepts[k.Entniche.DeptId].Name
			staffIds := GetDeptUserIds(&UserInfo{
				Entniche: &Entniche{
					EntId:    k.Entniche.EntId,
					EntName:  k.Entniche.EntName,
					DeptId:   k.Entniche.DeptId,
					DeptName: k.Entniche.DeptName,
					DisId:    k.Entniche.DisId,
				},
			})
			if staffIds == nil {
				continue
			}
			if staffIds[entUserId] {
				return k.SubSet
			}
		} else if k.Entniche.UserId > 0 {
			return k.SubSet
		} else {
			continue
		}
	}
	return nil
}
func GetDeptUserIds(ui *UserInfo) map[int]bool {
	if EntDepts[ui.Entniche.DeptId].Subdis == 0 {
		logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启订阅分发，过滤掉")
		return nil
	} else if EntDepts[ui.Entniche.DeptId].Nodiff == 0 && ui.Entniche.DisId == "" {
		logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "没有开启全员无差别接收，并且没有分发规则，过滤掉")
		return nil
	}
	//对我的对着生效的用户
	myIds := map[int]bool{}
	//打开了全员无差别，下面所有员工都生效
	if EntDepts[ui.Entniche.DeptId].Nodiff == 1 {
		for _, v := range EntDeptUsers[ui.Entniche.DeptId] {
			myIds[v.UserId] = true
		}
		for _, v := range EntChildDept[ui.Entniche.DeptId] {
			for _, vv := range EntDeptUsers[v.Id] {
				myIds[vv.UserId] = true
			}
		}
		logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该部门打开了全员无差别", len(myIds), "人接收")
	} else if ui.Entniche.DisId != "" {
		for _, v := range EntRuleUsers[ui.Entniche.DisId] {
			myIds[v.UserId] = true
		}
		logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "该规则开启了订阅分发", ui.Entniche.DisId, "规则分发了", len(myIds), "人")
	}
	//我的上级部门，过滤掉本部门的人
	for _, v := range EntParentDept[ui.Entniche.DeptId] {
		//看我的上级部门，有没有开启订阅分发
		if EntDepts[v.Pid].Subdis == 0 {
			continue
		}
		//看我的上级部门，有没有全员无差别接收
		if EntDepts[v.Pid].Nodiff == 1 {
			logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "上级部门", v.Pid, "打开了全员无差别开关，过滤掉")
			return nil
		}
		//看我的上级部门，有没有对我设置规则
		for _, vv := range EntDeptDis[v.Pid] {
			for _, vvv := range EntRuleUsers[vv.Id] {
				_, ok := myIds[vvv.UserId]
				if !ok {
					continue
				}
				delete(myIds, vvv.UserId)
				logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, "上级部门", v.Pid, "对我设置的有", vvv.RuleId, "分发规则，此规则作废", vvv.UserId)
			}
		}
	}
	logx.Info(ui.Entniche.EntName, ui.Entniche.EntId, ui.Entniche.DeptName, ui.Entniche.DeptId, ui.Entniche.DisId, "该规则匹配到", len(myIds), "人")
	return myIds
}
