package material

import (
	"eta/eta_api/utils"
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type MaterialClassify struct {
	ClassifyId      int       `orm:"column(classify_id);pk"`
	ClassifyName    string    `description:"分类名称"`
	ClassifyNameEn  string    `description:"英文分类名称"`
	ParentId        int       `description:"父级id"`
	CreateTime      time.Time `description:"创建时间"`
	ModifyTime      time.Time `description:"修改时间"`
	SysUserId       int       `description:"创建人id"`
	SysUserRealName string    `description:"创建人姓名"`
	Level           int       `description:"层级"`
	Sort            int       `description:"排序字段,越小越靠前,默认值:10"`
	LevelPath       string    `description:"层级路径"`
}

func AddMaterialClassify(item *MaterialClassify) (lastId int64, err error) {
	o := orm.NewOrmUsingDB("rddp")
	lastId, err = o.Insert(item)
	return
}

// GetMaterialClassifyByParentId
func GetMaterialClassifyByParentId(parentId int) (items []*MaterialClassifyItems, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM material_classify WHERE parent_id=? order by sort asc,classify_id asc`
	_, err = o.Raw(sql, parentId).QueryRows(&items)
	return
}

// GetMaterialClassifyAll
func GetMaterialClassifyAll() (items []*MaterialClassifyItems, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM material_classify WHERE parent_id<>0 order by sort asc,classify_id asc`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type MaterialClassifyItems struct {
	ClassifyId     int       `orm:"column(classify_id);pk"`
	ClassifyName   string    `description:"分类名称"`
	ClassifyNameEn string    `description:"英文分类名称"`
	ParentId       int       `description:"父级id"`
	CreateTime     time.Time `description:"创建时间"`
	ModifyTime     time.Time `description:"修改时间"`
	SysUserId      int       `description:"创建人id"`
	SysUserName    string    `description:"创建人姓名"`
	Level          int       `description:"层级"`
	Sort           int       `description:"排序字段,越小越靠前,默认值:10"`
	Children       []*MaterialClassifyItems
}

type MaterialClassifyListResp struct {
	AllNodes []*MaterialClassifyItems
}

type AddMaterialClassifyReq struct {
	ClassifyName string `description:"分类名称"`
	ParentId     int    `description:"父级id,第一级传0"`
	//Level               int    `description:"层级,第一级传0,其余传上一级的层级"`
}

func GetMaterialClassifyNameCount(classifyName string, parentId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT COUNT(1) AS count FROM material_classify WHERE parent_id=? AND classify_name=? `
	err = o.Raw(sql, parentId, classifyName).QueryRow(&count)
	return
}

func GetMaterialClassifyNameEnCount(classifyName string, parentId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT COUNT(1) AS count FROM material_classify WHERE parent_id=? AND classify_name_en=? `
	err = o.Raw(sql, parentId, classifyName).QueryRow(&count)
	return
}

func GetMaterialClassifyNameNotSelfCount(id int, classifyName string, parentId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT COUNT(1) AS count FROM material_classify WHERE classify_id !=? AND parent_id=? AND classify_name=? `
	err = o.Raw(sql, id, parentId, classifyName).QueryRow(&count)
	return
}

func GetMaterialClassifyNameEnNotSelfCount(id int, classifyName string, parentId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT COUNT(1) AS count FROM material_classify WHERE classify_id !=? AND parent_id=? AND classify_name_en=? `
	err = o.Raw(sql, id, parentId, classifyName).QueryRow(&count)
	return
}

// GetMaterialClassifyMaxSort 获取沙盘分类下最大的排序数
func GetMaterialClassifyMaxSort(parentId int) (sort int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT MAX(sort) AS sort FROM material_classify WHERE parent_id=? `
	err = o.Raw(sql, parentId).QueryRow(&sort)
	return
}

type EditMaterialClassifyReq struct {
	ClassifyName string `description:"分类名称"`
	ClassifyId   int    `description:"分类id"`
}

func GetMaterialClassifyById(classifyId int) (item *MaterialClassify, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT * FROM material_classify WHERE classify_id=? `
	err = o.Raw(sql, classifyId).QueryRow(&item)
	return
}

type MaterialClassifyDeleteCheckReq struct {
	ClassifyId int `description:"分类id"`
}

type MaterialClassifyDeleteCheckResp struct {
	DeleteStatus int    `description:"检测状态:0:默认值,如果为0,继续走其他校验,1:该分类下关联图表不可删除,2:确认删除当前目录及包含的子目录吗"`
	TipsMsg      string `description:"提示信息"`
}

type DeleteMaterialClassifyReq struct {
	ClassifyId int `description:"分类id"`
	//	MaterialId int `description:"素材id"`
}

func DeleteMaterialClassify(classifyIds []int) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` DELETE FROM material_classify WHERE classify_id IN(` + utils.GetOrmInReplace(len(classifyIds)) + `) `
	_, err = o.Raw(sql, classifyIds).Exec()
	return
}

// MoveMaterialClassifyReq 移动沙盘分类请求参数
type MoveMaterialClassifyReq struct {
	ClassifyId int `description:"分类id"`
	//MaterialId       int `description:"沙盘ID"`
	ParentClassifyId int `description:"目标父级分类id"`
	PrevClassifyId   int `description:"上一个兄弟节点分类id"`
	NextClassifyId   int `description:"下一个兄弟节点分类id"`
	//PrevType         int `description:"上一个兄弟节点类型 1分类 2沙盘 "`
	//NextType         int `description:"上一个兄弟节点类型 1分类 2沙盘 "`
}

// UpdateMaterialClassifySortByParentId 根据沙盘父类id更新排序
func UpdateMaterialClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` update material_classify set sort = ` + updateSort + ` WHERE parent_id=? and sort > ? `
	if classifyId > 0 {
		sql += ` or ( classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
	}
	_, err = o.Raw(sql, parentId, nowSort).Exec()
	return
}

// GetFirstMaterialClassifyByParentId 获取当前父级沙盘分类下的排序第一条的数据
func GetFirstMaterialClassifyByParentId(parentId int) (item *MaterialClassify, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM material_classify WHERE parent_id=? order by sort asc,classify_id asc limit 1`
	err = o.Raw(sql, parentId).QueryRow(&item)
	return
}

// Update 更新沙盘分类基础信息
func (m *MaterialClassify) Update(cols []string) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	_, err = o.Update(m, cols...)
	return
}

