package Account

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

type Company struct {
	Id        int    `orm:"column(ID);size(11);auto;pk"`
	T_mid     int    `orm:"size(200);"`          //  上一级 ID
	T_name    string `orm:"size(256);"`          // 公司名称
	T_key     string `orm:"size(256);index;"`    // 公司密钥
	T_warning int    `orm:"size(20);default(1)"` //  是否处理报警信息 1处理 2不处理

	T_plan string `orm:"type(text);null"` //  平面图
	T_data string `orm:"type(text);null"` //  大数据
	T_v3d  string `orm:"type(text);null"` //  3D 视图

	T_Address    string `orm:"size(256);null"` // 地址
	T_coordinate string `orm:"size(256);null"` // 坐标

	T_path     string    `orm:"size(256);null"`                                   // 公司路径 /0/1/5/
	T_money    float32   `orm:"digits(12);decimals(2)"`                           //  余额
	T_Charging int       `orm:"size(11);default(0)"`                              //  记账扣费 公司ID  默认为：0 （自己）
	T_State    int       `orm:"size(200);"`                                       //  0删除  1 正常
	CreateTime time.Time `orm:"column(create_time);type(timestamp);auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
	UpdateTime time.Time `orm:"column(update_time);type(timestamp);auto_now"`     //auto_now_add 第一次保存时才设置时间
}

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

var redisCache_Company cache.Cache

func init() {
	//注册模型
	orm.RegisterModel(new(Company))

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

}

// ---------------- Redis -------------------
// Redis_Set(m.T_sn,m) // Redis 更新缓存
func Redis_Company_Set(r Company) (err error) {
	//json序列化
	str, err := json.Marshal(r)
	if err != nil {
		logs.PrintlnError("Redis_Company_Set", err)
		return
	}

	err = redisCache_Company.Put(strconv.Itoa(r.Id), str, 24*time.Hour)
	if err != nil {
		logs.Println("set key:", strconv.Itoa(r.Id), ",value:", str, err)
	}
	return
}

// if r,is :=Redis_Get(T_sn);is{
// return r,nil
// }
func Redis_Company_Get(key string) (r Company, is bool) {
	if redisCache_Company.IsExist(key) {
		//println("找到key:",key)
		v := redisCache_Company.Get(key)

		json.Unmarshal(v.([]byte), &r)
		return r, true
	}
	//println("没有 找到key:",key)
	return Company{}, false
}

func Redis_Company_DelK(key string) (err error) {
	err = redisCache_Company.Delete(key)
	return
}

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

// 获取 ById
func Read_Company_id(Id int) (e error, r Company) {
	if r, is := Redis_Company_Get(strconv.Itoa(Id)); is {
		//println("Redis_Get  OK")
		return nil, r
	}

	o := orm.NewOrm()
	qs := o.QueryTable(new(Company))
	e = qs.Filter("Id", Id).Filter("T_State", 1).One(&r)
	return e, r
}

// 修改
func Update_Company(m Company, cols ...string) bool {
	o := orm.NewOrm()
	if num, err := o.Update(&m, cols...); err == nil {
		logs.Println("Number of records updated in database:", num)
		Redis_Company_Set(m) // Redis 更新缓存
		return true
	}
	return false
}

// 获取全部
func Read_Company_All() (r_l []Company) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(Company))
	qs.Filter("T_State", 1).All(&r_l)
	return
}

// 获取全部
func Read_Company_T_mid_All(T_mid int) (r_l []Company) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(Company))
	qs.Filter("T_State", 1).Filter("T_mid", T_mid).All(&r_l)
	return
}

// 获取 ById
func Read_Company_T_key(T_key string) (r Company, e error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(Company))
	e = qs.Filter("T_key", T_key).Filter("T_State", 1).One(&r)
	return r, e
}
