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

package mtpcache

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

var (
	vDicCurrency = enumdicitem{data: map[int32]string{}, nType: 2}
	vDic         = enumdicitem{data: map[int32]string{}, nType: 1}
	vDicCardName = enumdicitem{data: map[int32]string{}, nType: 3}
)

// IGetEnumdicName 获取字典名称接口
type IGetEnumdicName interface {
	get(int32) string
	load()
}

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

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

func (r *enumdicitem) buildSql() string {
	var sqlId utils.SQLVal = "select t.enumitemname, t.enumdicname" +
		"  from enumdicitem t" +
		" where t.enumitemstatus = 1"
	sqlId.AndEx("t.enumdiccode", "goodsunit", r.nType == 1)
	sqlId.AndEx("t.enumdiccode", "currency", r.nType == 2)
	sqlId.AndEx("t.enumdiccode", "certificatetype", r.nType == 3)
	return sqlId.String()
}

func init() {
	go func() {
		time.Sleep(time.Second * 6)
		vDicCurrency.load()
		vDic.load()
		vDicCardName.load()
	}()
}

// 加载数据
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
	}

	sData := make([]enumData, 0)
	s := e.SQL(r.buildSql())
	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 ""
}

// getDicEnumName 获取字典名称
func getDicEnumName(obj IGetEnumdicName, id int32) string {
	if id <= 0 {
		return ""
	}
	if v := obj.get(id); v != "" {
		return v
	} else {
		obj.load()
	}

	return obj.get(id)
}

// GetEnumDicitemName 获取商品单位枚举名称
func GetEnumDicitemName(id int32) string {
	return getDicEnumName(&vDic, id)
}

// GetCurrencyName 获取币种名称
func GetCurrencyName(id int32) string {
	return getDicEnumName(&vDicCurrency, id)
}

// GetCardName 获取卡类型名称
func GetCardName(cardId int32) string {
	return getDicEnumName(&vDicCardName, cardId)
}
