package task

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/config"
)

func TestContext_PCAIdentifierAndRegion(t *testing.T) {
	t.Run("use global config when appbox pca unset", func(t *testing.T) {
		global := &config.PCAConfig{
			CAIdentifier: "arn:aws:acm-pca:us-west-2:123:certificate-authority/default",
			Region:       "us-west-2",
		}
		ctx := &Context{
			Config: config.RootConfig{
				ControllerConfig: config.ControllerConfig{
					APPBoxConfig: config.APPBoxConfig{PCAConfig: global},
				},
			},
			APPBox: &v1alpha1.APPBox{},
		}

		identifier, region, enabled, err := ctx.PCAIdentifierAndRegion()
		require.NoError(t, err)
		assert.True(t, enabled)
		assert.Equal(t, global.CAIdentifier, identifier)
		assert.Equal(t, global.Region, region)
	})

	t.Run("override identifier and parse region from appbox spec", func(t *testing.T) {
		ctx := &Context{
			Config: config.RootConfig{
				ControllerConfig: config.ControllerConfig{
					APPBoxConfig: config.APPBoxConfig{
						PCAConfig: &config.PCAConfig{
							CAIdentifier:             "arn:aws:acm-pca:us-west-2:123:certificate-authority/default",
							Region:                   "us-west-2",
							AssumeRoleArn:            "arn:aws:iam::123:role/pca",
							IssuerPolicyTemplateFile: "/tmp/policy.json",
						},
					},
				},
			},
			APPBox: &v1alpha1.APPBox{
				Spec: v1alpha1.APPBoxSpec{
					PCA: &v1alpha1.PCAConfig{
						CAIdentifier: "arn:aws:acm-pca:us-east-1:456:certificate-authority/custom",
					},
				},
			},
		}

		identifier, region, enabled, err := ctx.PCAIdentifierAndRegion()
		require.NoError(t, err)
		assert.True(t, enabled)
		assert.Equal(t, "arn:aws:acm-pca:us-east-1:456:certificate-authority/custom", identifier)
		assert.Equal(t, "us-east-1", region)
	})

	t.Run("return error when appbox spec pca arn is invalid", func(t *testing.T) {
		ctx := &Context{
			APPBox: &v1alpha1.APPBox{
				Spec: v1alpha1.APPBoxSpec{
					PCA: &v1alpha1.PCAConfig{
						CAIdentifier: "invalid-pca-arn",
					},
				},
			},
		}

		_, _, _, err := ctx.PCAIdentifierAndRegion()
		require.Error(t, err)
	})
}

func TestContext_PCAIssuerPolicyTemplateFile(t *testing.T) {
	ctx := &Context{
		Config: config.RootConfig{
			ControllerConfig: config.ControllerConfig{
				APPBoxConfig: config.APPBoxConfig{
					PCAConfig: &config.PCAConfig{
						IssuerPolicyTemplateFile: "/tmp/policy.json",
					},
				},
			},
		},
	}

	assert.Equal(t, "/tmp/policy.json", ctx.PCAIssuerPolicyTemplateFile())
}

func TestContext_PCAAssumeRoleARN(t *testing.T) {
	ctx := &Context{
		Config: config.RootConfig{
			ControllerConfig: config.ControllerConfig{
				APPBoxConfig: config.APPBoxConfig{
					PCAConfig: &config.PCAConfig{
						AssumeRoleArn: "arn:aws:iam::123:role/pca",
					},
				},
			},
		},
	}

	assert.Equal(t, "arn:aws:iam::123:role/pca", ctx.PCAAssumeRoleARN())
}
