package entity

import (
	"testing"

	"github.com/stretchr/testify/require"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

var db *gorm.DB

// func TestTableClusterLock(t *testing.T) {
// 	err := db.AutoMigrate(&ClusterLock{})
// 	require.NoError(t, err)

// 	lock := ClusterLock{
// 		ClusterID: "1",
// 		LockType:  "backup_bucket_switch",
// 		Owner:     "dataflow",
// 	}
// 	// test for default vaule
// 	err = db.Save(&lock).Error
// 	require.NoError(t, err)
// 	require.Equal(t, lock.Status, "active")

// 	lock2 := ClusterLock{}
// 	filter := ClusterLock{
// 		Owner: "dataflow",
// 	}

// 	// test for JSONMap
// 	err = db.Where(filter).First(&lock2).Error
// 	require.NoError(t, err)

// 	lock2.Context["test"] = "test"
// 	err = db.Save(&lock2).Error
// 	require.NoError(t, err)

// 	err = db.Delete(&lock2).Error
// 	require.NoError(t, err)
// }

func TestImportSourceURLParse(t *testing.T) {
	type testCase struct {
		CaseName               string
		SourceURL              string
		AccessConfig           *ImportSourceAccessConfig
		ExpectedPlainSourceURL string
		ExpectedAccessConfig   *ImportSourceAccessConfig
	}
	for _, tc := range []testCase{
		{
			CaseName:               "empty access config",
			SourceURL:              "s3://mybucket/myfolder",
			AccessConfig:           nil,
			ExpectedPlainSourceURL: "s3://mybucket/myfolder",
			ExpectedAccessConfig:   new(ImportSourceAccessConfig),
		},
		{
			CaseName:  "aksk",
			SourceURL: "s3://mybucket/myfolder/",
			AccessConfig: &ImportSourceAccessConfig{
				AWSAccessKeyID:     "YOUR_ACCESS_KEY_ID",
				AWSSecretAccessKey: "YOUR_SECRET_ACCESS_KEY",
			},
			ExpectedPlainSourceURL: "s3://mybucket/myfolder/",
			ExpectedAccessConfig: &ImportSourceAccessConfig{
				AWSAccessKeyID:     "YOUR_ACCESS_KEY_ID",
				AWSSecretAccessKey: "YOUR_SECRET_ACCESS_KEY",
			},
		},
		{
			CaseName:  "assume-role",
			SourceURL: "s3://mybucket/myfolder/",
			AccessConfig: &ImportSourceAccessConfig{
				AWSRoleARN:    "YOUR_ARN",
				AWSExternalID: "EXTERNAL_ID",
			},
			ExpectedPlainSourceURL: "s3://mybucket/myfolder/",
			ExpectedAccessConfig: &ImportSourceAccessConfig{
				AWSRoleARN:    "YOUR_ARN",
				AWSExternalID: "EXTERNAL_ID",
			},
		},
		{
			CaseName:  "gcs credential file",
			SourceURL: "gs://mybucket/myfolder/",
			AccessConfig: &ImportSourceAccessConfig{
				GCPCredentialFile: "YOUR_FILE",
			},
			ExpectedPlainSourceURL: "gs://mybucket/myfolder/",
			ExpectedAccessConfig: &ImportSourceAccessConfig{
				GCPCredentialFile: "YOUR_FILE",
			},
		},
		{
			CaseName:  "unmatched access config",
			SourceURL: "s3://mybucket/myfolder/",
			AccessConfig: &ImportSourceAccessConfig{
				AWSRoleARN:        "YOUR_ARN",
				AWSExternalID:     "EXTERNAL_ID",
				GCPCredentialFile: "YOUR_FILE",
			},
			ExpectedPlainSourceURL: "s3://mybucket/myfolder/",
			ExpectedAccessConfig: &ImportSourceAccessConfig{
				AWSRoleARN:    "YOUR_ARN",
				AWSExternalID: "EXTERNAL_ID",
			},
		},
	} {
		imp := &Import{
			SourceURL: tc.SourceURL,
		}
		err := imp.SetAccessConfigInSourceURL(tc.AccessConfig)
		require.NoErrorf(t, err, "case name: %s", tc.CaseName)
		plainSourceURL, parsedAccessConfig, err := imp.ParseSourceURL()
		require.NoErrorf(t, err, "case name: %s", tc.CaseName)
		require.Equalf(t, tc.ExpectedPlainSourceURL, plainSourceURL, "case name: %s", tc.CaseName)
		require.Equalf(t, tc.ExpectedAccessConfig, parsedAccessConfig, "case name: %s", tc.CaseName)
	}
}

func init() {
	var err error

	db, err = gorm.Open(sqlite.Open(":memory:"))

	if err != nil {
		panic(err)
	}
}
