package data_manage_permission

import (
	"errors"
	"eta/eta_api/models"
	"eta/eta_api/models/data_manage"
	"eta/eta_api/models/data_manage/excel"
	"eta/eta_api/models/system"
	"eta/eta_api/utils"
	"strconv"
)

// GetMoveEdbChartList 获取待转移的指标/图表列表
// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string, startSize, pageSize int) (list []data_manage.MoveEdbChartList, total int, err error) {
	var condition string
	var pars []interface{}
	switch source {
	case 1: //手工数据指标
		if keyword != "" {
			condition += ` AND (a.SEC_NAME LIKE ? OR a.TRADE_CODE like ? ) `
			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
		}
		if userId > 0 {
			condition += ` AND a.user_id = ? `
			pars = append(pars, userId)
		}

		if classify != "" {
			condition += ` AND a.classify_id IN (` + classify + `) `
		}

		total, err = models.GetEdbinfoListCount(condition, pars, "", 0)
		if err != nil {
			return
		}
		tmpList, tmpErr := models.GetEdbinfoList(condition, pars, startSize, pageSize, "", 0)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		if len(tmpList) > 0 {
			adminIdList := make([]int, 0)
			for _, v := range tmpList {
				adminIdList = append(adminIdList, v.UserId)
			}
			adminList, tmpErr := system.GetAdminListByIdListWithoutEnable(adminIdList)
			if tmpErr != nil {
				err = tmpErr
				return
			}
			adminMap := make(map[int]string)
			for _, adminInfo := range adminList {
				adminMap[adminInfo.AdminId] = adminInfo.RealName
			}

			for _, v := range tmpList {
				list = append(list, data_manage.MoveEdbChartList{
					DataId:         v.TradeCode,
					Code:           v.TradeCode,
					Name:           v.SecName,
					ClassifyName:   v.ClassifyName,
					CreateUserId:   v.UserId,
					CreateUserName: adminMap[v.UserId],
				})
			}
		}

	case 2: //钢联化工数据库
		if keyword != `` {
			condition += " AND (index_name like ? OR index_code like ? OR sys_user_real_name like ? ) "
			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
		}
		if userId > 0 {
			condition += ` AND sys_user_id = ? `
			pars = append(pars, userId)
		}

		if classify != "" {
			condition += ` AND base_from_mysteel_chemical_classify_id IN (` + classify + `) `
		}

		total, err = data_manage.GetMysteelChemicalIndexCount(condition, pars)
		if err != nil {
			return
		}
		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexList(condition, pars, startSize, pageSize)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		for _, v := range tmpList {
			list = append(list, data_manage.MoveEdbChartList{
				DataId: strconv.Itoa(v.BaseFromMysteelChemicalIndexId),
				Code:   v.IndexCode,
				Name:   v.IndexName,
				//ClassifyName: v.,
				CreateUserId:   v.SysUserId,
				CreateUserName: v.SysUserRealName,
			})
		}
	case 3, 4: //ETA指标库、ETA预测指标
		if keyword != `` {
			condition += " AND (edb_code like ? OR edb_name like ? OR sys_user_real_name like ? ) "
			pars = utils.GetLikeKeywordPars(pars, keyword, 3)
		}
		if userId > 0 {
			condition += ` AND sys_user_id = ? `
			pars = append(pars, userId)
		}
		if classify != "" {
			condition += ` AND classify_id IN (` + classify + `) `
		}

		edbInfoType := 0 //ETA指标库
		if source == 4 { //ETA预测指标
			edbInfoType = 1
		}
		condition += ` AND edb_info_type = ? `
		pars = append(pars, edbInfoType)

		total, err = data_manage.GetEdbInfoByConditionCount(condition, pars)
		if err != nil {
			return
		}
		tmpList, tmpErr := data_manage.GetEdbInfoListByCondition(condition, pars, startSize, pageSize)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		for _, v := range tmpList {
			list = append(list, data_manage.MoveEdbChartList{
				DataId: strconv.Itoa(v.EdbInfoId),
				Code:   v.EdbCode,
				Name:   v.EdbName,
				//ClassifyName: v.,
				CreateUserId:   v.SysUserId,
				CreateUserName: v.SysUserRealName,
			})
		}
	case 5: //图库
		if keyword != `` {
			condition += " AND (chart_name like ?  OR sys_user_real_name like ? ) "
			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
		}
		if userId > 0 {
			condition += ` AND sys_user_id = ? `
			pars = append(pars, userId)
		}
		if classify != "" {
			condition += ` AND chart_classify_id IN (` + classify + `) `
		}

		total, err = data_manage.GetChartInfoCountByCondition(condition, pars)
		if err != nil {
			return
		}
		tmpList, tmpErr := data_manage.GetChartInfoListByCondition(condition, pars, startSize, pageSize)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		// 获取所有的图表分类
		firstClassifyList, tmpErr := data_manage.GetChartClassifyByParentId(0, 1)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		firstClassifyNameMap := make(map[int]string)
		for _, v := range firstClassifyList {
			firstClassifyNameMap[v.ChartClassifyId] = v.ChartClassifyName
		}
		secondClassList, tmpErr := data_manage.GetChartClassifyAll(1)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		secondClassifyNameMap := make(map[int]string)
		for _, v := range secondClassList {
			firstName := firstClassifyNameMap[v.ParentId]
			if firstName != `` {
				firstName = firstName + " / "
			}
			secondClassifyNameMap[v.ChartClassifyId] = firstName + v.ChartClassifyName
		}

		for _, v := range tmpList {
			list = append(list, data_manage.MoveEdbChartList{
				DataId:         strconv.Itoa(v.ChartInfoId),
				Name:           v.ChartName,
				ClassifyName:   secondClassifyNameMap[v.ChartClassifyId],
				CreateUserId:   v.SysUserId,
				CreateUserName: v.SysUserRealName,
			})
		}
	case 6: //ETA表格
		if keyword != `` {
			condition += " AND (excel_name like ?  OR sys_user_real_name like ? ) "
			pars = utils.GetLikeKeywordPars(pars, keyword, 2)
		}
		if userId > 0 {
			condition += ` AND sys_user_id = ? `
			pars = append(pars, userId)
		}
		if classify != "" {
			condition += ` AND excel_classify_id IN (` + classify + `) `
		}

		condition += " AND source = ? "
		pars = append(pars, subSource)

		total, err = excel.GetExcelInfoCountByCondition(condition, pars)
		if err != nil {
			return
		}
		tmpList, tmpErr := excel.GetNoContentExcelInfoListByCondition(condition, pars, startSize, pageSize)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		// 获取所有的图表分类
		firstClassifyList, tmpErr := excel.GetExcelClassifyByParentId(0, subSource)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		firstClassifyNameMap := make(map[int]string)
		for _, v := range firstClassifyList {
			firstClassifyNameMap[v.ExcelClassifyId] = v.ExcelClassifyName
		}
		secondClassList, tmpErr := excel.GetExcelClassifyBySource(subSource)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		secondClassifyNameMap := make(map[int]string)
		for _, v := range secondClassList {
			firstName := firstClassifyNameMap[v.ParentId]
			if firstName != `` {
				firstName = firstName + " / "
			}
			secondClassifyNameMap[v.ExcelClassifyId] = firstName + v.ExcelClassifyName
		}

		for _, v := range tmpList {
			list = append(list, data_manage.MoveEdbChartList{
				DataId:         strconv.Itoa(v.ExcelInfoId),
				Name:           v.ExcelClassifyName,
				ClassifyName:   secondClassifyNameMap[v.ExcelClassifyId],
				CreateUserId:   v.SysUserId,
				CreateUserName: v.SysUserRealName,
			})
		}
	default:
		return
	}

	return
}

