package data_manage_permission

import (
	"errors"
	"eta/eta_api/utils"
	"time"
)

// DataPermissionNoAuthRecord
// @Description: 资产数据权限设置记录表
type DataPermissionNoAuthRecord struct {
	DataPermissionNoAuthRecordId int64     `json:"data_permission_no_auth_record_id" orm:"column(data_permission_no_auth_record_id);pk"` // 资产数据操作记录id
	Source                       int32     `json:"source"`                                                                               // 数据来源，1：手工数据指标 2：钢联化工数据库 3：ETA指标库 4：ETA预测指标 5：图库 6：ETA表格
	SubSource                    int32     `json:"sub_source"`                                                                           // 子来源 ：ETA表格中的各种表格类型，以及图表的来源（这个是后续的扩展方向）
	OpUniqueCode                 string    `json:"op_unique_code"`                                                                       // 操作的唯一编码，主要是记录统一操作的日志
	DataId                       string    `json:"data_id"`                                                                              // 资产id（指标、图表、表格）
	DataCode                     string    `json:"data_code"`                                                                            // 资产code（指标、图表、表格）
	DataName                     string    `json:"data_name"`                                                                            // 资产名称（指标、图表、表格）
	SysUserId                    int32     `json:"sys_user_id"`                                                                          // 系统用户id
	CreateTime                   time.Time `json:"create_time"`                                                                          // 创建时间
}

type DataItem struct {
	DataId   int    `json:"data_id"`   // 资产id（指标、图表、表格）
	DataCode string `json:"data_code"` // 资产code（指标、图表、表格）
	DataName string `json:"data_name"` // 资产名称（指标、图表、表格）
}

// AddRecordBySourceAndDataIdList
// @Description: 添加未授权用户记录
// @author: Roc
// @datetime 2024-04-07 15:25:49
// @param source int
// @param subSource int
// @param dataList []DataItem
// @param noAuthUserIdList []int 未授权用户
// @param authUserIdList []int 已授权用户
// @param uniqueCode
// @param content string
// @param opUserId int
// @return err error
func AddRecordBySourceAndDataIdList(source, subSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, title, content string, opUserId int) (err error) {
	switch source {
	case 3, 4:
		edbInfoType := 0
		if source == 4 {
			edbInfoType = 1
		}
		err = AddEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(source, edbInfoType, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)

	case 5:
		//图库
		chartSource := utils.CHART_SOURCE_DEFAULT
		err = AddChartInfoPermissionNoAuthRecordBySourceAndDataIdList(source, chartSource, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)

	case 6:
		// ETA表格
		err = AddExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(source, subSource, dataList, noAuthUserIdList, authUserIdList, uniqueCode, title, content, opUserId)

	default:
		return errors.New("错误的source")
	}
	return
}

