package s3

import (
	"context"
	"testing"

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

func TestNewS3URL(t *testing.T) {
	// not valid url
	{
		rawURL := "http://s3-region.amazonaws.com/bucket/key"
		u, err := NewS3URL(rawURL)
		require.Error(t, err, "an invalid S3 endpoint URL")
		require.Nil(t, u)
	}

	// success
	{
		rawURL := "s3://mybucket/some/place/on/there.gz"
		u, err := NewS3URL(rawURL)
		require.NoError(t, err)
		require.Equal(t, "mybucket", u.Bucket)
		require.Equal(t, "some/place/on/there.gz/", u.Prefix)
	}

	// with prefix spaces, should success
	{
		rawURL := " s3://mybucket/some/place/on/there.gz"
		u, err := NewS3URL(rawURL)
		require.NoError(t, err)
		require.Equal(t, "mybucket", u.Bucket)
		require.Equal(t, "some/place/on/there.gz/", u.Prefix)
	}
}

func TestGetBucketRegion(t *testing.T) {
	// bucket from ossinsight is in region us-west-2 see more in https://ossinsight.io/blog/try-it-yourself/#import-data-to-your-tidb-cloud-cluster
	t.Skip("this test can only be successful when the bucket can be accessed")
	ctx := context.TODO()
	rawURL := "s3://tidbcloud-samples/gharchive/"
	u, err := NewS3URL(rawURL)
	require.NoError(t, err)

	region, err := u.GetBucketRegion(ctx)
	require.NoError(t, err)
	require.Equal(t, "us-west-2", region)
}

func TestCheckS3Access(t *testing.T) {
	// bucket from ossinsight see more in https://ossinsight.io/blog/try-it-yourself/#import-data-to-your-tidb-cloud-cluster
	rawURL := "s3://tidbcloud-samples/gharchive/"
	roleArn := "arn:aws:iam::385595570414:role/import-sample-access"
	t.Skip("this test can only be successful when the bucket can be accessed")
	ctx := context.TODO()
	require.NoError(t, CheckS3Access(ctx, rawURL, roleArn, "", "", ""))
}

func TestCheckS3Access2(t *testing.T) {
	rawURL := "s3://test-lightning-aksk/"
	accessKeyId := "xxxxxxxxxxxxxxxx"
	secretAccessKey := "omsqvtl5DxJsscB2xL2oJ7CJRohrm1Lt76dWFUzS"
	t.Skip("this test can only be successful when the bucket can be accessed")
	ctx := context.TODO()
	require.NoError(t, CheckS3Access(ctx, rawURL, "", "", accessKeyId, secretAccessKey))
}

func TestDeleteS3Object(t *testing.T) {
	// this test can pass only when:
	// 1. AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in the environment
	// 2. the bucket: s3://tidbcloud-samples-testimport exists (will fail if not exists)
	// 3. (optional) upload some data to "s3://tidbcloud-samples-testimport/test_import" before you run this test.
	//    If there are no objects in the bucket, this test can succeed too.
	// 4. comment the t.Skip() line below
	// exec in your terminal: go test -run ^TestDeleteS3Object$ github.com/tidbcloud/dataflow-service/pkg/s3
	t.Skip("this test can only be successful while AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in your dev environment")
	ctx := context.TODO()
	rawURL := "s3://tidbcloud-samples-testimport/test_import/"

	err := DeleteS3Dir(ctx, rawURL, "tidbcloud-samples-testimport", "test_import/", "", "")
	require.NoError(t, err)
}

func TestIsNotFoundError(t *testing.T) {
	// this test can pass only when:
	// 1. AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in the environment
	// 2. comment the t.Skip() line below
	// exec in your terminal: go test -run ^TestIsNotFoundError$ github.com/tidbcloud/dataflow-service/pkg/s3
	t.Skip("this test can only be successful while AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in your dev environment")
	ctx := context.TODO()
	rawURL := "s3://tidbcloud-samples-testimport123/test_import/"

	err := DeleteS3Dir(ctx, rawURL, "tidbcloud-samples-testimport123", "test_import/", "", "")
	require.True(t, IsNotFoundError(err))
}

func TestGetFileContent(t *testing.T) {
	t.Skip("this test can only be successful while AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in your dev environment")
	ctx := context.TODO()
	rawURL := "s3://tidbcloud-samples-testimport/test_get_object/obj.txt"
	content, err := GetFileContent(ctx, rawURL, "", "", 0, 10)
	require.NoError(t, err)
	require.Equal(t, "1234567890", content)
	content, err = GetFileContent(ctx, rawURL, "", "", 0, 12)
	require.NoError(t, err)
	require.Equal(t, "1234567890", content)
}

func TestGetFileBody(t *testing.T) {
	t.Skip("this test can only be successful while AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are set in your dev environment")
	ctx := context.TODO()
	rawURL := "s3://tidbcloud-samples-testimport/test_get_object/obj.txt"
	body, err := GetFileBody(ctx, rawURL, "", "")
	require.NoError(t, err)
	require.NotNil(t, body)
	require.NoError(t, body.Close())
}
