package Task

import (
	"bzd_server/conf"
	"bzd_server/logs"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego/cache"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	_ "github.com/go-sql-driver/mysql"
	"time"
)

// 模板
type Task struct {
	Id                  int    `orm:"column(ID);size(11);auto;pk"`
	T_task_id           string `orm:"size(256);null"` // 任务ID
	T_uuid              string `orm:"size(256);null"` // 用户 UUID
	T_name              string `orm:"size(256);null"` // 标题
	T_VerifyTemplate_id string `orm:"size(256);null"` // 模板id
	T_deadline          string `orm:"size(256);null"` // 截止时间
	T_collection        string `orm:"size(256);null"` // 数据采集 负责人UUID
	T_reporting         string `orm:"size(256);null"` // 报告编写 负责人UUID
	T_delivery          string `orm:"size(256);null"` // 交付审核 负责人UUID
	T_collection_state  int    `orm:"size(2);0"`      // 数据采集 状态 0 未完成 1 已完成
	T_reporting_state   int    `orm:"size(2);0"`      // 报告编写 状态 0 未完成 1 已完成
	T_delivery_state    int    `orm:"size(2);0"`      // 交付审核 状态 0 未完成 1 已完成

	T_doc1 string `orm:"size(256);null"` // 封面
	T_pdf1 string `orm:"size(256);null"` // 封面
	T_doc2 string `orm:"size(256);null"` // 报告
	T_pdf2 string `orm:"size(256);null"` // 报告
	T_doc3 string `orm:"size(256);null"` // 证书
	T_pdf3 string `orm:"size(256);null"` // 证书

	T_Show     int       `orm:"size(2);1"`                                             // 0 隐藏   1 公开
	T_Visit    int       `orm:"size(200);0"`                                           // 浏览量
	T_State    int       `orm:"size(2);1"`                                             // 0 删除   1 正常
	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 Task_R struct {
	T_task_id  string // 标题
	T_name     string // 标题
	T_doc1     string // 封面
	T_pdf1     string // 封面
	T_doc2     string // 报告
	T_pdf2     string // 报告
	T_doc3     string // 证书
	T_pdf3     string // 证书
	T_Show     int    // 公开/隐藏
	T_Visit    int    // 浏览量
	T_State    int    // 0    1
	CreateTime time.Time
	UpdateTime time.Time
}

type Task_ struct {
	T_task_id           string // 任务ID
	T_uuid              string // 用户 UUID
	T_name              string // 标题
	T_VerifyTemplate_id string // 任务模板id
	T_deadline          string // 截止时间
	T_collection        string // 数据采集 负责人UUID
	T_reporting         string // 报告编写 负责人UUID
	T_delivery          string // 交付审核 负责人UUID
	T_collection_state  int    // 数据采集 状态 0 未完成 1 已完成
	T_reporting_state   int    // 报告编写 状态 0 未完成 1 已完成
	T_delivery_state    int    // 交付审核 状态 0 未完成 1 已完成
	T_collection_name   string // 数据采集 负责人姓名
	T_reporting_name    string // 报告编写 负责人姓名
	T_delivery_name     string // 交付审核 负责人姓名
	T_doc1              string // 封面
	T_pdf1              string // 封面
	T_doc2              string // 报告
	T_pdf2              string // 报告
	T_doc3              string // 证书
	T_pdf3              string // 证书
	T_Show              int    // 0 公开 1 隐藏
	T_Visit             int    // 浏览量
	T_State             int    // 0 删除 1 正常
}

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

var redisCache_Task cache.Cache

func init() {

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

	config := fmt.Sprintf(`{"key":"%s","conn":"%s","dbNum":"%s","password":"%s"}`,
		"redis_"+"Task", conf.Redis_address, conf.Redis_dbNum, conf.Redis_password)
	logs.Println(config)
	var err error
	redisCache_Task, err = cache.NewCache("redis", config)
	if err != nil || redisCache_Task == nil {
		errMsg := "failed to init redis"
		logs.Println(errMsg, err)
	}
}

// ---------------- Redis -------------------
//Redis_Set(m.T_sn,m) // Redis 更新缓存
func Redis_Task_Set(key string, r Task) (err error) {
	//json序列化
	str, err := json.Marshal(r)
	if err != nil {
		logs.Println(err)
		return
	}
	err = redisCache_Task.Put(key, str, 24*time.Hour)
	if err != nil {
		logs.Println("set key:", key, ",value:", str, err)
	}
	return
}

//if r,is :=Redis_Get(T_sn);is{
//return r,nil
//}
func Redis_Task_Get(key string) (r Task, is bool) {
	if redisCache_Task.IsExist(key) {
		logs.Println("找到key:", key)
		v := redisCache_Task.Get(key)
		json.Unmarshal(v.([]byte), &r)
		return r, true
	}
	logs.Println("没有 找到key:", key)
	return Task{}, false
}
func Redis_Task_DelK(key string) (err error) {
	err = redisCache_Task.Delete(key)
	return
}

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

// 获取 线上任务
func Read_Task(T_task_id string) (r Task, is bool) {
	if r, is = Redis_Task_Get(T_task_id); is == true {
		return r, true
	}
	o := orm2.NewOrmUsingDB(conf.Server_AliasName)
	qs := o.QueryTable(new(Task))
	//err := qs.Filter("T_task_id", T_task_id).Filter("T_State", 1).One(&r)
	err := qs.Filter("T_task_id", T_task_id).One(&r)
	if err != nil {
		return r, false
	}

	Redis_Task_Set(T_task_id, r)
	return r, true
}

// 修改 线上任务
func Update_Task(m Task, cols ...string) bool {
	o := orm2.NewOrmUsingDB(conf.Server_AliasName)
	if num, err := o.Update(&m, cols...); err == nil {
		fmt.Println("Number of records updated in database:", num)
		Redis_Task_Set(m.T_task_id, m)
		return true
	}
	return false
}
