package storage

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/aws-shared-provider/pkg/metaserver/config"
)

func TestNewMemDBStorageValidatesMySQLConfigBeforeConnecting(t *testing.T) {
	_, err := NewMemDBStorage(&config.Config{
		RdsSecretArn:    "rds-secret",
		Region:          "us-east-1",
		KubeClusterName: "kube-a",
	})
	require.ErrorContains(t, err, "incomplete mysql configuration: missing cloud-provider-type")
}

func TestValidateMySQLConfig(t *testing.T) {
	completeConfig := config.Config{
		CloudProviderType: "aws",
		RdsSecretArn:      "rds-secret",
		Region:            "us-east-1",
		KubeClusterName:   "kube-a",
	}
	tests := []struct {
		name        string
		cfg         config.Config
		enabled     bool
		errContains string
	}{
		{
			name: "all mysql fields empty",
		},
		{
			name: "missing cloud provider type",
			cfg: config.Config{
				RdsSecretArn:    completeConfig.RdsSecretArn,
				Region:          completeConfig.Region,
				KubeClusterName: completeConfig.KubeClusterName,
			},
			errContains: "cloud-provider-type",
		},
		{
			name: "missing rds secret arn",
			cfg: config.Config{
				CloudProviderType: completeConfig.CloudProviderType,
				Region:            completeConfig.Region,
				KubeClusterName:   completeConfig.KubeClusterName,
			},
			errContains: "rds-secret-arn",
		},
		{
			name: "missing region",
			cfg: config.Config{
				CloudProviderType: completeConfig.CloudProviderType,
				RdsSecretArn:      completeConfig.RdsSecretArn,
				KubeClusterName:   completeConfig.KubeClusterName,
			},
			errContains: "region",
		},
		{
			name:    "complete mysql configuration",
			cfg:     completeConfig,
			enabled: true,
		},
		{
			name: "missing kubernetes cluster name",
			cfg: config.Config{
				CloudProviderType: completeConfig.CloudProviderType,
				RdsSecretArn:      completeConfig.RdsSecretArn,
				Region:            completeConfig.Region,
			},
			errContains: "kube-cluster-name",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			enabled, err := validateMySQLConfig(&tt.cfg)
			require.Equal(t, tt.enabled, enabled)
			if tt.errContains == "" {
				require.NoError(t, err)
				return
			}
			require.ErrorContains(t, err, tt.errContains)
		})
	}
}
