package v2

import (
	"reflect"
	"testing"
)

func TestNewSettable(t *testing.T) {
	contexts := []struct {
		arg   string
		name  string
		field string
		value string
		err   error
	}{
		{"name=value", "name", "", "value", nil},
		{"name", "name", "", "", nil},
		{"name.field=value", "name", "field", "value", nil},
		{"name.field", "name", "field", "", nil},
		{"=value", "", "", "", errInvalidFormat},
		{"=", "", "", "", errInvalidFormat},
	}

	for _, c := range contexts {
		s, err := newSettable(c.arg)
		if err != c.err {
			t.Fatalf("expected error to be %v, got %v", c.err, err)
		}

		if s.name != c.name {
			t.Fatalf("expected name to be %q, got %q", c.name, s.name)
		}

		if s.field != c.field {
			t.Fatalf("expected field to be %q, got %q", c.field, s.field)
		}

		if s.value != c.value {
			t.Fatalf("expected value to be %q, got %q", c.value, s.value)
		}

	}
}

func TestIsSettable(t *testing.T) {
	contexts := []struct {
		allowedSettableFields []string
		set                   settable
		settable              []string
		result                bool
		err                   error
	}{
		{allowedSettableFieldsEnv, settable{}, []string{}, false, nil},
		{allowedSettableFieldsEnv, settable{field: "value"}, []string{}, false, nil},
		{allowedSettableFieldsEnv, settable{}, []string{"value"}, true, nil},
		{allowedSettableFieldsEnv, settable{field: "value"}, []string{"value"}, true, nil},
		{allowedSettableFieldsEnv, settable{field: "foo"}, []string{"value"}, false, nil},
		{allowedSettableFieldsEnv, settable{field: "foo"}, []string{"foo"}, false, nil},
		{allowedSettableFieldsEnv, settable{}, []string{"value1", "value2"}, false, errMultipleFields},
	}

	for _, c := range contexts {
		if res, err := c.set.isSettable(c.allowedSettableFields, c.settable); res != c.result {
			t.Fatalf("expected result to be %t, got %t", c.result, res)
		} else if err != c.err {
			t.Fatalf("expected error to be %v, got %v", c.err, err)
		}
	}
}

func TestUpdateSettinsEnv(t *testing.T) {
	contexts := []struct {
		env    []string
		set    settable
		newEnv []string
	}{
		{[]string{}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}},
		{[]string{"DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}},
		{[]string{"FOO=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}},
		{[]string{"FOO=0", "DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}},
		{[]string{"FOO=0", "DEBUG=0", "BAR=1"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1", "BAR=1"}},
	}

	for _, c := range contexts {
		updateSettingsEnv(&c.env, &c.set)

		if !reflect.DeepEqual(c.env, c.newEnv) {
			t.Fatalf("expected env to be %q, got %q", c.newEnv, c.env)
		}
	}
}
