/**
* @Author: zou.yingbin
* @Create  : 2021/1/13 10:51
* @Modify  : 2021/1/13 10:51
 */

package mtpcache

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

var vUser userName

type userName struct {
	mtx  sync.RWMutex       // 锁
	data map[int64]userData // 数据[loginId]userData
	last time.Time
}

type userData struct {
	USERID        int64  `json:"userid"  xorm:"'USERID'"`               // 用户id
	RELATEDUSERID int64  `json:"relateduserid"  xorm:"'RELATEDUSERID'"` // 关联用户id
	LOGINID       int64  `json:"LOGINID"  xorm:"'LOGINID'"`             // 登录ID
	LOGINCODE     string `json:"LOGINCODE"  xorm:"'LOGINCODE'"`         // 登录代码
	ACCOUNTNAME   string `json:"accountname"  xorm:"'ACCOUNTNAME'"`     // 用户名字
}

func init() {
	go func() {
		time.Sleep(time.Second * 2)
		vUser.load()
	}()
}

// 加载数据
func (r *userName) 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
	}

	var sqlId utils.SQLVal = "select t.userid, t.relateduserid, t.loginid, t.logincode, t.accountname" +
		"  from loginaccount t" +
		" where 1 = 1"

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

func (r *userName) name(loginId int64) string {
	r.mtx.RLock()
	defer r.mtx.RUnlock()

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

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

func (r *userName) loginCode(loginId int64) string {
	r.mtx.RLock()
	defer r.mtx.RUnlock()

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

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

func (r *userName) logincodeByUserId(userId int64) string {
	// 只取一个
	r.mtx.RLock()
	defer r.mtx.RUnlock()
	for _, v := range r.data {
		if v.USERID == userId {
			return v.LOGINCODE
		}
	}

	return ""
}

// GetLoginCodeByLoginId 根据登录ID获取登录代码
func GetLoginCodeByLoginId(loginId int64) string {
	if v := vUser.loginCode(loginId); v != "" {
		return v
	} else {
		vUser.load()
	}

	return vUser.loginCode(loginId)
}

// GetLoginCodeByUserId 获取登录代码
func GetLoginCodeByUserId(userId int64) string {
	if v := vUser.logincodeByUserId(userId); v != "" {
		return v
	} else {
		vUser.load()
	}
	return vUser.logincodeByUserId(userId)
}
