package cacheApi

import (
	"epur-pay/model"
	"epur-pay/pkg/rds"
	"epur-pay/pkg/utils"
	"github.com/muesli/cache2go"
	"time"
)

type User struct {
	Data      *cache2go.CacheTable
	duplicate *User
}

func (p *User) Refresh() *User {
	p.duplicate = &User{}
	p.duplicate.Data = cache2go.Cache("userList")
	return p.duplicate
}

func (p *User) RefreshRow(u *model.User) *model.User {
	p.Data.Add(u.Uid, time.Duration(7*24*60*60)*time.Second, u)
	return u
}

func (p *User) RefreshBatchRow(u ...*model.User) {
	for index, _ := range u {
		p.RefreshRow(u[index])
	}
}

func (p *User) RefreshSelectRow(uid int64) *model.User {
	user := model.User{}
	utils.DbErrSkipRecordNotFound(rds.DB.Raw(`select * from user where uid = ?`, uid).Scan(&user).Error)

	if user.Uid <= 0 {
		return nil
	}
	// 获取用户拥有的权限
	utils.DbErrSkipRecordNotFound(rds.DB.Table(model.UserRole{}.TableName()).Select(`role_id`).
		Where(`uid = ?`, user.Uid).Scan(&user.RoleIds).Error)

	// 刷新缓存
	p.RefreshRow(&user)
	return &user
}

func (p *User) RefreshSelectBatchRow(uid ...int64) {
	for _, item := range uid {
		p.RefreshSelectRow(item)
	}
}

func (p *User) Get(uid int64) *model.User {
	if row, err := p.Data.Value(uid); err == nil {
		return row.Data().(*model.User)
	} else {
		return p.RefreshSelectRow(uid)
	}
}