/**
* @Author: zou.yingbin
* @Create  : 2021/1/13 14:07
* @Modify  : 2021/1/13 14:07
 */

package mtpcache

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

var vUsrMgr userAccountMgr

// 用户缓存
type userAccountMgr struct {
	mtx  sync.RWMutex     //锁
	data map[int64]usrAccData //数据[userId]accountName
	last time.Time
}

type usrAccData struct {
	USERID       int64  `json:"userid"  xorm:"'USERID'"`             //用户ID
	USERTYPE     int32  `json:"usertype"  xorm:"'USERTYPE'"`         //账户类型 -  1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户
	ACCOUNTNAME  string `json:"accountname"  xorm:"'ACCOUNTNAME'"`   //账户名称(机构名称)
	PARENTUSERID int32  `json:"parentuserid"  xorm:"'PARENTUSERID'"` //所属机构ID
	MEMBERUSERID int32  `json:"memberuserid"  xorm:"'MEMBERUSERID'"` //所属会员ID
}

// 加载数据
func (r *userAccountMgr) 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 USERID, USERTYPE, ACCOUNTNAME, PARENTUSERID, MEMBERUSERID from useraccount"
	sData := make([]usrAccData, 0)
	s := e.SQL(sqlId)
	if err := s.Find(&sData); err != nil {
		logger.GetLogger().Errorf("cache load useraccount, %v", err)
	} else {
		r.data = make(map[int64]usrAccData)
		for i := range sData {
			r.data[sData[i].USERID] = sData[i]
		}
		r.last = time.Now()
	}
}

func (r *userAccountMgr) get(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 ""
}

//根据UserId获取名称
func GetUserNameByUserId(userId int64) string {
	if v := vUsrMgr.get(userId); v !=""{
		return v
	}else{
		vUsrMgr.load()
	}

	return vUsrMgr.get(userId)
}