package cache

import (
	"fmt"
	"gitea.com/taozitaozi/gredis"
	"github.com/go-redis/redis/v8"
	"net/url"
	"strings"
	"ultone/internal/opt"
	"ultone/internal/tool"
)

func Init() error {

	var (
		err error
	)

	strs := strings.Split(opt.Cfg.Cache.Uri, "::")

	switch strs[0] {
	case "memory":
		gc := gredis.NewGredis(1024 * 1024)
		Client = &_mem{client: gc}
	case "lru":
		if Client, err = newLRUCache(); err != nil {
			return err
		}
	case "redis":
		var (
			ins *url.URL
			err error
		)

		if len(strs) != 2 {
			return fmt.Errorf("cache.Init: invalid cache uri: %s", opt.Cfg.Cache.Uri)
		}

		uri := strs[1]

		if !strings.Contains(uri, "://") {
			uri = fmt.Sprintf("redis://%s", uri)
		}

		if ins, err = url.Parse(uri); err != nil {
			return fmt.Errorf("cache.Init: url parse cache uri: %s, err: %s", opt.Cfg.Cache.Uri, err.Error())
		}

		addr := ins.Host
		username := ins.User.Username()
		password, _ := ins.User.Password()

		var rc *redis.Client
		rc = redis.NewClient(&redis.Options{
			Addr:     addr,
			Username: username,
			Password: password,
		})

		if err = rc.Ping(tool.Timeout(5)).Err(); err != nil {
			return fmt.Errorf("cache.Init: redis ping err: %s", err.Error())
		}

		Client = &_redis{client: rc}
	default:
		return fmt.Errorf("cache type %s not support", strs[0])
	}

	return nil
}