package VerifyTemplate

import (
	"ColdVerify_local/conf"
	"ColdVerify_local/lib"
	"ColdVerify_local/logs"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"time"
)

// 模板
type VerifyTemplateMap struct {
	Id int `orm:"column(ID);size(11);auto;pk"`

	T_id                string `orm:"size(256);null"`     // 标题
	T_VerifyTemplate_id string `orm:"size(256);null"`     // 标题
	T_label             int    `orm:"size(2);default(1)"` // 数据类型
	T_source            int    `orm:"size(2);default(0)"` // 来源 0-所有 1-方案 2-报告 3-表单

	//1：文本
	//2：数值
	//3：设备多选 （1|2|3|4|5|6|）
	//4：设备单选选 （1）
	//7：当期时间（2022年01月19日）
	//9：当期时间（开始与结束时间）（2022-01-01 13:08|2022-01-02 13:08）
	//10：图片
	//11：CAD
	T_name string `orm:"size(256);null"`     // 标签名称
	T_text string `orm:"size(256);null"`     // 描述
	T_sort int    `orm:"size(2);default(1)"` // 排序
	T_Required int    `orm:"size(2);default(0)"` // 必填项  1 必填   0 非必填
	T_Construction int    `orm:"size(2);default(0)"` // 实施（是否在APP 上显示）  1 显示   0 不显示

	// 验证流程
	T_flow_sort int `orm:"size(2);default(0)"` // 验证流程排序
	T_max_time  int `orm:"size(256);null"`     // 验证流程最大时间
	T_min_time  int `orm:"size(256);null"`     // 验证流程最小时间

	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 保存时都会对时间自动更新
}

type VerifyTemplateMap_R struct {
	T_id         string
	T_source     int    // 数据类型
	T_label      int    // 来源
	T_name       string // 标签名称
	T_text       string // 描述
	T_sort       int    // 排序
	T_Required       int    // 必填项  1 必填   0 非必填
	T_Construction       int   // 实施（是否在APP 上显示）  1 显示   0 不显示
	T_flow_sort  int    // 验证流程排序
	T_max_time   int    // 验证流程最大时间
	T_min_time   int    // 验证流程最小时间
	T_start_time int    // 任务开始时间 app
}

func (t *VerifyTemplateMap) TableName() string {
	return "verify_template_map" // 数据库名称   // ************** 替换 FormulaList **************
}

func init() {

	//注册模型
	orm.RegisterModel(new(VerifyTemplateMap))

}

// -------------------------------------------------------------
func VerifyTemplateMapToVerifyTemplateMap_R(T VerifyTemplateMap) (T_r VerifyTemplateMap_R) {
	T_r.T_id = T.T_id
	T_r.T_source = T.T_source
	T_r.T_label = T.T_label
	T_r.T_name = T.T_name
	T_r.T_text = T.T_text
	T_r.T_sort = T.T_sort
	T_r.T_Required = T.T_Required
	T_r.T_Construction = T.T_Construction
	T_r.T_flow_sort = T.T_flow_sort
	T_r.T_max_time = T.T_max_time
	T_r.T_min_time = T.T_min_time
	return T_r
}

// ---------------- 特殊方法 -------------------

// 获取 ById
func Read_VerifyTemplateMap_ById(id int) (r VerifyTemplateMap, is bool) {
	o := orm.NewOrm()
	r = VerifyTemplateMap{Id: id}
	err := o.Read(&r) // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return r, false
	}
	return r, true
}

// 获取 By
func Read_VerifyTemplateMap(T_id string) (r VerifyTemplateMap, is bool) {

	o := orm.NewOrm()
	qs := o.QueryTable(new(VerifyTemplateMap))
	err := qs.Filter("T_id", T_id).One(&r)
	if err != nil {
		return r, false
	}

	return r, true
}

// 添加
func Add_VerifyTemplateMap(r VerifyTemplateMap) (id int64, is bool) {
	o := orm.NewOrm()

	// 生成编号
	rand_x := 0
	for true {
		r.T_id = lib.GetRandstring(4, "", int64(rand_x)) // 1,336,336
		err := o.Read(&r, "T_id")                        // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
		if err != nil {
			break
		}
		rand_x += 1
	}

	id, err := o.Insert(&r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return 0, false
	}

	return id, true
}

