package firehose

import (
	"sync"
	"time"
)

type ttlItem struct {
	value      float64
	lastAccess int64
}

type TTLMap struct {
	m  map[string]*ttlItem
	mu sync.Mutex
}

func NewTTLMap(maxTTL int) (m *TTLMap) {
	m = &TTLMap{m: make(map[string]*ttlItem)}
	go func() {
		for now := range time.Tick(30 * time.Second) {
			m.mu.Lock()
			for k, v := range m.m {
				if now.Unix()-v.lastAccess > int64(maxTTL) {
					delete(m.m, k)
				}
			}
			m.mu.Unlock()
		}
	}()
	return
}

func (m *TTLMap) Len() int {
	return len(m.m)
}

func (m *TTLMap) Put(k string, v float64) {
	m.mu.Lock()
	m.m[k] = &ttlItem{
		value:      v,
		lastAccess: time.Now().Unix(),
	}
	m.mu.Unlock()
}

func (m *TTLMap) Get(k string) (v float64, ok bool) {
	m.mu.Lock()
	var it *ttlItem
	it, ok = m.m[k]
	if ok {
		v = it.value
		it.lastAccess = time.Now().Unix()
	}
	m.mu.Unlock()
	return
}
