package cluster

import (
	"context"
	"testing"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	clustertask "github.com/tidbcloud/eks-provider/controllers/cluster/task"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/config"
	"github.com/tidbcloud/infra-provider/pkg/consts"
)

func TestMigrateFeatureAnnotationsEnablesGKEVolumeAttributesClassWithoutRootFeatureGate(t *testing.T) {
	cluster := &cloudv1.Cluster{
		ObjectMeta: metav1.ObjectMeta{},
		Spec: cloudv1.ClusterSpec{Kubernetes: cloudv1.Kubernetes{
			Provider: cloudv1.ProviderTypeGKE,
		}},
		Status: cloudv1.ClusterStatus{Phase: cloudv1.ClusterPhaseRunning},
	}
	taskContext := &clustertask.Context{
		Cluster: cluster,
		CommonK8sClusterStatus: &cloudv1.CommonK8sClusterStatus{
			NodeVersion: "1.34",
		},
	}

	(&ClusterReconciler{}).migrateFeatureAnnotations(context.Background(), taskContext)

	if !cluster.FeatureEnabled(consts.ClusterFeatureUseVolumeAttributesClass) {
		t.Fatal("VolumeAttributesClass feature is not enabled")
	}
}

func TestMigrateFeatureAnnotationsPreservesEKSVolumeAttributesClassFeatureGate(t *testing.T) {
	tests := []struct {
		name        string
		featureGate bool
		wantEnabled bool
	}{
		{name: "disabled"},
		{name: "enabled", featureGate: true, wantEnabled: true},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			cluster := &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{},
				Spec: cloudv1.ClusterSpec{Kubernetes: cloudv1.Kubernetes{
					Provider: cloudv1.ProviderTypeEKS,
				}},
				Status: cloudv1.ClusterStatus{Phase: cloudv1.ClusterPhaseCreating},
			}
			taskContext := &clustertask.Context{
				Cluster: cluster,
				CommonK8sClusterStatus: &cloudv1.CommonK8sClusterStatus{
					NodeVersion: "1.31",
				},
			}
			reconciler := &ClusterReconciler{}
			if tt.featureGate {
				reconciler.Config.FeatureGates = map[config.FeatureGateName]config.FeatureGate{
					config.UseVolumeAttributesClass: {All: true},
				}
			}

			reconciler.migrateFeatureAnnotations(context.Background(), taskContext)

			if got := cluster.FeatureEnabled(consts.ClusterFeatureUseVolumeAttributesClass); got != tt.wantEnabled {
				t.Fatalf("VolumeAttributesClass feature enabled = %v, want %v", got, tt.wantEnabled)
			}
		})
	}
}
