package cache

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
	"log-server/global"
	"time"
)

type Cache struct {
}

func (s *Cache) DelBatheHsCache(ctx context.Context, key string) (err error) {
	keys, err := global.GVA_REDIS.HKeys(ctx, key).Result()
	if err != nil {
		if err == redis.Nil {
			return nil
		}
		return
	}
	for _, v := range keys {
		global.GVA_REDIS.HDel(ctx, key, v)
	}
	return
}

func (s *Cache) DelBatheCache(ctx context.Context, key string) (err error) {
	keys, err := global.GVA_REDIS.Keys(ctx, key).Result()
	if err != nil {
		if err == redis.Nil {
			return nil
		}
		return
	}
	for _, v := range keys {
		fmt.Println(v)
		global.GVA_REDIS.Del(ctx, v)
	}
	return
}

func (s *Cache) GetCacheKeys(ctx context.Context, keys string) (key []string, err error) {
	key, err = global.GVA_REDIS.Keys(ctx, keys).Result()
	return
}

func (s *Cache) SetCacheNum(ctx context.Context, key string) (err error) {
	bl, err := s.ExistsKey(ctx, key)
	if err != nil {
		return err
	}
	if !bl {
		err = global.GVA_REDIS.Set(ctx, key, 1, time.Hour*48).Err()
		return err
	} else {
		err = global.GVA_REDIS.Incr(ctx, key).Err()
		return err
	}
}

func (s *Cache) SetCacheStr(ctx context.Context, key string, value interface{}) (err error) {
	err = global.GVA_REDIS.Set(ctx, key, value, time.Hour*30).Err()
	return err
}

func (s *Cache) GetCacheNum(ctx context.Context, key string) (num int, err error) {
	num, err = global.GVA_REDIS.Get(ctx, key).Int()
	if err != nil {
		if err == redis.Nil {
			return 0, nil
		}
		return 0, err
	}
	return num, err
}

func (s *Cache) GetCacheStr(ctx context.Context, key string) (str string, err error) {
	str, err = global.GVA_REDIS.Get(ctx, key).Result()
	if err != nil {
		if err == redis.Nil {
			return "", nil
		}
		return "", err
	}
	return str, err
}

func (s *Cache) ExistsKey(ctx context.Context, key string) (bool, error) {
	isNull, err := global.GVA_REDIS.Exists(ctx, key).Result()
	if err != nil {
		return false, err
	}
	if isNull == 0 {
		return false, nil
	} else {
		return true, nil
	}
}
