package cloud_storage

import (
	"testing"

	"github.com/aws/aws-sdk-go-v2/aws"
	. "github.com/onsi/gomega"
	"github.com/tidbcloud/pkgv2/bizerr"
)

func TestParseAzureBlobParams(t *testing.T) {
	g := NewGomegaWithT(t)
	testCases := []struct {
		uri               string
		expectedHost      string
		expectedContainer string
		expectedPrefix    *string
		expectedError     bizerr.BizError
	}{
		{
			uri:               "https://test.blob.core.windows.net/test/",
			expectedHost:      "test.blob.core.windows.net",
			expectedContainer: "test",
			expectedPrefix:    nil,
		},
		{
			uri:               "https://test.blob.core.windows.net/test/test.csv",
			expectedHost:      "test.blob.core.windows.net",
			expectedContainer: "test",
			expectedPrefix:    aws.String("test.csv"),
		},
		{
			uri:               "https://test.blob.core.windows.net/test/benchmark/",
			expectedHost:      "test.blob.core.windows.net",
			expectedContainer: "test",
			expectedPrefix:    aws.String("benchmark/"),
		},
		{
			uri:               "https://tidbserverless.blob.core.windows.net/export-test/12-25/usern?dsfs#dsdf",
			expectedHost:      "tidbserverless.blob.core.windows.net",
			expectedContainer: "export-test",
			expectedPrefix:    aws.String("12-25/usern?dsfs#dsdf"),
		},
		{
			uri:           "https://test.blob.core.windows.net/",
			expectedError: bizerr.New(bizerr.ErrCodeParams, "Invalid URL: Container name is missing or improperly specified."),
		},
		{
			uri:           "https:///test/test.csv",
			expectedError: bizerr.New(bizerr.ErrCodeParams, "Invalid URL: Host is missing or improperly specified."),
		},
	}

	for _, tc := range testCases {
		host, container, prefix, err := parseAzureBlobParams(tc.uri)
		if tc.expectedError == nil {
			g.Expect(err).To(BeNil())
			g.Expect(host).To(Equal(tc.expectedHost))
			g.Expect(container).To(Equal(tc.expectedContainer))
			if tc.expectedPrefix == nil {
				g.Expect(prefix).To(BeNil())
			} else {
				g.Expect(prefix).To(Equal(tc.expectedPrefix))
			}
		} else {
			g.Expect(err).NotTo(BeNil())
			g.Expect(err.ErrMsg()).To(Equal(tc.expectedError.ErrMsg()))
		}
	}
}
