package devices

import (
	"context"
	"testing"

	"github.com/google/go-cmp/cmp"
)

var (
	testDeviceConfigs = []DeviceConfig{
		DeviceConfig{
			Type: "Astro",
			Network: &NetworkProperties{
				Nodename: "astro-test-device",
				IPv4Addr: "255.255.255.255",
				Mac:      "00:00:00:00:00:00",
			},
			Power: &PowerClient{
				Type:     "PDU",
				Host:     "255.255.255.255",
				Username: "username",
				Password: "password",
				PDUIp:    "255.255.255.255",
				PDUPort:  "1",
			},
		},
		DeviceConfig{
			Type: "Intel NUC Kit NUC7i5DNHE",
			Network: &NetworkProperties{
				Nodename: "nuc-test-device",
				IPv4Addr: "255.255.255.255",
				Mac:      "00:00:00:00:00:00",
			},
			Power: &PowerClient{
				Type:     "AMT",
				Host:     "255.255.255.255",
				Username: "username",
				Password: "password",
			},
		},
		DeviceConfig{
			Type: "Khadas Vim2 Max",
			Network: &NetworkProperties{
				Nodename: "vim-test-device",
				IPv4Addr: "255.255.255.255",
				Mac:      "00:00:00:00:00:00",
			},
			Power: &PowerClient{
				Type: "WOL",
				Host: "255.255.255.255",
			},
		},
	}
)

// deviceSanityCheck identifies basic differences between a Device and its source DeviceConfig.
// This function does not check every property; it is meant to be a sanity check.
func deviceSanityCheck(t *testing.T, actual Device, expected DeviceConfig) {
	if actual.Nodename() != expected.Network.Nodename {
		t.Errorf("nodenames not equal; expected: %s, actual: %s", expected.Network.Nodename, actual.Nodename())
	}
	if actual.Mac() != expected.Network.Mac {
		t.Errorf("macs not equal; expected: %s, actual: %s", expected.Network.Mac, actual.Mac())
	}
	if actual.HasSerial() {
		t.Errorf("test device should not have serial")
	}
}

func TestLoadDeviceConfigs(t *testing.T) {
	// Test that loading a nonexistent config fails.
	if _, err := LoadDeviceConfigs("./test_data/nonexistent.json"); err == nil {
		t.Error("loading nonexistent config did not fail")
	}

	// Test that loading misformatted json files fails.
	if _, err := LoadDeviceConfigs("./test_data/invalid.json"); err == nil {
		t.Error("loading invalid json did not produce error")
	}

	// Test that loading correctly formatted config files succeeds
	configs, err := LoadDeviceConfigs("./test_data/config.json")
	if err != nil {
		t.Fatalf("loading device configs failed: %v", err)
	}
	if diff := cmp.Diff(configs, testDeviceConfigs); diff != "" {
		t.Errorf("parsed configs do not match expected: (-want +got):\n%s", diff)
	}

}

func TestCreateDevices(t *testing.T) {
	ctx := context.Background()
	devices, err := CreateDevices(ctx, testDeviceConfigs, []string{"test"})
	if err != nil {
		t.Fatalf("creating devices from configs failed: %v", err)
	}

	if len(devices) != 3 {
		t.Fatalf("expected three devices to be created, got %d", len(devices))
	}

	// Check the types of each device.
	if _, ok := devices[0].(*ArmCDCether); !ok {
		t.Errorf("device one is not an arm cdcether device: %v", devices[0])
	}
	if _, ok := devices[1].(*Nuc); !ok {
		t.Errorf("device one is not a nuc: %v", devices[1])
	}
	if _, ok := devices[2].(*Vim); !ok {
		t.Errorf("device one is not a vim: %v", devices[2])
	}

	// Perform a quick sanity check on the devices.
	for i, device := range devices {
		deviceSanityCheck(t, device, testDeviceConfigs[i])
	}
}
