package eks_test

import (
	"testing"

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

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

func TestCheckAddonVersionReady(t *testing.T) {
	t.Run("addon is upgrading", func(t *testing.T) {
		addon := &eksv1beta1.Addon{}
		addon.Spec.ForProvider.AddonName = ptr.To("vpc-cni")
		addon.Spec.ForProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")
		addon.Status.AtProvider.AddonVersion = ptr.To("v1.19.5-eksbuild.1")

		err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
		require.Error(t, err)
		require.Contains(t, err.Error(), "addon vpc-cni is upgrading from version v1.19.5-eksbuild.1 to v1.20.1-eksbuild.3")
	})

	t.Run("addon version not match target version", func(t *testing.T) {
		addon := &eksv1beta1.Addon{}
		addon.Spec.ForProvider.AddonName = ptr.To("vpc-cni")
		addon.Spec.ForProvider.AddonVersion = ptr.To("v1.19.5-eksbuild.1")
		addon.Status.AtProvider.AddonVersion = ptr.To("v1.19.5-eksbuild.1")

		err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
		require.Error(t, err)
		require.Contains(t, err.Error(), "addon vpc-cni version v1.19.5-eksbuild.1 is not ready for target version v1.20.1-eksbuild.3")
	})

	t.Run("addon version matches target version", func(t *testing.T) {
		addon := &eksv1beta1.Addon{}
		addon.Spec.ForProvider.AddonName = ptr.To("vpc-cni")
		addon.Spec.ForProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")
		addon.Status.AtProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")

		err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
		require.NoError(t, err)
	})

	t.Run("addon status version is nil (creating)", func(t *testing.T) {
		addon := &eksv1beta1.Addon{}
		addon.Spec.ForProvider.AddonName = ptr.To("vpc-cni")
		addon.Spec.ForProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")
		// Status.AtProvider.AddonVersion is nil

		err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
		require.NoError(t, err)
	})

	t.Run("addon spec version is nil (should not happen)", func(t *testing.T) {
		addon := &eksv1beta1.Addon{}
		addon.Spec.ForProvider.AddonName = ptr.To("vpc-cni")
		// Spec.ForProvider.AddonVersion is nil
		addon.Status.AtProvider.AddonVersion = ptr.To("v1.19.5-eksbuild.1")

		err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
		require.Error(t, err)
		require.Contains(t, err.Error(), "addon vpc-cni version v1.19.5-eksbuild.1 is not ready for target version v1.20.1-eksbuild.3")
	})

	t.Run("different addon names", func(t *testing.T) {
		testCases := []struct {
			name      string
			addonName string
		}{
			{"aws-ebs-csi-driver", "aws-ebs-csi-driver"},
			{"coredns", "coredns"},
			{"kube-proxy", "kube-proxy"},
		}

		for _, tc := range testCases {
			t.Run(tc.name, func(t *testing.T) {
				addon := &eksv1beta1.Addon{}
				addon.Spec.ForProvider.AddonName = ptr.To(tc.addonName)
				addon.Spec.ForProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")
				addon.Status.AtProvider.AddonVersion = ptr.To("v1.20.1-eksbuild.3")

				err := taskeks.CheckAddonVersionReady(addon, "v1.20.1-eksbuild.3")
				require.NoError(t, err)
			})
		}
	})
}
