package utils

import (
	"reflect"
	"testing"
)

func TestMergeArrays(t *testing.T) {
	type Person struct {
		Name string
		Age  int
	}

	tests := []struct {
		name     string
		arrays   interface{}
		expected interface{}
	}{
		// Integer arrays
		{"Empty arrays", [][]int{}, []int{}},
		{"Single array", [][]int{{1, 2, 3}}, []int{1, 2, 3}},
		{"Two arrays", [][]int{{1, 2}, {3, 4}}, []int{1, 2, 3, 4}},
		{"Multiple arrays", [][]int{{1}, {2}, {3, 4}}, []int{1, 2, 3, 4}},
		{"Array with duplicates", [][]int{{1, 2}, {2, 3}}, []int{1, 2, 2, 3}},

		// String arrays
		{"String arrays", [][]string{{"a", "b"}, {"c", "d"}}, []string{"a", "b", "c", "d"}},
		{"String arrays with duplicates", [][]string{{"hello", "world"}, {"world", "Go"}}, []string{"hello", "world", "world", "Go"}},

		// Struct arrays
		{"Struct arrays", [][]Person{
			{{Name: "Alice", Age: 30}, {Name: "Bob", Age: 25}},
			{{Name: "Charlie", Age: 40}},
		}, []Person{
			{Name: "Alice", Age: 30},
			{Name: "Bob", Age: 25},
			{Name: "Charlie", Age: 40},
		}},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			switch v := tt.arrays.(type) {
			case [][]int:
				result := MergeArrays(v...)
				if !reflect.DeepEqual(result, tt.expected.([]int)) {
					t.Errorf("MergeArrays(%v) = %v; want %v", v, result, tt.expected)
				}
			case [][]string:
				result := MergeArrays(v...)
				if !reflect.DeepEqual(result, tt.expected.([]string)) {
					t.Errorf("MergeArrays(%v) = %v; want %v", v, result, tt.expected)
				}
			case [][]Person:
				result := MergeArrays(v...)
				if !reflect.DeepEqual(result, tt.expected.([]Person)) {
					t.Errorf("MergeArrays(%v) = %v; want %v", v, result, tt.expected)
				}
			default:
				t.Fatalf("Unsupported test case type: %T", v)
			}
		})
	}
}
