package k8supgrade

import (
	"reflect"
	"testing"
)

func TestNewMustVersion(t *testing.T) {
	tests := []struct {
		name string
		v    string
		want Version
	}{
		{
			name: "empty version",
			v:    "",
			want: Version{},
		},
		{
			name: "invalid version",
			v:    "",
			want: Version{},
		},
		{
			name: "gke version",
			v:    "1.28.9-gke.1069000",
			want: Version{Major: 1, Minor: 28},
		},
		{
			name: "normal version",
			v:    "1.29",
			want: Version{Major: 1, Minor: 29},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := NewMustVersion(tt.v); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("NewMustVersion() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestFindMinimalVersion(t *testing.T) {
	tests := []struct {
		name     string
		versions []Version
		want     Version
	}{
		{
			name:     "Single version",
			versions: []Version{{Major: 1, Minor: 0}},
			want:     Version{Major: 1, Minor: 0},
		},
		{
			name: "Multiple versions with different major",
			versions: []Version{
				{Major: 1, Minor: 0},
				{Major: 2, Minor: 0},
				{Major: 0, Minor: 0},
			},
			want: Version{Major: 0, Minor: 0},
		},
		{
			name: "Multiple versions with same major different minor",
			versions: []Version{
				{Major: 1, Minor: 0},
				{Major: 1, Minor: 2},
				{Major: 1, Minor: 1},
			},
			want: Version{Major: 1, Minor: 0},
		},
		{
			name: "Multiple versions with same major and minor",
			versions: []Version{
				{Major: 1, Minor: 0},
				{Major: 1, Minor: 0},
				{Major: 1, Minor: 0},
			},
			want: Version{Major: 1, Minor: 0},
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := FindMinimalVersion(tt.versions...); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("FindMinimalVersion() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestAreAllVersionsEqual(t *testing.T) {
	tests := []struct {
		name     string
		versions []Version
		want     bool
	}{
		{
			name: "All versions are equal",
			versions: []Version{
				{Major: 1, Minor: 30},
				{Major: 1, Minor: 30},
				{Major: 1, Minor: 30},
			},
			want: true,
		},
		{
			name: "Versions have different minors",
			versions: []Version{
				{Major: 1, Minor: 30},
				{Major: 1, Minor: 29},
				{Major: 1, Minor: 28},
			},
			want: false,
		},
		{
			name: "Versions have different majors",
			versions: []Version{
				{Major: 1, Minor: 30},
				{Major: 2, Minor: 30},
				{Major: 1, Minor: 28},
			},
			want: false,
		},
		{
			name: "Single version",
			versions: []Version{
				{Major: 1, Minor: 30},
			},
			want: true,
		},
		{
			name:     "Empty version list",
			versions: []Version{},
			want:     true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := AreAllVersionsEqual(tt.versions...); got != tt.want {
				t.Errorf("AreAllVersionsEqual() = %v, want %v", got, tt.want)
			}
		})
	}
}
