package stats

import (
	"time"

	"veyron/lib/stats/histogram"
)

// NewHistogram creates a new Histogram StatsObject with the given name and
// returns a pointer to it.
func NewHistogram(name string, opts histogram.Options) *histogram.Histogram {
	lock.Lock()
	defer lock.Unlock()

	node := findNodeLocked(name, true)
	h := histogram.New(opts)
	hw := &histogramWrapper{h}
	node.object = hw

	addHistogramChild(node, name+"/delta1h", hw, time.Hour, hw.Delta1h)
	addHistogramChild(node, name+"/delta10m", hw, 10*time.Minute, hw.Delta10m)
	addHistogramChild(node, name+"/delta1m", hw, time.Minute, hw.Delta1m)
	return h
}

type histogramWrapper struct {
	h *histogram.Histogram
}

func (hw histogramWrapper) LastUpdate() time.Time {
	return hw.h.LastUpdate()
}

func (hw histogramWrapper) Value() interface{} {
	return hw.h.Value()
}

func (hw histogramWrapper) Delta1h() interface{} {
	return hw.h.Delta1h()
}

func (hw histogramWrapper) Delta10m() interface{} {
	return hw.h.Delta10m()
}

func (hw histogramWrapper) Delta1m() interface{} {
	return hw.h.Delta1m()
}

type histogramChild struct {
	h      *histogramWrapper
	period time.Duration
	value  func() interface{}
}

func (hc histogramChild) LastUpdate() time.Time {
	now := time.Now()
	if t := hc.h.LastUpdate().Add(hc.period); t.Before(now) {
		return t
	}
	return now
}

func (hc histogramChild) Value() interface{} {
	return hc.value()
}

func addHistogramChild(parent *node, name string, h *histogramWrapper, period time.Duration, value func() interface{}) {
	child := findNodeLocked(name, true)
	child.object = &histogramChild{h, period, value}
}
