package infraapi

import (
	"context"
	"testing"

	"github.com/pingcap/errors"
	"github.com/stretchr/testify/assert"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestImport(t *testing.T) {
	var (
		client = fake.NewFakeClientWithScheme(scheme)
		api    = &API{
			projectName: "test",
			client:      client,
		}
		ctx            = context.Background()
		tenantID       = uint64(123)
		projectID      = uint64(456)
		AwsClusterID   = uint64(789)
		GcpClusterID   = uint64(987)
		AwsImportID    = uint64(321)
		GcpImportID    = uint64(654)
		userName       = "user"
		passWord       = "pass"
		s3SourceUrl    = "s3://my-bucket/key-name"
		GcsSourceUrl   = "gcs://my-bucket/key-name"
		region         = "us-west-2"
		filter         = "filter1"
		storageRequest = "3Ti"
		dataFormat     = cloudv1.DataFormatAuroraParquet
	)

	err := api.CreateAwsImportIgnoreExists(
		ctx,
		tenantID,
		projectID,
		AwsClusterID,
		AwsImportID,
		userName,
		passWord,
		s3SourceUrl,
		region,
		filter,
		storageRequest,
		dataFormat,
		nil,
		"",
		"",
		"",
	)
	assert.Nil(t, err)
	gotAwsImp, err := api.GetImport(ctx, projectID, AwsImportID)
	assert.Nil(t, err)
	assert.Equal(t, gotAwsImp.Name, "import-321")

	err = api.CreateGcpImportIgnoreExists(
		ctx,
		tenantID,
		projectID,
		GcpClusterID,
		GcpImportID,
		userName,
		passWord,
		GcsSourceUrl,
		region,
		filter,
		storageRequest,
		cloudv1.DataFormatAuroraParquet,
		nil,
		"",
		"",
	)
	assert.Nil(t, err)
	gotGcpImp, err := api.GetImport(ctx, projectID, GcpImportID)
	assert.Nil(t, err)
	assert.Equal(t, gotGcpImp.Name, "import-654")

	err = api.DeleteImport(ctx, projectID, AwsImportID)
	assert.Nil(t, err)
	gotAwsImp, err = api.GetImport(ctx, projectID, AwsImportID)
	assert.True(t, apierrors.IsNotFound(errors.Cause(err)))
	assert.Nil(t, gotAwsImp)

	err = api.DeleteImport(ctx, projectID, GcpImportID)
	assert.Nil(t, err)
	gotGcpImp, err = api.GetImport(ctx, projectID, GcpImportID)
	assert.True(t, apierrors.IsNotFound(errors.Cause(err)))
	assert.Nil(t, gotGcpImp)

}
