package cygx

import (
	"errors"
	"hongze/hz_crm_api/models/cygx"
	"hongze/hz_crm_api/utils"
	"time"
)

// MoveCygxTag 移动标签
func MoveCygxTag(tagId, prevTagId, nextTagId int) (err error, errMsg string) {
	tagInfo, err := cygx.GetCygxTagByTagId(tagId)
	if err != nil {
		errMsg = `获取数据失败`
		if err.Error() == utils.ErrNoRow() {
			errMsg = `该标签未入库`
			err = nil
		}
		return
	}

	//移动排序
	updateCol := make([]string, 0)
	var currentSort, prevSort, nextSort int
	currentSort = tagInfo.Sort
	//如果有传入 上一个节点分类id
	var prevIndex *cygx.CygxTag
	var nextIndex *cygx.CygxTag
	if prevTagId > 0 {
		prevIndex, err = cygx.GetCygxTagByTagId(prevTagId)
		if err != nil {
			if err.Error() == utils.ErrNoRow() {
				errMsg = "移动失败"
				err = errors.New("上一个节点标签信息不存在" + err.Error())
				return
			}
			errMsg = "移动失败"
			err = errors.New("获取上一个节点标签信息失败,Err:" + err.Error())
			return
		}
		prevSort = prevIndex.Sort
	}

	if nextTagId > 0 {
		//下一个节点
		nextIndex, err = cygx.GetCygxTagByTagId(nextTagId)
		if err != nil {
			if err.Error() == utils.ErrNoRow() {
				errMsg = "移动失败"
				err = errors.New("下一个节点标签信息不存在" + err.Error())
				return
			}
			errMsg = "移动失败"
			err = errors.New("获取下一个节点标签信息失败,Err:" + err.Error())
			return
		}
		nextSort = nextIndex.Sort
	}

	// 修改历史数据中的排序为0的情况
	if prevSort == 0 && nextSort == 0 { //目标是让当前分类处于目录的最顶部, 但是历史数据里下个节点的sort为0的情况
		//更新为0排序的数据为当前最小排序
		if nextIndex != nil {
			minSort, e := cygx.GetCygxTagMinSort()
			if e != nil {
				errMsg = "移动失败"
				err = errors.New("获取下一个节点分类信息失败,Err:" + e.Error())
				return
			}
			if minSort > 1 {
				minSort -= 1
			}
			nextIndex.Sort = minSort
			err = nextIndex.Update([]string{"Sort"})
			if err != nil {
				errMsg = "移动失败"
				err = errors.New("更新下一个节点分类信息失败,Err:" + err.Error())
				return
			}
			nextSort = minSort
		}
	}
	//移到两个排序值中间操作
	if prevSort >= currentSort {
		//往下移动
		err = cygx.MoveDownCygxTagBySort(prevSort, currentSort)
		if err != nil {
			err = errors.New("向下移动出错:" + err.Error())
			return
		}
		tagInfo.Sort = prevSort
	} else if nextSort <= currentSort && nextSort != 0 {
		//往上移动
		err = cygx.MoveUpCygxTagBySort(nextSort, currentSort)
		if err != nil {
			err = errors.New("向上移动出错:" + err.Error())
			return
		}
		tagInfo.Sort = nextSort
	}

	//更新
	tagInfo.ModifyTime = time.Now()
	updateCol = append(updateCol, "Sort", "ModifyTime")
	err = tagInfo.Update(updateCol)
	if err != nil {
		errMsg = "移动失败"
		err = errors.New("修改失败,Err:" + err.Error())
		return
	}
	return
}
