package chart_collect

import (
	"github.com/beego/beego/v2/client/orm"
	"time"
)

// 用户收藏分类表
type ChartCollectClassify struct {
	CollectClassifyId   int       `orm:"column(collect_classify_id);pk"`
	ClassifyName        string    `description:"分类名称"`
	ParentId            int       `description:"父级id"`
	CreateTime          time.Time `description:"创建时间"`
	ModifyTime          time.Time `description:"修改时间"`
	UserId              int       `description:"创建人id"`
	RealName            string    `description:"创建人姓名"`
	Level               int       `description:"层级"`
	Sort                int       `description:"排序字段,越小越靠前,默认值:10"`
	Source              int       `description:"分类来源: 1-图库; 2-商品价格曲线; 3-相关性图表; 6-拟合方程图表; 7-统计特征"`
	ChartClassifyNameEn string    `description:"英文分类名称"`
}

type ClassifyAddReq struct {
	ClassifyName string `description:"分类名称"`
}

func AddChartCollectClassify(item *ChartCollectClassify) (err error) {
	o := orm.NewOrm()
	_, err = o.Insert(item)
	return
}

func GetChartCollectClassifyAll(userId int) (item []*ChartCollectClassify, err error) {
	o := orm.NewOrm()
	sql := ` SELECT * FROM chart_collect_classify WHERE 1=1 AND user_id=? `
	sql += " ORDER BY sort asc, collect_classify_id asc "
	_, err = o.Raw(sql, userId).QueryRows(&item)
	return
}

type ChartCollectClassifyResp struct {
	List     []*ChartCollectClassifyItem
	Language string `description:"指标的展示语言,CN:中文,EN:英文"`
}

type ChartCollectClassifyAddReq struct {
	ClassifyName string `description:"分类名称"`
}

func GetChartCollectClassifyCountByCondition(condition string, pars []interface{}) (count int, err error) {
	o := orm.NewOrm()
	sql := ` SELECT COUNT(1) AS count FROM chart_collect_classify WHERE 1=1 `
	if condition != "" {
		sql += condition
	}
	err = o.Raw(sql, pars).QueryRow(&count)
	return
}

func GetChartCollectClassifyById(adminId, classifyId int) (item *ChartCollectClassify, err error) {
	o := orm.NewOrm()
	sql := ` SELECT * FROM chart_collect_classify WHERE user_id=? AND collect_classify_id=? `
	err = o.Raw(sql, adminId, classifyId).QueryRow(&item)
	return
}

// GetChartCollectClassifyMaxSort 获取MY ETA 分类中排序最小的值
func GetChartCollectClassifyMaxSort(adminId int) (sort int, err error) {
	o := orm.NewOrm()
	sql := ` SELECT Max(sort) sort FROM chart_collect_classify WHERE user_id=? `
	err = o.Raw(sql, adminId).QueryRow(&sort)
	return
}

type ChartCollectClassifyEditReq struct {
	CollectClassifyId int    `description:"分类ID"`
	ClassifyName      string `description:"分类名称"`
}

// ChartCollectClassifyMoveReq 移动分类请求参数
type ChartCollectClassifyMoveReq struct {
	CollectClassifyId     int `description:"分类id"`
	PrevCollectClassifyId int `description:"上一个兄弟节点分类id"`
	NextCollectClassifyId int `description:"下一个兄弟节点分类id"`
}

func ModifyChartCollectClassify(classifyId int, ClassifyName string) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE chart_collect_classify SET classify_name=?,modify_time=NOW() WHERE collect_classify_id=?`
	_, err = o.Raw(sql, ClassifyName, classifyId).Exec()
	return
}

type ChartCollectClassifyDeleteReq struct {
	CollectClassifyId int `description:"分类ID"`
}

func DeleteChartCollectClassify(classifyId int) (err error) {
	// 新增事务处理
	o := orm.NewOrm()
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	sql := `DELETE FROM chart_collect_classify WHERE collect_classify_id=?`
	_, err = to.Raw(sql, classifyId).Exec()
	if err != nil {
		return
	}

	sql = `DELETE FROM chart_collect WHERE collect_classify_id=?`
	_, err = to.Raw(sql, classifyId).Exec()
	if err != nil {
		return
	}

	return
}

// ModifyCollectChartClassifyReq 设置图表分类请求参数
type ModifyCollectChartClassifyReq struct {
	SelectAll          bool
	CollectClassifyIds string
	SysUserIds         string
	Keyword            string

	ChartInfoIds      string `description:"图表ID"`
	CollectClassifyId int    `description:"新图表分类"`
}