package models

import (
	"eta/eta_index_lib/utils"
	"github.com/beego/beego/v2/client/orm"
	"strconv"
	"time"
)

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

// 判断分类名称是否存在
func GetMysteelClassify(classifyName string, parentId int) (item *BaseFromMysteelChemicalClassify, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM base_from_mysteel_chemical_classify WHERE parent_id=? AND classify_name=? `
	err = o.Raw(sql, parentId, classifyName).QueryRow(&item)
	return
}

// GetEdbClassifyMaxSort 获取分类下最大的排序数
func GetMysteelClassifyMaxSort(parentId int) (sort int, err error) {
	o := orm.NewOrm()
	sql := `SELECT Max(sort) AS sort FROM base_from_mysteel_chemical_classify WHERE parent_id=? `
	err = o.Raw(sql, parentId).QueryRow(&sort)
	return
}

func AddMysteelClassify(item *BaseFromMysteelChemicalClassify) (lastId int64, err error) {
	o := orm.NewOrm()
	lastId, err = o.Insert(item)
	return
}

type AddMysteelClassifyReq struct {
	ClassifyName    string `description:"分类名称"`
	ParentId        int    `description:"父级id,第一级传0"`
	Level           int    `description:"层级,第一级传0,其余传上一级的层级"`
	SysUserId       int    `description:"操作人id"`
	SysUserRealName string `description:"操作人真实名称"`
}

// AddEdbClassify 添加指标分类
func SaveMysteelClassify(classifyName string, parentId, level int, sysUserId, sysUserName string) (classifyInfo *BaseFromMysteelChemicalClassify, err error, errMsg string) {
	edbClassify, err := GetMysteelClassify(classifyName, parentId)

	var isAdd bool
	if err != nil {
		if err.Error() == utils.ErrNoRow() {
			isAdd = true
		} else {
			errMsg = `判断名称是否已存在失败`
			return
		}
	}

	if edbClassify != nil && edbClassify.BaseFromMysteelChemicalClassifyId > 0 {
		classifyInfo = edbClassify
		return edbClassify, nil, ""
	} else {
		isAdd = true
	}
	if isAdd {
		sysUserIdInt, _ := strconv.Atoi(sysUserId)
		//获取该层级下最大的排序数
		maxSort, err := GetMysteelClassifyMaxSort(parentId)
		classifyInfo = &BaseFromMysteelChemicalClassify{
			ClassifyName:    classifyName,
			ParentId:        parentId,
			CreateTime:      time.Now(),
			ModifyTime:      time.Now(),
			SysUserId:       sysUserIdInt,
			SysUserRealName: sysUserName,
			Level:           level + 1,
			Sort:            maxSort,
		}
		classifyId, err := AddMysteelClassify(classifyInfo)
		if err != nil {
			errMsg = "保存分类失败"
		}
		classifyInfo.BaseFromMysteelChemicalClassifyId = int(classifyId)
	}
	return
}