package global

import (
	"sun-panel/lib/cache"
	"sun-panel/structs"
	"time"
)

// 缓存驱动
const (
	CACHE_DRIVE_REDIS  = "redis"
	CACHE_DRIVE_MEMORY = "memory"
)

// 创建一个缓存区
// | defaultExpiration:默认过期时长
// | cleanupInterval:清理过期的key间隔 0.不清理
// | name:缓存名称
func NewCache[T any](defaultExpiration time.Duration, cleanupInterval time.Duration, name string) cache.Cacher[T] {
	drive := Config.GetValueString("base", "cache_drive")
	if drive == "" {
		drive = CACHE_DRIVE_MEMORY
	}
	var cacher cache.Cacher[T]
	Logger.Debugln("缓存驱动:", drive)
	switch drive {
	case CACHE_DRIVE_MEMORY:
		cacher = cache.NewGoCache[T](defaultExpiration, cleanupInterval)
	case CACHE_DRIVE_REDIS:
		redisConfig := structs.IniConfigRedis{}
		if err := Config.GetSection("redis", &redisConfig); err != nil {
			redisConfig.Prefix = ""
		}
		cacher = cache.NewRedisCache[T](RedisDb, redisConfig.Prefix+name, defaultExpiration, cleanupInterval)
	}

	return cacher
}