/**
* @Author: zou.yingbin
* @Create  : 2021/3/10 14:13
* @Modify  : 2021/3/10 14:13
 */

package mtpcache

import (
	"mtp2_if/db"
	"mtp2_if/logger"
	"sync"
	"time"
)

var vSysMgr sysMgr

// sysMgr 管理员
type sysMgr struct {
	mtx  sync.RWMutex         // 锁
	data map[int64]sysMgrData // 数据[AUTOID]sysMgrData
	last time.Time
}

// sysMgrData 管理员数据
type sysMgrData struct {
	AUTOID    int64  `json:"autoid"  xorm:"'AUTOID'"`       // 管理员ID
	LOGINCODE string `json:"logincode"  xorm:"'LOGINCODE'"` // 管理员登录代码
	USERNAME  string `json:"username"  xorm:"'USERNAME'"`   // 管理员登录名称
}

func init() {
	go func() {
		time.Sleep(time.Second * 5)
		vSysMgr.load()
	}()
}

func (r *sysMgr) load() {
	now := time.Now()
	// 间隔3秒以上才重新加载
	if d := now.Sub(r.last); d.Seconds() < 3 {
		return
	}

	r.mtx.Lock()
	defer r.mtx.Unlock()
	e := db.GetEngine()
	if e == nil {
		return
	}

	sqlId := "select t.autoid, t.logincode, t.username from systemmanager t"

	sData := make([]sysMgrData, 0)
	s := e.SQL(sqlId)
	if err := s.Find(&sData); err != nil {
		logger.GetLogger().Errorf("cache load usrname, %v", err)
	} else {
		r.data = make(map[int64]sysMgrData)
		for i := range sData {
			r.data[sData[i].AUTOID] = sData[i]
		}
		r.last = time.Now()
	}
}

func (r *sysMgr) logincode(autoId int64) string {
	r.mtx.RLock()
	defer r.mtx.RUnlock()

	if r.data == nil {
		return ""
	}

	if v, ok := r.data[autoId]; ok {
		return v.LOGINCODE
	}
	return ""
}

// GetSystemmangerLoginCode 获取管理员登录代码
// 参数 autoId 管理员id
func GetSystemmangerLoginCode(autoId int64) string {
	if v := vSysMgr.logincode(autoId); v != "" {
		return v
	} else {
		vSysMgr.load()
	}
	return vSysMgr.logincode(autoId)
}
