package resolve

import (
	"time"

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

const (
	cacheSize = 1024
	lifespan  = 60 * time.Second
)

type mortalCache struct {
	cache *lru.Cache
}

type cacheEntry struct {
	expired time.Time
	value   string
}

func newCache() (*mortalCache, error) {
	c, err := lru.New(cacheSize)
	if err != nil {
		return nil, err
	}
	return &mortalCache{
		cache: c,
	}, nil
}

func (c *mortalCache) Get(key string) (name string, ok bool) {
	value, ok := c.cache.Get(key)
	if !ok {
		return
	}
	entry, ok := value.(cacheEntry)
	if !ok {
		return
	}
	if entry.expired.Before(time.Now()) {
		c.cache.Remove(key)
		return name, false
	}
	return entry.value, true
}

func (c *mortalCache) Set(key string, name string) {
	expired := time.Now().Add(lifespan)
	c.cache.Add(
		key,
		cacheEntry{expired: expired, value: name},
	)
}