// AddRecordBySourceAndDataIdList
// @Description: 添加未授权用户记录
// @author: Roc
// @datetime 2024-04-07 15:25:49
// @param source int
// @param subSource int
// @param dataList []DataItem
// @param noAuthUserIdList []int 未授权用户
// @param authUserIdList []int 已授权用户
// @param uniqueCode
// @param content string
// @param opUserId int
// @return err error
//func AddRecordBySourceAndDataIdList(source, subSource int, dataList []DataItem, noAuthUserIdList, authUserIdList []int, uniqueCode, content string, opUserId int) (err error) {
//	num := len(dataList)
//	if num <= 0 {
//		return
//	}
//	dataIdList := make([]string, 0)
//	for _, v := range dataList {
//		dataIdList = append(dataIdList, v.DataId)
//	}
//	userNum := len(noAuthUserIdList)
//	if userNum <= 0 {
//		return
//	}
//	o, err := orm.NewOrmUsingDB("data").Begin()
//	if err != nil {
//		return
//	}
//	defer func() {
//		if err != nil {
//			_ = o.Rollback()
//		} else {
//			_ = o.Commit()
//		}
//	}()
//
//	// 根据指标获取已经存在的未授权记录
//	var existList []*DataPermissionNoAuthRecord
//	sql := `SELECT * FROM data_permission_no_auth_record WHERE source = ? AND sub_source = ? AND data_id in (` + utils.GetOrmInReplace(num) + `)`
//	_, err = o.Raw(sql, source, subSource, dataIdList).QueryRows(&existList)
//	if err != nil {
//		return
//	}
//
//	// 已经标记了的数据
//	existMap := make(map[int32]map[string]*DataPermissionNoAuthRecord)
//	for _, v := range existList {
//		tmpUserExistMap, ok := existMap[v.SysUserId]
//		if !ok {
//			tmpUserExistMap = make(map[string]*DataPermissionNoAuthRecord)
//		}
//
//		key := fmt.Sprint(v.Source, "_", v.SubSource, "_", v.DataId)
//		tmpUserExistMap[key] = v
//		existMap[v.SysUserId] = tmpUserExistMap
//	}
//
//	addMessageList := make([]*DataPermissionMessage, 0)
//	addRecordList := make([]*DataPermissionNoAuthRecord, 0)
//	for _, userId := range noAuthUserIdList {
//		isAdd := false
//
//		tmpUserExistMap, userExistOk := existMap[int32(userId)]
//
//		for _, dataItem := range dataList {
//			// 判断是否已经存在，已经存在就过滤
//			if userExistOk {
//				key := fmt.Sprint(source, "_", subSource, "_", dataItem.DataId)
//				_, ok := tmpUserExistMap[key]
//				if ok {
//					continue
//				}
//			}
//
//			isAdd = true
//			addRecordList = append(addRecordList, &DataPermissionNoAuthRecord{
//				DataPermissionNoAuthRecordId: 0,
//				Source:                       int32(source),
//				SubSource:                    int32(subSource),
//				OpUniqueCode:                 uniqueCode,
//				DataId:                       dataItem.DataId,
//				DataCode:                     dataItem.DataCode,
//				DataName:                     dataItem.DataName,
//				SysUserId:                    int32(userId),
//				CreateTime:                   time.Now(),
//			})
//		}
//
//		// 有记录的话，需要添加消息
//		if isAdd {
//			addMessageList = append(addMessageList, &DataPermissionMessage{
//				DataPermissionMessageId: 0,
//				SendUserId:              int32(opUserId),
//				ReceiveUserId:           int32(userId),
//				Content:                 content,
//				Remark:                  content,
//				OpType:                  3,
//				Source:                  int32(source),
//				SubSource:               int32(subSource),
//				OpUniqueCode:            uniqueCode,
//				IsRead:                  0,
//				CreateTime:              time.Now(),
//				ModifyTime:              time.Now(),
//			})
//		}
//	}
//
//	// 添加消息
//	if len(addMessageList) > 0 {
//		_, err = o.InsertMulti(500, addMessageList)
//		if err != nil {
//			return
//		}
//	}
//
//	// 添加记录
//	if len(addRecordList) > 0 {
//		_, err = o.InsertMulti(500, addRecordList)
//		if err != nil {
//			return
//		}
//	}
//
//	// 已经授权了的用户，需要删除未授权记录
//	authUserIdNum := len(authUserIdList)
//	if authUserIdNum > 0 {
//		sql = `DELETE FROM data_permission_no_auth_record WHERE  source = ? AND sub_source = ? AND sys_user_id in (` + utils.GetOrmInReplace(authUserIdNum) + `) AND data_id in (` + utils.GetOrmInReplace(num) + `)`
//		_, err = o.Raw(sql, source, subSource, authUserIdList, dataIdList).Exec()
//	}
//
//	return
//}

