package cmd

import "testing"

func TestResolverRequiredValuePrecedence(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name       string
		flagName   string
		flagValue  string
		envValue   string
		profileVal string
		want       string
	}{
		{
			name:       "flag overrides env and profile",
			flagName:   "cluster-id",
			flagValue:  "cluster-from-flag",
			envValue:   "cluster-from-env",
			profileVal: "cluster-from-profile",
			want:       "cluster-from-flag",
		},
		{
			name:       "env overrides profile when flag omitted",
			flagName:   "start",
			envValue:   "1712123000",
			profileVal: "1712121000",
			want:       "1712123000",
		},
		{
			name:       "profile is used when flag and env are empty",
			flagName:   "end",
			profileVal: "1712123600",
			want:       "1712123600",
		},
	}

	for _, tc := range tests {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			got, err := resolveRequiredValue(tc.flagName, tc.flagValue, tc.envValue, tc.profileVal)
			if err != nil {
				t.Fatalf("resolveRequiredValue() error = %v", err)
			}
			if got != tc.want {
				t.Fatalf("resolveRequiredValue() = %q, want %q", got, tc.want)
			}
		})
	}
}

func TestResolverRequiredValueMissing(t *testing.T) {
	t.Parallel()

	got, err := resolveRequiredValue("cluster-id", "", "", "")
	if err == nil {
		t.Fatal("resolveRequiredValue() error = nil, want missing required error")
	}
	if got != "" {
		t.Fatalf("resolveRequiredValue() = %q, want empty", got)
	}
	if want := "missing required --cluster-id"; err.Error() != want {
		t.Fatalf("resolveRequiredValue() error = %q, want %q", err.Error(), want)
	}
}

func TestResolverOptionalValuePrecedence(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name       string
		flagValue  string
		envValue   string
		profileVal string
		want       string
	}{
		{
			name:       "flag overrides env and profile",
			flagValue:  "10",
			envValue:   "20",
			profileVal: "30",
			want:       "10",
		},
		{
			name:       "env overrides profile when flag omitted",
			envValue:   "1712123000",
			profileVal: "1712121000",
			want:       "1712123000",
		},
		{
			name:       "profile is used when flag and env are empty",
			profileVal: "1712123600",
			want:       "1712123600",
		},
		{
			name: "empty when all sources are empty",
			want: "",
		},
	}

	for _, tc := range tests {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			got := resolveOptionalValue(tc.flagValue, tc.envValue, tc.profileVal)
			if got != tc.want {
				t.Fatalf("resolveOptionalValue() = %q, want %q", got, tc.want)
			}
		})
	}
}