// GetMaterialClassifyAndInfoByParentId
func GetMaterialClassifyAndInfoByParentId(parentId int) (items []*MaterialClassifyItems, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT *
FROM
	material_classify 
WHERE
	parent_id = ?
ORDER BY
	sort ASC,
	classify_id ASC`
	_, err = o.Raw(sql, parentId).QueryRows(&items)
	return
}

type SandboxLinkCheckReq struct {
	EdbInfoIdList   []int `description:"指标id列表"`
	ChartInfoIdList []int `description:"图库id列表"`
	ReportIdList    []int `description:"报告id列表"`
}

type SandboxLinkCheckItem struct {
	Id         int    `description:"id"`
	Name       string `description:"名称"`
	UniqueCode string `description:"唯一编码"`
	ClassifyId int    `description:"分类id"`
}

type SandboxLinkCheckResp struct {
	EdbInfoIdList   []*SandboxLinkCheckItem `description:"指标id列表"`
	ChartInfoIdList []*SandboxLinkCheckItem `description:"图库id列表"`
	ReportIdList    []*SandboxLinkCheckItem `description:"报告id列表"`
}

func GetMaterialClassifyByLevelPath(levelPath string) (items []*MaterialClassify, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT * FROM material_classify where level_path like "` + levelPath + `%"`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}