package cloudwatch

import (
	"sort"
	"testing"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/grafana/grafana-plugin-sdk-go/data"

	"github.com/stretchr/testify/assert"
)

func TestFrameSort(t *testing.T) {
	timeA, _ := time.Parse("2006-01-02 15:04:05.000", "2020-03-02 17:04:05.000")
	timeB, _ := time.Parse("2006-01-02 15:04:05.000", "2020-03-02 16:04:05.000")
	timeC, _ := time.Parse("2006-01-02 15:04:05.000", "2020-03-02 15:04:05.000")
	timeVals := []*time.Time{
		&timeA, &timeB, &timeC,
	}
	timeField := data.NewField("@timestamp", nil, timeVals)

	stringField := data.NewField("line", nil, []*string{
		aws.String("test message 1"),
		aws.String("test message 2"),
		aws.String("test message 3"),
	})

	numberField := data.NewField("nums", nil, []*float64{
		aws.Float64(20.0),
		aws.Float64(50.0),
		aws.Float64(17.0),
	})

	expectedDataframe := &data.Frame{
		Name: "CloudWatchLogsResponse",
		Fields: []*data.Field{
			timeField,
			stringField,
			numberField,
		},
	}

	sort.Sort(ByTime(*expectedDataframe))

	for i := 1; i < timeField.Len(); i++ {
		assert.True(t, timeField.At(i).(*time.Time).After(*(timeField.At(i - 1).(*time.Time))))
	}

	assert.Equal(t, *stringField.At(0).(*string), "test message 3")
	assert.Equal(t, *stringField.At(1).(*string), "test message 2")
	assert.Equal(t, *stringField.At(2).(*string), "test message 1")

	assert.Equal(t, *numberField.At(0).(*float64), 17.0)
	assert.Equal(t, *numberField.At(1).(*float64), 50.0)
	assert.Equal(t, *numberField.At(2).(*float64), 20.0)
}
