package cache

import (
	"encoding/json"
	"github.com/gomodule/redigo/redis"
	"sec-cycle-scan/common"
)

func wrapCacheKey(key string) string {
	return "sca_task-report:" + key
}

func GetRedisPool() *redis.Pool {
	return common.RedisConnPool
}

func getRedis() (redis.Conn, error) {
	conn := common.RedisConnPool.Get()
	err := conn.Err()
	return conn, err
}

func Set(key string, data interface{}, arg ...interface{}) (err error) {
	var (
		bytes  []byte
		conn   redis.Conn
		expire = 60 * 60 * 24 * 30
	)
	//key = wrapCacheKey(key)

	if conn, err = getRedis(); err != nil {
		return
	}
	defer func(conn redis.Conn) {
		_ = conn.Close()
	}(conn)

	if bytes, err = json.Marshal(data); err != nil {
		return
	}
	if _, err = conn.Do("set", key, string(bytes)); err != nil {
		return
	}

	if len(arg) == 1 {
		if v, ok := arg[0].(int); ok {
			expire = v
		}
	}

	if _, err = conn.Do("EXPIRE", key, expire); err != nil {
		return
	}
	return
}

func SetString(key string, data string, arg ...interface{}) (err error) {
	var (
		conn   redis.Conn
		expire = 60 * 60 * 24 * 1000
	)
	//key = wrapCacheKey(key)

	if conn, err = getRedis(); err != nil {
		return
	}
	defer func(conn redis.Conn) {
		_ = conn.Close()
	}(conn)

	if _, err = conn.Do("set", key, data); err != nil {
		return
	}

	if len(arg) == 1 {
		if v, ok := arg[0].(int); ok {
			expire = v
		}
	}

	if _, err = conn.Do("EXPIRE", key, expire); err != nil {
		return
	}
	return
}

func CleanCache(key string) (err error) {
	common.LOG.Info("CleanCache:" + key)
	var (
		conn redis.Conn
	)
	//key = wrapCacheKey(key)

	if conn, err = getRedis(); err != nil {
		return
	}
	defer func(conn redis.Conn) {
		_ = conn.Close()
	}(conn)

	if _, err = conn.Do("del", key); err != nil {
		return
	}

	return
}

func GetCache(key string) (r string, err error) {

	var (
		conn redis.Conn
	)
	//key = wrapCacheKey(key)
	common.LOG.Info("GetCache:" + key)
	if conn, err = getRedis(); err != nil {
		return
	}

	defer func(conn redis.Conn) {
		_ = conn.Close()
	}(conn)

	r, err = redis.String(conn.Do("GET", key))
	if err != nil {
		if err == redis.ErrNil {
			return "", nil
		}
		return
	}
	return
}
