package config

import (
	"testing"
	"time"

	"sigs.k8s.io/yaml"
)

func TestClusterAgentConfig_AutoUnlockMinPendingAge(t *testing.T) {
	yamlData := []byte(`
clusterController:
  clusterAgent:
    autoUnlockPending: true
    autoUnlockMinPendingAge: "20m"
`)
	var cfg RootConfig
	if err := yaml.Unmarshal(yamlData, &cfg); err != nil {
		t.Fatalf("unmarshal failed: %v", err)
	}
	if !cfg.ClusterController.ClusterAgent.AutoUnlockPending {
		t.Fatal("expected autoUnlockPending to be true")
	}
	if got := cfg.ClusterController.ClusterAgent.AutoUnlockMinPendingAge.Duration; got != 20*time.Minute {
		t.Fatalf("autoUnlockMinPendingAge = %v, want 20m", got)
	}
}

func TestNetworkConfig_GetK8sVersion(t *testing.T) {
	tests := []struct {
		name    string
		cfg     *NetworkConfig
		tenant  string
		project string
		want    string
	}{
		{
			name: "no extra config",
			cfg: &NetworkConfig{
				K8sVersion: "1.28",
			},
			tenant:  "12345",
			project: "67890",
			want:    "1.28",
		},
		{
			name: "specify version for tenant 1",
			cfg: &NetworkConfig{
				K8sVersion: "1.28",
				K8sVersionConfig: K8sVersionConfig{
					Tenants: map[UintOrString]string{
						"12345": "1.24",
					},
				},
			},
			tenant: "12345",
			want:   "1.24",
		},
		{
			name: "specify version for tenant 2",
			cfg: &NetworkConfig{
				K8sVersion: "1.28",
				K8sVersionConfig: K8sVersionConfig{
					Tenants: map[UintOrString]string{
						"12345": "1.24",
					},
				},
			},
			tenant: "67890",
			want:   "1.28",
		},
		{
			name: "specify version for project 1",
			cfg: &NetworkConfig{
				K8sVersion: "1.28",
				K8sVersionConfig: K8sVersionConfig{
					Projects: map[UintOrString]string{
						"12345": "1.24",
					},
				},
			},
			project: "12345",
			want:    "1.24",
		},
		{
			name: "specify version for project 2",
			cfg: &NetworkConfig{
				K8sVersion: "1.28",
				K8sVersionConfig: K8sVersionConfig{
					Projects: map[UintOrString]string{
						"12345": "1.24",
					},
				},
			},
			project: "67890",
			want:    "1.28",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := tt.cfg.GetK8sVersion(tt.tenant, tt.project); got != tt.want {
				t.Errorf("GetK8sVersion() = %v, want %v", got, tt.want)
			}
		})
	}
}
