package redis

import (
	"context"
	"crypto/tls"
	"fmt"
	"sync"

	"go.uber.org/zap"

	"github.com/go-redis/redis/v8"
	"github.com/tidbcloud/account/commons/config"
	"github.com/tidbcloud/tiinf/monitor/tilog"
)

var RedisClient *redis.Client
var onceRedisClient sync.Once

func InitRedisClient() (*redis.Client, error) {
	centralConfig, err := config.NewConfig()
	if err != nil {
		return nil, err
	}
	redisClient, err := NewRedisClient(centralConfig)
	return redisClient, err
}

func NewRedisClient(centralConfig *config.CentralConfig) (*redis.Client, error) {
	gatewayConfig := centralConfig.OpenAPIGatewayConfig
	ctx := context.Background()

	tilog.Info(ctx, "Initializing global redis connection")
	client := redis.NewClient(&redis.Options{
		Addr:     gatewayConfig.OpenAPIGatewayRedisMasterAddress,
		Password: gatewayConfig.OpenAPIGatewayRedisPassword,
		TLSConfig: &tls.Config{
			InsecureSkipVerify: true,
		},
	})

	return client, nil
}
func GetRedisClient() *redis.Client {

	onceRedisClient.Do(func() {
		var err error
		if RedisClient == nil {
			RedisClient, err = InitRedisClient()
			if err != nil {
				tilog.PlainInfo(fmt.Sprintf("failed to GetRedisClient: %s", err))
			}
			tilog.Info(context.Background(), "Init  RedisClient Success", zap.Any("RedisClient", RedisClient))
		}

	})
	tilog.Info(context.Background(), "Get  RedisClient Success", zap.Any("RedisClient", RedisClient))
	return RedisClient
}
