package events

import (
	"io/ioutil"
	"path"
	"testing"
	"time"

	assert "github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils"
)

func TestAggregateMetric(t *testing.T) {
	testutils.MediumTest(t)

	tmp, err := ioutil.TempDir("", "")
	assert.NoError(t, err)
	defer testutils.RemoveAll(t, tmp)

	db, err := NewEventDB(path.Join(tmp, "events.bdb"))
	assert.NoError(t, err)
	m, err := NewEventMetrics(db, "test-metrics")
	assert.NoError(t, err)

	s := "my-events"
	now := time.Now()
	k1 := now.Add(-3 * time.Second)
	v1 := 0.05
	assert.NoError(t, m.db.Insert(&Event{
		Stream:    s,
		Timestamp: k1,
		Data:      encodeEvent(v1),
	}))

	period := 20 * time.Minute
	called := false
	assert.NoError(t, m.AggregateMetric(s, nil, period, func(vs []*Event) (float64, error) {
		called = true
		assert.Equal(t, 1, len(vs))
		assert.Equal(t, v1, decodeEvent(vs[0].Data))
		return 0.0, nil
	}))
	assert.False(t, called)
	assert.NoError(t, m.updateMetrics(now))
	assert.True(t, called)
}

func TestDynamicMetric(t *testing.T) {
	testutils.MediumTest(t)

	tmp, err := ioutil.TempDir("", "")
	assert.NoError(t, err)
	defer testutils.RemoveAll(t, tmp)

	db, err := NewEventDB(path.Join(tmp, "events.bdb"))
	assert.NoError(t, err)
	m, err := NewEventMetrics(db, "test-dynamic-metrics")
	assert.NoError(t, err)

	s := "my-events"
	now := time.Now()
	k := now.Add(-5 * 20 * time.Minute)
	for i := 0; i < 20; i++ {
		v := 0.05 * float64(i)
		assert.NoError(t, m.db.Insert(&Event{
			Stream:    s,
			Timestamp: k,
			Data:      encodeEvent(v),
		}))
		k = k.Add(5 * time.Minute)
	}

	period := 100 * time.Minute
	assert.NoError(t, m.DynamicMetric(s, nil, period, func(vs []*Event) ([]map[string]string, []float64, error) {
		tags := []map[string]string{}
		vals := []float64{}
		for _, e := range vs {
			t := map[string]string{}
			v := decodeEvent(e.Data)
			if v >= 0.5 {
				t["category"] = "large"
			} else {
				t["category"] = "small"
			}
			tags = append(tags, t)
			vals = append(vals, v)
		}
		return tags, vals, nil
	}))
	assert.NoError(t, m.updateMetrics(now))

	// Ensure that we got the right dynamic metrics.
	assert.Equal(t, 2, len(m.currentDynamicMetrics))

	// Wait for the "small" events to scroll off, ensure that we deleted the
	// old metric.
	t1 := now.Add(50 * time.Minute)
	assert.NoError(t, m.updateMetrics(t1))
	assert.Equal(t, 1, len(m.currentDynamicMetrics))
}