// 添加
func Add_VerifyTemplateMapMulti(r []VerifyTemplateMap) (id int64, is bool) {
	o := orm.NewOrm()
	n, err := o.InsertMulti(len(r), r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return n, false
	}

	return n, true
}

// 删除
func Delete_VerifyTemplateMap(v VerifyTemplateMap) bool {
	o := orm.NewOrm()
	if num, err := o.Delete(&v); err == nil {
		logs.Println("Number of records deleted in database:", num)
	} else {
		return false
	}

	return true
}

// 修改
func Update_VerifyTemplateMap(m VerifyTemplateMap, cols ...string) bool {
	o := orm.NewOrm()
	if num, err := o.Update(&m, cols...); err == nil {
		log.Println("Number of records updated in database:", num)
		return true
	}
	return false
}

// 获取列表
func Read_VerifyTemplateMap_List(T_VerifyTemplate_id string, T_sort, T_flow_sort int) ([]VerifyTemplateMap_R, int64) {

	o := orm.NewOrm()
	// 也可以直接使用 Model 结构体作为表名
	var r []VerifyTemplateMap
	qs := o.QueryTable(new(VerifyTemplateMap))
	cond := orm.NewCondition()
	cond1 := cond.And("T_VerifyTemplate_id", T_VerifyTemplate_id) // .AndNot("status__in", 1).Or("profile__age__gt", 2000)
	// 排序 默认升序

	if T_sort == 2 {
		qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_sort").All(&r)
	} else if T_flow_sort == 1 {
		qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_flow_sort").All(&r)
	} else if T_flow_sort == 2 {
		qs.SetCond((*orm2.Condition)(cond1)).OrderBy("-T_flow_sort").All(&r)
	} else {
		qs.SetCond((*orm2.Condition)(cond1)).OrderBy("T_sort").All(&r)
	}
	cnt, _ := qs.SetCond((*orm2.Condition)(cond1)).Count()

	// 转换
	var VerifyTemplateMap_r []VerifyTemplateMap_R
	for _, v := range r {
		VerifyTemplateMap_r = append(VerifyTemplateMap_r, VerifyTemplateMapToVerifyTemplateMap_R(v))
	}

	return VerifyTemplateMap_r, cnt
}

func Read_VerifyTemplateMap_List_For_Data(T_VerifyTemplate_id string, T_source, T_flow int) []VerifyTemplateMap {

	o := orm.NewOrm()
	// 也可以直接使用 Model 结构体作为表名
	var r []VerifyTemplateMap
	qs := o.QueryTable(new(VerifyTemplateMap))
	source := []int{T_source}
	if T_source == 2 {
		source = append(source, 3)
	}
	if T_source != 3 {
		source = append(source, 0)
	}

	cond := orm.NewCondition()
	if T_flow == 1 {
		// app时间流程 排序id不等于0
		cond = cond.AndNot("T_flow_sort", 0).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
		qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_flow_sort").All(&r)
	} else {
		cond = cond.And("T_source__in", source).And("T_VerifyTemplate_id", T_VerifyTemplate_id)
		qs.SetCond((*orm2.Condition)(cond)).OrderBy("T_sort").All(&r)
	}

	return r
}

func VerifyTemplateMap_RToMap(T []VerifyTemplateMap_R) map[string]string {
	maps := make(map[string]string, len(T))
	for _, v := range T {
		maps[v.T_id] = v.T_name
	}
	return maps
}

func Read_VerifyTemplateMap_T_name(T_VerifyTemplate_id, T_name string) (r VerifyTemplateMap, err error) {

	serverOrm := orm2.NewOrmUsingDB(conf.Server_AliasName)

	qs := serverOrm.QueryTable(new(VerifyTemplateMap))
	//err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
	err = qs.Filter("T_VerifyTemplate_id", T_VerifyTemplate_id).Filter("T_name__icontains", T_name).One(&r)
	if err != nil {
		return r, err
	}

	return r, nil
}
