package schema

import (
	"reflect"
	"testing"
)

func TestSetAdd(t *testing.T) {
	s := &Set{F: testSetInt}
	s.Add(1)
	s.Add(5)
	s.Add(25)

	expected := []interface{}{1, 25, 5}
	actual := s.List()
	if !reflect.DeepEqual(actual, expected) {
		t.Fatalf("bad: %#v", actual)
	}
}

func TestSetAdd_negative(t *testing.T) {
	// Since we don't allow negative hashes, this should just hash to the
	// same thing...
	s := &Set{F: testSetInt}
	s.Add(-1)
	s.Add(1)

	expected := []interface{}{-1}
	actual := s.List()
	if !reflect.DeepEqual(actual, expected) {
		t.Fatalf("bad: %#v", actual)
	}
}

func TestSetContains(t *testing.T) {
	s := &Set{F: testSetInt}
	s.Add(5)
	s.Add(-5)

	if s.Contains(2) {
		t.Fatal("should not contain")
	}
	if !s.Contains(5) {
		t.Fatal("should contain")
	}
	if !s.Contains(-5) {
		t.Fatal("should contain")
	}
}

func TestSetDifference(t *testing.T) {
	s1 := &Set{F: testSetInt}
	s2 := &Set{F: testSetInt}

	s1.Add(1)
	s1.Add(5)

	s2.Add(5)
	s2.Add(25)

	difference := s1.Difference(s2)
	difference.Add(2)

	expected := []interface{}{1, 2}
	actual := difference.List()
	if !reflect.DeepEqual(actual, expected) {
		t.Fatalf("bad: %#v", actual)
	}
}

func TestSetIntersection(t *testing.T) {
	s1 := &Set{F: testSetInt}
	s2 := &Set{F: testSetInt}

	s1.Add(1)
	s1.Add(5)

	s2.Add(5)
	s2.Add(25)

	intersection := s1.Intersection(s2)
	intersection.Add(2)

	expected := []interface{}{2, 5}
	actual := intersection.List()
	if !reflect.DeepEqual(actual, expected) {
		t.Fatalf("bad: %#v", actual)
	}
}

func TestSetUnion(t *testing.T) {
	s1 := &Set{F: testSetInt}
	s2 := &Set{F: testSetInt}

	s1.Add(1)
	s1.Add(5)

	s2.Add(5)
	s2.Add(25)

	union := s1.Union(s2)
	union.Add(2)

	expected := []interface{}{1, 2, 25, 5}
	actual := union.List()
	if !reflect.DeepEqual(actual, expected) {
		t.Fatalf("bad: %#v", actual)
	}
}

func testSetInt(v interface{}) int {
	return v.(int)
}

func TestHashResource_nil(t *testing.T) {
	resource := &Resource{
		Schema: map[string]*Schema{
			"name": {
				Type:     TypeString,
				Optional: true,
			},
		},
	}
	f := HashResource(resource)

	idx := f(nil)
	if idx != 0 {
		t.Fatalf("Expected 0 when hashing nil, given: %d", idx)
	}
}

func TestHashEqual(t *testing.T) {
	nested := &Resource{
		Schema: map[string]*Schema{
			"foo": {
				Type:     TypeString,
				Optional: true,
			},
		},
	}
	root := &Resource{
		Schema: map[string]*Schema{
			"bar": {
				Type:     TypeString,
				Optional: true,
			},
			"nested": {
				Type:     TypeSet,
				Optional: true,
				Elem:     nested,
			},
		},
	}
	n1 := map[string]interface{}{"foo": "bar"}
	n2 := map[string]interface{}{"foo": "baz"}

	r1 := map[string]interface{}{
		"bar":    "baz",
		"nested": NewSet(HashResource(nested), []interface{}{n1}),
	}
	r2 := map[string]interface{}{
		"bar":    "qux",
		"nested": NewSet(HashResource(nested), []interface{}{n2}),
	}
	r3 := map[string]interface{}{
		"bar":    "baz",
		"nested": NewSet(HashResource(nested), []interface{}{n2}),
	}
	r4 := map[string]interface{}{
		"bar":    "qux",
		"nested": NewSet(HashResource(nested), []interface{}{n1}),
	}
	s1 := NewSet(HashResource(root), []interface{}{r1})
	s2 := NewSet(HashResource(root), []interface{}{r2})
	s3 := NewSet(HashResource(root), []interface{}{r3})
	s4 := NewSet(HashResource(root), []interface{}{r4})

	cases := []struct {
		name     string
		set      *Set
		compare  *Set
		expected bool
	}{
		{
			name:     "equal",
			set:      s1,
			compare:  s1,
			expected: true,
		},
		{
			name:     "not equal",
			set:      s1,
			compare:  s2,
			expected: false,
		},
		{
			name:     "outer equal, should still not be equal",
			set:      s1,
			compare:  s3,
			expected: false,
		},
		{
			name:     "inner equal, should still not be equal",
			set:      s1,
			compare:  s4,
			expected: false,
		},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			actual := tc.set.HashEqual(tc.compare)
			if tc.expected != actual {
				t.Fatalf("expected %t, got %t", tc.expected, actual)
			}
		})
	}
}
