/**
* @Author: zou.yingbin
* @Create  : 2021/1/13 9:15
* @Modify  : 2021/1/13 9:15
 */

package mtpcache

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

var vDic enumdicitem

// 商品单位名称缓存
type enumdicitem struct {
	mtx  sync.RWMutex     //锁
	data map[int32]string //数据[enumitemname]enumdicname
	last time.Time
}

type enumData struct {
	ENUMITEMNAME int32  `json:"enumitemname"  xorm:"'enumitemname'"` //ID
	ENUMDICNAME  string `json:"enumdicname"  xorm:"'enumdicname'"`   //名称
}

func init() {
	vDic.data = make(map[int32]string, 0)
}

// 加载数据
func (r *enumdicitem) 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.enumitemname, t.enumdicname" +
		"  from enumdicitem t" +
		" where t.enumdiccode = 'goodsunit'" +
		"   and t.enumitemstatus = 1"
	sData := make([]enumData, 0)
	s := e.SQL(sqlId)
	if err := s.Find(&sData); err != nil {
		logger.GetLogger().Errorf("cache load enumdicitem, %v", err)
	} else {
		r.data = make(map[int32]string)
		for i := range sData {
			r.data[sData[i].ENUMITEMNAME] = sData[i].ENUMDICNAME
		}
		r.last = time.Now()
	}
}

func (r *enumdicitem) get(id int32) string {
	r.mtx.RLock()
	defer r.mtx.RUnlock()

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

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

// 获取商品单位枚举名称
func GetEnumDicitemName(id int32) string {
	if id <= 0 {
		return ""
	}
	if v := vDic.get(id); v != "" {
		return v
	} else {
		vDic.load()
	}

	return vDic.get(id)
}
