package cache

import (
	"time"

	"github.com/hashicorp/golang-lru"
)

// single instance of a thread-safe lru cache
var cache *lru.Cache

func init() {
	var err error
	cache, err = lru.New(2048)
	if err != nil {
		panic(err)
	}
}

// item is a simple wrapper around a cacheable object
// that tracks the ttl for item expiration in the cache.
type item struct {
	value interface{}
	ttl   time.Time
}

// set adds the key value pair to the cache with the
// specified ttl expiration.
func set(key string, value interface{}, ttl int64) {
	ttlv := time.Now().Add(time.Duration(ttl) * time.Second)
	cache.Add(key, &item{value, ttlv})
}

// get gets the value from the cache for the given key.
// if the value does not exist, a nil value is returned.
// if the value exists, but is expired, the value is returned
// with a bool flag set to true.
func get(key string) (interface{}, bool) {
	v, ok := cache.Get(key)
	if !ok {
		return nil, false
	}
	vv := v.(*item)
	expired := vv.ttl.Before(time.Now())
	if expired {
		cache.Remove(key)
	}
	return vv.value, expired
}