// TODO 资产转移要通知到用户(被转移的用户和新用户)

// MoveEdbChart 转移指标/图表创建人
// @param source 来源 :1:手工数据指标 2:钢联化工数据库 3:ETA指标库 4:ETA预测指标 5:图库 6:ETA表格
func MoveEdbChart(source, subSource, oldUserId, newUserId int, isSelectAll bool, dataId, noDataId []string, keyword, classify string) (err error, errMsg string) {
	adminInfo, err := system.GetSysAdminById(newUserId)
	if err != nil {
		return
	}

	// 如果勾选全部数据,那么
	if isSelectAll {
		// 找出不要的指标ID列表
		noDataIdMap := make(map[string]string, 0)
		for _, v := range noDataId {
			noDataIdMap[v] = v
		}

		// 需要转义的指标/图表ID列表
		dataId = make([]string, 0)
		// 获取所有指标/图表
		list, _, tmpErr := GetMoveEdbChartList(source, subSource, oldUserId, keyword, classify, 0, 100000)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if _, ok := noDataIdMap[v.DataId]; !ok {
				dataId = append(dataId, v.DataId)
			}
		}
	}

	switch source {
	case 1: //手工数据指标
		tmpList, tmpErr := models.GetEdbinfoListByCodeListGroupByUserId(dataId)
		if tmpErr != nil {
			err = tmpErr
			return
		}

		if len(tmpList) > 0 {
			for _, v := range tmpList {
				if v.UserId == newUserId {
					errMsg = "新创建人不可和原创建人一致"
					err = errors.New(errMsg)
					return
				}
			}
			// 修改创建人
			err = models.ModifyEdbinfoUserIdByCodeList(dataId, newUserId)
		}

	case 2: //钢联化工数据库
		tmpList, tmpErr := data_manage.GetMysteelChemicalIndexListGroupByUserId(dataId)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		if len(tmpList) > 0 {
			for _, v := range tmpList {
				if v.SysUserId == newUserId {
					errMsg = "新创建人不可和原创建人一致"
					err = errors.New(errMsg)
					return
				}
			}
			// 修改创建人
			err = data_manage.ModifyMysteelChemicalIndexUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
		}
	case 3, 4: //ETA指标库、ETA预测指标
		tmpList, tmpErr := data_manage.GetEdbInfoListGroupByUserId(dataId)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		if len(tmpList) > 0 {
			for _, v := range tmpList {
				if v.SysUserId == newUserId {
					errMsg = "新创建人不可和原创建人一致"
					err = errors.New(errMsg)
					return
				}
			}
			// 修改创建人
			err = data_manage.ModifyEdbInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)

			// 移除当前用户的不可操作权限
			{
				obj := data_manage.EdbInfoNoPermissionAdmin{}
				for _, v := range dataId {
					edbInfoId, _ := strconv.Atoi(v)
					go obj.DeleteByEdbInfoIdAndAdminId(edbInfoId, adminInfo.AdminId)
				}
			}
		}
	case 5: //图库
		tmpList, tmpErr := data_manage.GetChartInfoListGroupByUserId(dataId)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		if len(tmpList) > 0 {
			for _, v := range tmpList {
				if v.SysUserId == newUserId {
					errMsg = "新创建人不可和原创建人一致"
					err = errors.New(errMsg)
					return
				}
			}
			// 修改创建人
			err = data_manage.ModifyChartInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
		}
	case 6: // ETA表格
		tmpList, tmpErr := excel.GetNoContentExcelListGroupByUserId(dataId)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		if len(tmpList) > 0 {
			for _, v := range tmpList {
				if v.SysUserId == newUserId {
					errMsg = "新创建人不可和原创建人一致"
					err = errors.New(errMsg)
					return
				}
			}
			// 修改创建人
			err = excel.ModifyExcelInfoUserIdByCodeList(dataId, adminInfo.AdminId, adminInfo.RealName)
		}
	default:
		return
	}

	return
}