package provider

import (
	"fmt"
	"testing"

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

func Test_NewBRStorageProvider(t *testing.T) {
	cases := []struct {
		name             string
		storageUri       string
		region           string
		secret           string
		expectedProvider string
		expectedErr      error
	}{
		{
			name:             "valid azure storage provider",
			storageUri:       "azblob://myacct.blob.core.windows.net/mycontainer?tokens",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "Azure",
			expectedErr:      nil,
		},
		{
			name:             "s3 storage provider",
			storageUri:       "s3://my-bucket/path/to/file",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "",
			expectedErr:      fmt.Errorf("s3 provider unimplemented"),
		},
		{
			name:             "gcs storage provider",
			storageUri:       "gcs://my-bucket/path/to/file",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "",
			expectedErr:      fmt.Errorf("gcs provider unimplemented"),
		},
		{
			name:             "azure storage provider no storage account",
			storageUri:       "azblob://windows/mycontainer?tokens",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "",
			expectedErr:      fmt.Errorf("invalid bucket uri for azure blob storage, no storage account specified"),
		},
		{
			name:             "azure storage provider no container",
			storageUri:       "azblob://myacct.blob.core.windows.net/?tokens",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "",
			expectedErr:      fmt.Errorf("invalid bucket uri for azure blob storage, no container specified"),
		},
		{
			name:             "azure storage provider no sas token",
			storageUri:       "azblob://myacct.blob.core.windows.net/mycontainer",
			region:           "us-west-2",
			secret:           "",
			expectedProvider: "",
			expectedErr:      fmt.Errorf("invalid bucket uri for azure blob storage, no SAS token specified"),
		},
	}

	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			p, err := NewBRStorageProvider(c.storageUri, c.region, c.secret)
			if c.expectedErr == nil {
				assert.Equal(t, p.GetProviderName(), c.expectedProvider, c.name)
			} else {
				assert.Nil(t, p, c.name)
				assert.Equal(t, "", c.expectedProvider, c.name)
				assert.ErrorContains(t, err, c.expectedErr.Error(), c.name)
			}
		})
	}
}
