package Tag

import (
	"FollowUp_Notice/lib"
	"FollowUp_Notice/logs"
	_ "github.com/astaxie/beego/cache/redis"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"sync"
	"time"
)

// 仓库
type Tag struct {
	Id         int       `orm:"column(ID);size(11);auto;pk"`
	T_uid      int       `orm:"size(200);default(1)"`                                  // 关联的用户id
	T_name     string    `orm:"size(256);null"`                                        // 名称
	T_State    int       `orm:"size(2);default(1)"`                                    // 0 删除（伪删除）   1 正常
	T_sort     int       `orm:"size(20);default(0)"`                                   // 排序
	CreateTime time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now_add 第一次保存时才设置时间
	UpdateTime time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now 每次 model 保存时都会对时间自动更新
}

func (t *Tag) TableName() string {
	return "tag"
}

var Tag_list *sync.Map

func init() {
	//注册模型
	orm.RegisterModel(new(Tag))
	Tag_list = new(sync.Map)
}

type Tag_R struct {
	Id     int
	T_name string // 名称
	T_sort int
}

func TagToTag_R(t Tag) (r Tag_R) {
	r.Id = t.Id
	r.T_name = t.T_name
	r.T_sort = t.T_sort
	return r
}

// 添加
func Add_Tag(r Tag) (id int64, err error) {
	o := orm.NewOrm()
	id, err = o.Insert(&r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
	}
	return id, err
}

// 获取 ById
func Read_Tag_ById(Id int) (r Tag, err error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(Tag))
	err = qs.Filter("Id", Id).One(&r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
	}
	return
}

// 获取 ByT_name
func ReadOrCreate_Tag(tag Tag) (id int64, err error) {
	o := orm.NewOrm()
	_, id, err = o.ReadOrCreate(&tag, "T_name", "T_uid", "T_State")
	return
}

// 修改
func Update_Tag(m Tag, cols ...string) error {
	o := orm.NewOrm()
	_, err := o.Update(&m, cols...)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return err
	}
	return nil
}

// 删除
func Delete_Tag(v Tag) error {
	o := orm.NewOrm()
	v.T_State = 0
	_, err := o.Update(&v, "T_State")
	if err != nil {
		logs.Error(lib.FuncName(), err)
	}
	return err
}

// 获取列表
func Read_Tag_List(uid int, T_name string, page, page_z int) (r_ []Tag_R, cnt int64) {
	o := orm.NewOrm()
	// 也可以直接使用 Model 结构体作为表名
	qs := o.QueryTable(new(Tag))
	var offset int64
	if page <= 1 {
		offset = 0
	} else {
		offset = int64((page - 1) * page_z)
	}

	// 过滤
	cond := orm.NewCondition()
	cond = cond.And("T_State", 1).And("T_uid", uid)

	if len(T_name) > 0 {
		cond = cond.And("T_name__icontains", T_name)
	}

	// 查询
	var r []Tag
	var err error
	if page_z == 9999 {
		_, err = qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort").All(&r)
	} else {
		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("T_sort").All(&r)
	}

	if err != nil {
		logs.Error(lib.FuncName(), err)
		return
	}

	cnt, err = qs.SetCond((*orm2.Condition)(cond)).Count()
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return
	}

	for _, v := range r {
		r_ = append(r_, TagToTag_R(v))
	}

	return r_, cnt
}

// 获取疾病
func Read_Tag_All_Map() {
	o := orm.NewOrm()
	var r []Tag
	qs := o.QueryTable(new(Tag))
	_, err := qs.All(&r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
	}

	for _, v := range r {
		Tag_list.Store(v.Id, v.T_name)
	}

}
func Read_Tag_Get(Id int) string {
	// 有先加入 给全部人发消息
	v, ok := Tag_list.Load(Id) /*如果确定是真实的,则存在,否则不存在 */
	if ok {
		return v.(string)
	} else {
		return ""
	}
}
