package rpcstore

import (
	"sync"
	"time"

	"github.com/VividCortex/ewma"
)

// defaultSpeedScore - initial value in Kb/s, it should be relatively high to test fresh client soon
const defaultSpeedScore = 10 * 1024

func newStat() *stat {
	s := &stat{
		ewma:      &ewma.SimpleEWMA{},
		lastUsage: time.Now(),
	}
	s.ewma.Set(float64(defaultSpeedScore))
	return s
}

// stat calculates EWMA download/upload speed
type stat struct {
	// TODO: rewrite to atomics
	ewma      *ewma.SimpleEWMA
	mu        sync.Mutex
	lastUsage time.Time
}

// Score returns average download/upload speed in Kb/s
func (s *stat) Score() float64 {
	s.mu.Lock()
	defer s.mu.Unlock()
	return s.ewma.Value()
}

// Add adds new sample to the stat
func (s *stat) Add(startTime time.Time, byteLen int) {
	s.mu.Lock()
	defer s.mu.Unlock()
	dur := time.Since(startTime).Seconds()
	s.ewma.Add(float64(byteLen) / 1024 / dur)
	s.lastUsage = time.Now()
}

func (s *stat) LastUsage() time.Time {
	s.mu.Lock()
	defer s.mu.Unlock()
	return s.lastUsage
}

func (s *stat) UpdateLastUsage() {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.lastUsage = time.Now()
}
