package data_manage

import (
	"encoding/json"
	"eta_gn/eta_api/controllers"
	"eta_gn/eta_api/models"
	"eta_gn/eta_api/models/data_manage"
	"eta_gn/eta_api/services/data"
	"eta_gn/eta_api/utils"
	"fmt"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strings"
	"time"
)

// EdbCollectController 指标收藏
type EdbCollectController struct {
	controllers.BaseAuthController
}

// List
// @Title 收藏列表-分页
// @Description 收藏列表-分页
// @Param   PageSize		query	int		false	"每页数据量"
// @Param   CurrentIndex	query	int		false	"页码"
// @Param   ClassifyId		query	int		false	"分类ID"
// @Param   Keyword			query	string	false	"搜索关键词:指标ID/指标名称"
// @Success Ret=200 保存成功
// @router /edb_collect/list [get]
func (this *EdbCollectController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	//resp := new(response.EdbInfoChartListResp)
	resp := new(data_manage.CollectEdbInfoListResp)
	resp.List = make([]*data_manage.CollectEdbInfoItem, 0)

	// 分页
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	var total int
	page := paging.GetPaging(currentIndex, pageSize, total)
	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = paging.StartIndex(currentIndex, pageSize)

	// 当前用户
	var cond string
	var pars []interface{}
	cond += ` AND a.sys_user_id = ?`
	pars = append(pars, sysUser.AdminId)

	// 分类筛选
	classifyId, _ := this.GetInt("ClassifyId")
	if classifyId > 0 {
		classifyIds, e := data.GetEdbCollectClassifyChildIds(classifyId, sysUser.AdminId, true)
		if e != nil {
			br.Msg = "获取失败"
			br.ErrMsg = fmt.Sprintf("获取子分类IDs失败, %v", e)
			return
		}
		if len(classifyIds) == 0 {
			resp.Paging = page
			br.Data = resp
			br.Ret = 200
			br.Success = true
			br.Msg = "获取成功"
			return
		}
		cond += fmt.Sprintf(` AND a.edb_collect_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
		pars = append(pars, classifyIds)
	}

	// 获取当前账号的不可见指标
	{
		obj := data_manage.EdbInfoNoPermissionAdmin{}
		list, e := obj.GetAllListByAdminId(sysUser.AdminId)
		if e != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + e.Error()
			return
		}
		var edbIds []int
		for _, v := range list {
			edbIds = append(edbIds, v.EdbInfoId)
		}
		edbLen := len(edbIds)
		if edbLen > 0 {
			cond += fmt.Sprintf(` AND a.edb_info_id NOT IN (%s)`, utils.GetOrmInReplace(edbLen))
			pars = append(pars, edbIds)
		}
	}

	// 关键词搜索
	keywords := this.GetString("Keyword")
	keywords = strings.TrimSpace(keywords)
	if keywords != "" {
		kw := fmt.Sprint("%", keywords, "%")
		cond += fmt.Sprintf(` AND (b.edb_code LIKE ? OR b.edb_name LIKE ?)`)
		pars = append(pars, kw, kw)
	}

	// 获取指标列表
	dataCount, e := data_manage.GetCollectEdbInfoCount(cond, pars)
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = fmt.Sprintf("获取收藏指标总数失败, %v", e)
		return
	}
	if dataCount == 0 {
		resp.Paging = page
		br.Data = resp
		br.Ret = 200
		br.Success = true
		br.Msg = "获取成功"
		return
	}
	list, e := data_manage.GetCollectEdbInfoPageList(cond, pars, startSize, pageSize)
	if e != nil {
		br.Msg = "获取失败"
		br.ErrMsg = fmt.Sprintf("获取收藏指标列表失败, %v", e)
		return
	}
	for _, v := range list {
		resp.List = append(resp.List, data_manage.FormatEdbInfo2CollectItem(v))
	}

	// 指标权限
	//{
	//	var edbClassifyIds []int
	//	for _, v := range list {
	//		edbClassifyIds = append(edbClassifyIds, v.ClassifyId)
	//	}
	//	classifyMap := make(map[int]*data_manage.EdbClassify)
	//	classifyList, e := data_manage.GetEdbClassifyByIdList(edbClassifyIds)
	//	if e != nil {
	//		br.Msg = "获取失败"
	//		br.ErrMsg = fmt.Sprintf("获取指标分类列表失败, %v", e)
	//		return
	//	}
	//	for _, v := range classifyList {
	//		classifyMap[v.ClassifyId] = v
	//	}
	//
	//	// 获取所有有权限的指标和分类
	//	authEdbIds, authEdbClassifyIds, e := data_manage_permission.GetUserEdbAndClassifyPermissionList(sysUser.AdminId, 0, 0)
	//	if e != nil {
	//		br.Msg = "获取失败"
	//		br.ErrMsg = fmt.Sprintf("获取有权限的指标和分类失败, %v", e)
	//		return
	//	}
	//
	//	// 已被供应商暂停的指标编码
	//	stopIndexCodes := make(map[string]bool)
	//	{
	//		var indexCodes []string
	//		for _, v := range list {
	//			if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
	//				indexCodes = append(indexCodes, v.EdbCode)
	//			}
	//		}
	//		if len(indexCodes) > 0 {
	//			stopIndexes, e := data_manage.GetNotIsSupplierStopIndexByCodeList(indexCodes, 1)
	//			if e != nil {
	//				br.Msg = "获取失败"
	//				br.ErrMsg = fmt.Sprintf("获取供应商停更的指标失败, %v", e)
	//				return
	//			}
	//			for _, v := range stopIndexes {
	//				stopIndexCodes[v.IndexCode] = true
	//			}
	//		}
	//	}
	//
	//	for _, v := range list {
	//		// 权限按钮
	//		if c, ok := classifyMap[v.ClassifyId]; ok {
	//			v.HaveOperaAuth = data_manage_permission.CheckEdbPermissionByPermissionIdList(v.IsJoinPermission, c.IsJoinPermission, v.EdbInfoId, v.ClassifyId, authEdbIds, authEdbClassifyIds)
	//			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType, v.HaveOperaAuth)
	//		}
	//		// 供应商停用
	//		if v.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
	//			if _, ok := stopIndexCodes[v.EdbCode]; ok {
	//				v.IsSupplierStop = 1
	//			}
	//		}
	//	}
	//}
	page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
	resp.Paging = page
	//resp.List = list

	br.Data = resp
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
}

// Collect
// @Title 新增收藏
// @Description 新增收藏
// @Param	request	body data_manage.EdbCollectReq true "type json string"
// @Success Ret=200 保存成功
// @router /edb_collect/collect [post]
func (this *EdbCollectController) Collect() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req data_manage.EdbCollectReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
		return
	}
	if req.EdbInfoId <= 0 {
		br.Msg = "请选择指标"
		return
	}

	edbItem, e := data_manage.GetEdbInfoById(req.EdbInfoId)
	if e != nil {
		if utils.IsErrNoRow(e) {
			br.Msg = "指标不存在, 请刷新页面"
			return
		}
		br.Msg = "操作失败"
		br.ErrMsg = fmt.Sprintf("获取指标信息失败: %v", e)
		return
	}

	collectOb := new(data_manage.EdbCollect)

	// 待添加的分类配置
	addList := make([]*data_manage.EdbCollect, 0)
	for _, classifyId := range req.ClassifyIdList {
		addList = append(addList, &data_manage.EdbCollect{
			EdbCollectClassifyId: classifyId,
			EdbInfoId:            req.EdbInfoId,
			EdbCode:              edbItem.EdbCode,
			SysUserId:            sysUser.AdminId,
			SysRealName:          sysUser.RealName,
			CreateTime:           time.Now().Local(),
			ModifyTime:           time.Now().Local(),
		})

	}

	cond := fmt.Sprintf(" %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbInfoId)
	pars := make([]interface{}, 0)
	pars = append(pars, sysUser.AdminId, req.EdbInfoId)

	// 清除原有保存收藏配置,并新增保存收藏
	e = collectOb.RemoveAndCreateMulti(cond, pars, addList)
	if e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = fmt.Sprintf("新增指标收藏失败: %v", e)
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}

// CancelCollect
// @Title 取消收藏
// @Description 取消收藏
// @Param	request	body data_manage.EdbCollectReq true "type json string"
// @Success Ret=200 保存成功
// @router /edb_collect/cancel_collect [post]
func (this *EdbCollectController) CancelCollect() {
	br := new(models.BaseResponse).Init()
	defer func() {
		if br.ErrMsg == "" {
			br.IsSendEmail = false
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req data_manage.EdbCollectReq
	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
		br.Msg = "参数解析异常"
		br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
		return
	}
	if req.EdbInfoId <= 0 {
		br.Msg = "请选择指标"
		return
	}
	if req.ClassifyId <= 0 {
		br.Msg = "请选择分类"
		return
	}

	// 取消收藏
	collectOb := new(data_manage.EdbCollect)
	cond := fmt.Sprintf("%s = ? AND %s = ? AND %s = ?", collectOb.Cols().SysUserId, collectOb.Cols().EdbCollectClassifyId, collectOb.Cols().EdbInfoId)
	pars := make([]interface{}, 0)
	pars = append(pars, sysUser.AdminId, req.ClassifyId, req.EdbInfoId)
	if e := collectOb.RemoveByCondition(cond, pars); e != nil {
		br.Msg = "操作失败"
		br.ErrMsg = fmt.Sprintf("取消收藏失败: %v", e)
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
}