package gcs

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 := NewGcsURL(rawURL)
		require.Error(t, err, "an invalid gcs endpoint URL")
		require.Nil(t, u)
	}

	// success
	{
		rawURL := "gs://ehco-import-source-file/gcs_test/gcs_test-schema-create.sql"
		u, err := NewGcsURL(rawURL)
		require.NoError(t, err)
		require.Equal(t, "ehco-import-source-file", u.Bucket)
		require.Equal(t, "gcs_test/gcs_test-schema-create.sql/", u.Prefix)
	}

	// success with folder
	{
		rawURL := "gs://ehco-import-source-file/gcs_test/"
		u, err := NewGcsURL(rawURL)
		require.NoError(t, err)
		require.Equal(t, "ehco-import-source-file", u.Bucket)
		require.Equal(t, "gcs_test/", u.Prefix)
	}

	// url with prefix spaces, should success
	{
		rawURL := " gs://ehco-import-source-file/gcs_test/gcs_test-schema-create.sql"
		u, err := NewGcsURL(rawURL)
		require.NoError(t, err)
		require.Equal(t, "ehco-import-source-file", u.Bucket)
		require.Equal(t, "gcs_test/gcs_test-schema-create.sql/", u.Prefix)
	}
}

func TestCheckGcsAccess(t *testing.T) {
	rawURL := "gs://ehco-import-source-file/gcs_test/gcs_test-schema-create.sql"
	t.Skip("this test can only be successful when the bucket can be accessed")
	ctx := context.TODO()
	require.NoError(t, CheckGcsAccess(ctx, rawURL, ""))
}

func TestGetFileContent(t *testing.T) {
	t.Skip("this test can only be successful when the bucket can be accessed")
	ctx := context.TODO()
	rawURL := "gs://ehco-import-source-file/gcs_test/gcs_test.tbl.0.csv"
	content, err := GetFileContent(ctx, rawURL, "", 4, 16)
	require.NoError(t, err)
	require.Equal(t, "100,\"test100\"", content)
	content, err = GetFileContent(ctx, rawURL, "", 18, 25)
	require.NoError(t, err)
	require.Equal(t, "101,\"\\\"\"", content)
}

func TestGetBucketRegions(t *testing.T) {
	t.Skip("this test can only be successful when bucket exists")

	// single region bucket in us-east1
	gsURL := "gs://ehco-single"
	ctx := context.TODO()
	regions, err := GetBucketRegions(ctx, gsURL, "")
	require.NoError(t, err)
	require.Equal(t, 1, len(regions))
	require.Equal(t, "us-east1", regions[0])

	// multi region bucket in us
	gsURL = "gs://aylei-geo"
	regions, err = GetBucketRegions(ctx, gsURL, "")
	require.Equal(t, 1, len(regions))
	require.NoError(t, err)
	require.Equal(t, "us", regions[0])

	// dual region bucket in us-east1 (South Carolina), us-west1 (Oregon)
	gsURL = "gs://bkt-nightly-gcp-cluster-3"
	regions, err = GetBucketRegions(ctx, gsURL, "")
	require.NoError(t, err)
	require.Equal(t, 2, len(regions))
	require.Equal(t, []string{"us-east1", "us-west1"}, regions)
}
