package cache

import (
	"fmt"
	"time"
	"github.com/Asrez/TShirtGoAPI/config"
	"github.com/go-redis/redis/v7"
)


var redisClient *redis.Client

func InitRedis(cfg *config.Config) error {
	redisClient = redis.NewClient(&redis.Options{
		Addr:               fmt.Sprintf("%s:%s", cfg.Redis.Host, cfg.Redis.Port),
		Password:           cfg.Redis.Password,
		DB:                 0,
		DialTimeout:        cfg.Redis.DialTimeout * time.Second,
		ReadTimeout:        cfg.Redis.ReadTimeout * time.Second,
		WriteTimeout:       cfg.Redis.WriteTimeout * time.Second,
		PoolSize:           cfg.Redis.PoolSize,
		PoolTimeout:        cfg.Redis.PoolTimeout,
		IdleTimeout:        500 * time.Millisecond,
		IdleCheckFrequency: cfg.Redis.IdleCheckFrequency * time.Millisecond,
	})

	_ , err := redisClient.Ping().Result()
	if err != nil {
		return err
	}
	return nil
}

func GetRedis() *redis.Client {
	return redisClient
}

func CloseRedis() {
	redisClient.Close()
}


// func Set[T any](c *redis.Client, key string, value T, duration time.Duration) error {
// 	v, err := json.Marshal(value)
// 	if err != nil {
// 		return err
// 	}
// 	return c.Set(key, v, duration).Err()
// }


// func Get[T any](c *redis.Client, key string) (T, error) {
// 	var dest T = *new(T)
// 	v, err := c.Get(key).Result()
// 	if err != nil {
// 		return dest, err
// 	}
// 	err = json.Unmarshal([]byte(v), &dest)
// 	if err != nil {
// 		return dest, err
// 	}
// 	return dest, nil
// }


func SetString(c *redis.Client, key string, value any, duration time.Duration) error {
	return c.Set(key, value, duration).Err()
  }
  
func GetString(c *redis.Client, key string) (string, error) {
	val, err := c.Get(key).Result()
	if err != nil {
	  return "", err
	}
	return val, nil
}