/**
* @Author: zou.yingbin
* @Create  : 2021/6/3 15:14
* @Modify  : 2021/6/3 15:14
 */

package mtpcache

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

var vDivisionMgr DivisionMgr

// DivisionMgr 行政区域缓存
type DivisionMgr struct {
	mtx  sync.RWMutex
	data map[int64]Division
	last time.Time
}

// Division 行政区域表
type Division struct {
	Autoid        int64     `json:"autoid"  xorm:"'AUTOID'" binding:"required"`             // 自增ID
	Divisioncode  string    `json:"divisioncode"  xorm:"'DIVISIONCODE'" binding:"required"` // 行政代码
	Shortcode     string    `json:"shortcode"  xorm:"'SHORTCODE'"`                          // 地区简码
	Parentcode    string    `json:"parentcode"  xorm:"'PARENTCODE'"`                        // 上级行政代码
	Divisionlevel string    `json:"divisionlevel"  xorm:"'DIVISIONLEVEL'"`                  // 行政级别
	Divisionname  string    `json:"divisionname"  xorm:"'DIVISIONNAME'"`                    // 行政名称
	Pathname      string    `json:"pathname"  xorm:"'PATHNAME'"`                            // 路径名称
	Separablename string    `json:"separablename"  xorm:"'SEPARABLENAME'"`                  // 可拆分的全称
	Postcode      string    `json:"postcode"  xorm:"'POSTCODE'"`                            // 邮政编码
	Modifytime    time.Time `json:"modifytime"  xorm:"'MODIFYTIME'"`                        // 修改时间
	Modifierid    int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                        // 修改人
}

// TableName is DIVISION
func (Division) TableName() string {
	return "DIVISION"
}

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

func (r *DivisionMgr) load() {
	now := time.Now()
	// 间隔3秒以上才重新加载
	if d := now.Sub(r.last); d.Seconds() < 3 {
		return
	}
	r.mtx.Lock()
	defer r.mtx.Unlock()
	engine := db.GetEngine()
	if engine == nil {
		return
	}
	divisions := make([]Division, 0)
	if err := engine.Find(&divisions); err == nil {
		r.data = map[int64]Division{}
		for i := range divisions {
			r.data[divisions[i].Autoid] = divisions[i]
		}
	}
}

// Name 获取行政区名称
func (r *DivisionMgr) Name(Id int64) string {
	r.mtx.RLock()
	defer r.mtx.RUnlock()
	if d, ok := r.data[Id]; ok {
		return d.Divisionname
	}
	return ""
}

// 获取行政区名称
func GetDivisionName(Id int32) string {
	if Id <= 0 {
		return ""
	}
	if strName := vDivisionMgr.Name(int64(Id)); strName != "" {
		return strName
	}
	vDivisionMgr.load()
	return vDivisionMgr.Name(int64(Id))
}
