package Account

import (
	"FollowUp_Notice/lib"
	"errors"
	"fmt"
	"github.com/astaxie/beego/logs"
	"github.com/beego/beego/v2/adapter/orm"
	orm2 "github.com/beego/beego/v2/client/orm"
	"time"
)

type User struct {
	Id               int       `orm:"column(ID);size(11);auto;pk"`
	T_uuid           string    `orm:"size(32);null"`                                         //
	T_user           string    `orm:"size(256);null"`                                        //
	T_pass           string    `orm:"size(256);null"`                                        //
	T_phone          string    `orm:"size(256);null"`                                        // 电话号码
	T_template_id    string    `orm:"size(256);null"`                                        // 短信模板id
	T_money          float32   `orm:"digits(12);decimals(2)"`                                // 余额
	T_arrears_notice int       `orm:"size(200);default(1)"`                                  // 欠费通知 1继续通知  2终止通知
	T_State          int       `orm:"size(200);default(1)"`                                  // 0删除  1 启用 2 停用
	CreateTime       time.Time `orm:"column(create_time);type(timestamp);null;auto_now_add"` //auto_now 每次 model 保存时都会对时间自动更新
	UpdateTime       time.Time `orm:"column(update_time);type(timestamp);null;auto_now"`     //auto_now_add 第一次保存时才设置时间
}
type User_R struct {
	Id               int
	T_uuid           string
	T_user           string
	T_phone          string // 电话号码
	T_template_id    string
	T_money          float32
	T_arrears_notice int
	T_State          int // 1 启用 2 停用
	CreateTime       string
}

var User_r *User

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

func init() {
	//注册模型
	orm.RegisterModel(new(User))
}
func UserToUser_R(r User) (m User_R) {
	m.Id = r.Id
	m.T_uuid = r.T_uuid
	m.T_user = r.T_user
	m.T_phone = r.T_phone
	m.T_template_id = r.T_template_id
	m.T_money = r.T_money
	m.T_arrears_notice = r.T_arrears_notice
	m.T_State = r.T_State
	m.CreateTime = r.CreateTime.Format("2006-01-02 15:04:05")
	return
}

// 验证登录
func Read_User_verification(T_user string, T_pass string) (err error, r User) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(User))
	err = qs.Filter("T_user", T_user).Filter("T_pass", T_pass).Filter("T_State__gt", 0).One(&r)

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

// 添加
func Add_User(r User) (id int64, err error) {
	o := orm.NewOrm()

	//生成编号
	rand_x := 0
	for true {
		r.T_uuid = lib.GetRandstring(32, "", int64(rand_x)) // 1,336,336
		err = o.Read(&r, "T_uuid")                          // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
		if err != nil {
			break
		}
		rand_x += 1
	}
	// 查看是否重复
	err = o.Read(&r, "T_user") // o.Read(&r,"Tokey") 如果不是 主键 就得指定字段名
	if err == nil {
		return 0, errors.New("T_user !!!!")
	}

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

// 获取 ByT_uuId
func Read_User_ByT_uuid(T_uuid string) (r User, err error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(User))
	err = qs.Filter("T_uuid", T_uuid).Filter("T_State__gt", 0).One(&r)
	if err != nil {
		logs.Error(lib.FuncName(), err)
	}
	return
}

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

// 修改
func Update_User(m User, cols ...string) error {
	o := orm.NewOrm()
	num, err := o.Update(&m, cols...)
	if err != nil {
		logs.Error(lib.FuncName(), err)
		return err
	}
	fmt.Println("Number of records updated in database:", num)
	return nil
}

// 删除
func Delete_User(v User) 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_User_List(T_name string, page, page_z int) (r_ []User_R, cnt int64) {
	o := orm.NewOrm()
	// 也可以直接使用 Model 结构体作为表名
	qs := o.QueryTable(new(User))
	var offset int64
	if page <= 1 {
		offset = 0
	} else {
		offset = int64((page - 1) * page_z)
	}

	// 过滤
	cond := orm.NewCondition()
	cond = cond.And("T_State__gt", 0) //.And("T_State", 1) .AndNot("status__in", 1).Or("profile__age__gt", 2000)

	if len(T_name) > 0 {
		//cond1.AndCond(cond.And("T_class", class))
		cond = cond.And("T_user__icontains", T_name)
	}

	// 查询
	var r []User
	var err error
	if page_z == 9999 {
		_, err = qs.SetCond((*orm2.Condition)(cond)).OrderBy("-Id").All(&r)
	} else {
		_, err = qs.Limit(page_z, offset).SetCond((*orm2.Condition)(cond)).OrderBy("-Id").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_, UserToUser_R(v))
	}

	return r_, cnt
}
