// Package cache
// @Link  https://github.com/bufanyun/hotgo
// @Copyright  Copyright (c) 2023 HotGo CLI
// @Author  Ms <133814250@qq.com>
// @License  https://github.com/bufanyun/hotgo/blob/master/LICENSE
package cache

import (
	"context"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gcache"
	"github.com/gogf/gf/v2/os/gfile"
	"hotgo/internal/library/cache/file"
	"hotgo/internal/model"
	"hotgo/internal/service"
)

// cache 缓存驱动
var cache *gcache.Cache

// Instance 缓存实例
func Instance() *gcache.Cache {
	if cache == nil {
		panic("cache uninitialized.")
	}
	return cache
}

// SetAdapter 设置缓存适配器
func SetAdapter(ctx context.Context) {
	var adapter gcache.Adapter
	conf, err := service.SysConfig().GetLoadCache(ctx)
	if err != nil {
		g.Log().Fatalf(ctx, "cache init err:%+v", err)
		return
	}

	if conf == nil {
		conf = new(model.CacheConfig)
		g.Log().Info(ctx, "no cache driver is configured. default memory cache is used.")
	}

	switch conf.Adapter {
	case "redis":
		adapter = gcache.NewAdapterRedis(g.Redis())
	case "file":
		if conf.FileDir == "" {
			g.Log().Fatal(ctx, "file path must be configured for file caching.")
			return
		}

		if !gfile.Exists(conf.FileDir) {
			if err := gfile.Mkdir(conf.FileDir); err != nil {
				g.Log().Fatalf(ctx, "failed to create the cache directory. procedure, err:%+v", err)
				return
			}
		}
		adapter = file.NewAdapterFile(conf.FileDir)
	default:
		adapter = gcache.NewAdapterMemory()
	}

	// 数据库缓存，默认和通用缓冲驱动一致，如果你不想使用默认的，可以自行调整
	g.DB().GetCache().SetAdapter(adapter)

	// 通用缓存
	cache = gcache.New()
	cache.SetAdapter(adapter)
}
