// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package sbmodel_test

import (
	"reflect"
	"testing"
	"time"

	"v.io/x/sensorlog_lite/internal/sbmodel"
	"v.io/x/sensorlog_lite/internal/sbmodel/keyutil"
)

type keyTest interface {
	Run(t *testing.T, keyPrototype sbmodel.PersistentDataKey)
}

// validKeyTest verifies that the key is correctly parsed and built.
type validKeyTest struct {
	keyStr    string
	keyParsed sbmodel.PersistentDataKey
}

func (kt *validKeyTest) Run(t *testing.T, keyPrototype sbmodel.PersistentDataKey) {
	if err := keyPrototype.Parse(kt.keyStr); err != nil {
		t.Errorf("key %q parse failed: %v", kt.keyStr, err)
		return
	}
	if got, want := keyPrototype, kt.keyParsed; !reflect.DeepEqual(got, want) {
		t.Errorf("incorrect key parse: got %v, want %v", got, want)
	}
	if got, want := kt.keyParsed.Table(), keyPrototype.Table(); got != want {
		t.Errorf("incorrect parsed key table: got %v, want %v", got, want)
	}
	if got, want := kt.keyParsed.Key(), kt.keyStr; got != want {
		t.Errorf("incorrect key build: got %s, want %s", got, want)
	}
}

// invalidKeyTest verifies that malformed key parsing fails.
type invalidKeyTest struct {
	keyStr string
}

func (kt *invalidKeyTest) Run(t *testing.T, keyPrototype sbmodel.PersistentDataKey) {
	if err := keyPrototype.Parse(kt.keyStr); err == nil {
		t.Errorf("key %q parse should have failed", kt.keyStr)
	}
}

func TestDeviceCfgKeys(t *testing.T) {
	tests := []keyTest{
		&validKeyTest{
			keyStr: keyutil.Join("foo"),
			keyParsed: &sbmodel.KDeviceCfg{
				DevId: "foo",
			},
		},
		&invalidKeyTest{
			keyStr: keyutil.Join("foo", "bar"),
		},
	}
	for _, kt := range tests {
		kt.Run(t, &sbmodel.KDeviceCfg{})
	}
}

func TestStreamDefKeys(t *testing.T) {
	tests := []keyTest{
		&validKeyTest{
			keyStr: keyutil.Join("pc", "cputemp"),
			keyParsed: &sbmodel.KStreamDef{
				DevId:    "pc",
				StreamId: "cputemp",
			},
		},
		&invalidKeyTest{
			keyStr: keyutil.Join("pc"),
		},
	}
	for _, kt := range tests {
		kt.Run(t, &sbmodel.KStreamDef{})
	}
}

func TestDataPointKeys(t *testing.T) {
	tests := []keyTest{
		&validKeyTest{
			keyStr: keyutil.Join("meter", "amps", "00000022fcde41b2"),
			keyParsed: &sbmodel.KDataPoint{
				DevId:     "meter",
				StreamId:  "amps",
				Timestamp: time.Unix(0, 0x22fcde41b2),
			},
		},
		&invalidKeyTest{
			keyStr: keyutil.Join("meter", "amps"),
		},
		&invalidKeyTest{
			keyStr: keyutil.Join("meter", "amps", "2.17"),
		},
	}
	for _, kt := range tests {
		kt.Run(t, &sbmodel.KDataPoint{})
	}
}
