package cachebackend

import (
	"time"

	"github.com/prometheus/client_golang/prometheus"
)

// There's only going to be one cache per server process in production
// so we can just use globals for instrumentation metrics.
var (
	cacheHits = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "accountserver_cache_hits",
		Help: "Cache hit counter",
	})
	cacheMisses = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "accountserver_cache_misses",
		Help: "Cache miss counter",
	})
	cacheWrites = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "accountserver_cache_writes",
		Help: "Cache write counter",
	})
	cacheDeletes = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "accountserver_cache_deletes",
		Help: "Cache delete counter",
	})
)

func init() {
	prometheus.MustRegister(cacheHits)
	prometheus.MustRegister(cacheMisses)
	prometheus.MustRegister(cacheWrites)
	prometheus.MustRegister(cacheDeletes)
}

type instrumentedCache struct {
	internalCache
}

func instrument(c internalCache) *instrumentedCache {
	return &instrumentedCache{c}
}

func (c *instrumentedCache) Get(key string) (interface{}, bool) {
	res, ok := c.internalCache.Get(key)
	if ok {
		cacheHits.Inc()
	} else {
		cacheMisses.Inc()
	}
	return res, ok
}

func (c *instrumentedCache) Set(key string, value interface{}, d time.Duration) {
	c.internalCache.Set(key, value, d)
	cacheWrites.Inc()
}

func (c *instrumentedCache) Delete(username string) {
	c.internalCache.Delete(username)
	cacheDeletes.Inc()
}