package infra

import (
	"context"
	"sync"
	"time"

	"go.uber.org/zap"

	"github.com/spf13/viper"

	"github.com/patrickmn/go-cache"
	"github.com/tidbcloud/tiinf/monitor/tilog"
)

var cacheObj *cache.Cache
var cacheOnce sync.Once

var expireTime = 120 * time.Minute
var cleanupInterval = 10 * time.Minute

func GetClusterCache(ctx context.Context) *cache.Cache {
	cacheOnce.Do(func() {
		expire := viper.GetDuration("cache.cluster.expire")
		a := viper.GetDuration("cache.cluster.cleanupInterval")

		if expire != 0 {
			expireTime = expire * time.Minute
			cleanupInterval = a * time.Minute
		}
		cacheObj = cache.New(expireTime, cleanupInterval)
		tilog.Info(ctx, "init cache obj,", zap.Any("expire", expireTime), zap.Any("cleanupInterval", cleanupInterval))

	})
	return cacheObj
}
func DelAllClusterCache(ctx context.Context) {
	for {
		time.Sleep(time.Minute * 1) // delay after each minute
		flush := viper.GetBool("cache.cluster.flush")
		if flush {
			c := GetClusterCache(ctx)
			c.Flush()
			tilog.Info(ctx, "cache.cluster.flush=true, delete all cluster cache")
		}
	}

}