// DeleteRecordBySourceAndDataIdList
// @Description: 根据来源和数据id列表删除记录
// @author: Roc
// @datetime 2024-04-07 14:47:37
// @param source int
// @param subSource int
// @param dataIdList []string
// @return err error
func DeleteRecordBySourceAndDataIdList(source, subSource int, dataIdList []string) (err error) {
	switch source {
	case 3, 4:
		edbInfoType := 0
		if source == 4 {
			edbInfoType = 1
		}
		err = DeleteEdbInfoPermissionNoAuthRecordBySourceAndDataIdList(edbInfoType, dataIdList)
	case 5:
		//图库
		chartSource := utils.CHART_SOURCE_DEFAULT
		err = DeleteChartInfoPermissionNoAuthRecordBySourceAndDataIdList(chartSource, dataIdList)

	case 6:
		// ETA表格
		err = DeleteExcelInfoPermissionNoAuthRecordBySourceAndDataIdList(subSource, dataIdList)

	default:
		return errors.New("错误的source")
	}
	return
}

// DeleteRecordBySourceAndDataIdList
// @Description: 根据来源和数据id列表删除记录
// @author: Roc
// @datetime 2024-04-07 14:47:37
// @param source int
// @param subSource int
// @param dataIdList []string
// @return err error
//func DeleteRecordBySourceAndDataIdList(source, subSource int, dataIdList []string) (err error) {
//	num := len(dataIdList)
//	if num <= 0 {
//		return
//	}
//	o := orm.NewOrmUsingDB("data")
//
//	sql := `DELETE FROM data_permission_no_auth_record WHERE source = ? AND sub_source = ? AND data_id in (` + utils.GetOrmInReplace(num) + `)`
//	_, err = o.Raw(sql, source, subSource, dataIdList).Exec()
//
//	return
//}

// GetDataPermissionNoAuthRecordListByUserId
// @Description: 根据用户获取未授权的资产记录
// @author: Roc
// @datetime 2024-04-07 20:15:01
// @param userId int
// @param source int
// @param subSource int
// @param startSize int
// @param pageSize int
// @return total int
// @return items []*DataPermissionNoAuthRecord
// @return err error
//func GetDataPermissionNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
//	o := orm.NewOrmUsingDB("data")
//
//	// 获取总数
//	sql := `SELECT count(1) AS total FROM data_permission_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? `
//	err = o.Raw(sql, userId, source, subSource).QueryRow(&total)
//	if err != nil {
//		return
//	}
//
//	sql = `SELECT * FROM data_permission_no_auth_record WHERE sys_user_id = ? AND source = ? AND sub_source = ? ORDER BY data_permission_no_auth_record_id desc LIMIT ?,? `
//	_, err = o.Raw(sql, userId, source, subSource, startSize, pageSize).QueryRows(&items)
//
//	return
//}

// GetDataPermissionNoAuthRecordListByUserId
// @Description: 根据用户获取未授权的资产记录
// @author: Roc
// @datetime 2024-04-07 20:15:01
// @param userId int
// @param source int
// @param subSource int
// @param startSize int
// @param pageSize int
// @return total int
// @return items []*DataPermissionNoAuthRecord
// @return err error
func GetDataPermissionNoAuthRecordListByUserId(userId, source, subSource int32, startSize, pageSize int) (total int, items []*DataPermissionNoAuthRecord, err error) {
	switch source {
	case 3, 4:
		edbInfoType := 0
		if source == 4 {
			edbInfoType = 1
		}
		total, items, err = GetEdbInfoDataPermissionNoAuthRecordListByUserId(userId, edbInfoType, startSize, pageSize)
	case 5:
		//图库
		chartSource := utils.CHART_SOURCE_DEFAULT
		total, items, err = GetChartInfoDataPermissionNoAuthRecordListByUserId(userId, chartSource, startSize, pageSize)

	case 6:
		// ETA表格
		total, items, err = GetExcelInfoDataPermissionNoAuthRecordListByUserId(userId, subSource, startSize, pageSize)

	default:
		err = errors.New("错误的source")
		return
	}

	return
}
