package cache

import (
	cacheApi "epur-pay/cache/api"
	"epur-pay/model"
	"epur-pay/pkg/config"
	"epur-pay/pkg/limit"
	"github.com/oschwald/geoip2-golang"
	"time"
)

var Global *GlobalServerCache

/*
	全局公用缓存层
*/

type GlobalServerCache struct {
	ProjectInitStatus bool           // 项目是否初始化完成
	IpLocation        *geoip2.Reader // IP库
	DefaultTimeZone   *time.Location // 默认时区
	LimitRouter       struct {
		RuleKey string
		Rule    *limit.LimitConfRules
		Api     limit.LimiterIface
	} // 限流器
	Routers []*model.RouterMethod
	Caches  struct {
		Config         *cacheApi.Config
		Language       *cacheApi.Language
		Version        *cacheApi.Version
		RolePermission *cacheApi.RolePermission // 角色菜单权限
		User           *cacheApi.User
		BlackList      *cacheApi.BlackList // 黑名单
	}
}

func New() {
	Global = &GlobalServerCache{}
	Global.CacheDataInit()
}

func (g *GlobalServerCache) CacheDataInit() {

	g.DefaultTimeZone, _ = time.LoadLocation("Asia/Shanghai")
	g.LimitRouter.Rule = &limit.LimitConfRules{
		Rules: make(map[string]*limit.LimitOpt),
	}
	g.Caches.Config = (&cacheApi.Config{}).Refresh()
	g.Caches.Language = (&cacheApi.Language{}).Refresh()
	g.Caches.Version = (&cacheApi.Version{}).Refresh()
	g.Caches.BlackList = (&cacheApi.BlackList{}).Refresh()
	g.Caches.RolePermission = (&cacheApi.RolePermission{}).Refresh()
	g.Caches.User = (&cacheApi.User{}).Refresh()

	if config.Cf.Common.RunMode == "release" {
		NewIpLocation()
	}

	go func() {
		g.ProjectInitStatus = true
	}()
}