package eks_test

import (
	"testing"

	"github.com/stretchr/testify/require"
	eksv1beta1 "github.com/upbound/provider-aws/apis/eks/v1beta1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/utils/ptr"

	taskeks "github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task/eks"
)

func TestCheckNodeGroupVersionReady(t *testing.T) {
	t.Run("node group is upgrading", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{}
		ng.Name = "test-nodegroup"
		ng.Spec.ForProvider.Version = ptr.To("1.34")
		ng.Status.AtProvider.Version = ptr.To("1.33")

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.Error(t, err)
		require.Contains(t, err.Error(), "node group test-nodegroup is upgrading from version 1.33 to 1.34")
	})

	t.Run("node group version not match target version", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{}
		ng.Name = "test-nodegroup"
		ng.Spec.ForProvider.Version = ptr.To("1.33")
		ng.Status.AtProvider.Version = ptr.To("1.33")

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.Error(t, err)
		require.Contains(t, err.Error(), "node group test-nodegroup version 1.33 is not ready for target version 1.34")
	})

	t.Run("node group version matches target version", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{}
		ng.Name = "test-nodegroup"
		ng.Spec.ForProvider.Version = ptr.To("1.34")
		ng.Status.AtProvider.Version = ptr.To("1.34")

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.NoError(t, err)
	})

	t.Run("node group status version is nil (creating)", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{}
		ng.Name = "test-nodegroup"
		ng.Spec.ForProvider.Version = ptr.To("1.34")
		// Status.AtProvider.Version is nil

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.NoError(t, err)
	})

	t.Run("node group spec version is nil (should not happen)", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{}
		ng.Name = "test-nodegroup"
		// Spec.ForProvider.Version is nil
		ng.Status.AtProvider.Version = ptr.To("1.33")

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.Error(t, err)
		require.Contains(t, err.Error(), "node group test-nodegroup version 1.33 is not ready for target version 1.34")
	})

	t.Run("node group with metadata", func(t *testing.T) {
		ng := &eksv1beta1.NodeGroup{
			ObjectMeta: metav1.ObjectMeta{
				Name:      "test-nodegroup-with-metadata",
				Namespace: "default",
			},
		}
		ng.Spec.ForProvider.Version = ptr.To("1.34")
		ng.Status.AtProvider.Version = ptr.To("1.34")

		err := taskeks.CheckNodeGroupVersionReady(ng, "1.34")
		require.NoError(t, err)
	})
}
