package dbhubsdk

import (
	"context"
	"errors"
	"testing"

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

type stubUserMetaProvider struct {
	meta *TidbUserMeta
	err  error
}

func (p stubUserMetaProvider) GetUserMeta(ctx context.Context, projectId, clusterId uint64) (*TidbUserMeta, error) {
	if p.err != nil {
		return nil, p.err
	}
	return p.meta, nil
}

func TestInitRegionalSdkWithUserMetaProvider(t *testing.T) {
	oldProvider := Serverless.UserMetaProvider
	oldClient := Serverless.DdbClient
	defer func() {
		Serverless.UserMetaProvider = oldProvider
		Serverless.DdbClient = oldClient
	}()

	provider := stubUserMetaProvider{meta: &TidbUserMeta{Host: "gateway.example.com", Port: 4000}}
	InitRegionalSdkWithUserMetaProvider(provider)

	require.Nil(t, Serverless.DdbClient)
	require.Equal(t, provider, Serverless.UserMetaProvider)
}

func TestDBHubSdkImplGetUserMetaUsesProvider(t *testing.T) {
	sdk := &DBHubSdkImpl{
		UserMetaProvider: stubUserMetaProvider{
			meta: &TidbUserMeta{
				Host:       "gateway.example.com",
				Port:       4000,
				ClusterId:  2,
				IsDedicate: false,
			},
		},
	}

	meta, err := sdk.GetUserMeta(context.Background(), 1, 2)
	require.NoError(t, err)
	require.Equal(t, "gateway.example.com", meta.Host)
	require.Equal(t, 4000, meta.Port)
	require.Equal(t, uint64(2), meta.ClusterId)
}

func TestDBHubSdkImplGetUserMetaWithoutProvider(t *testing.T) {
	sdk := &DBHubSdkImpl{}

	meta, err := sdk.GetUserMeta(context.Background(), 1, 2)
	require.Nil(t, meta)
	require.EqualError(t, err, "DBHubSdkImpl user meta provider doesn't initialize")
}

func TestDBHubSdkImplGetUserMetaPropagatesProviderError(t *testing.T) {
	sdk := &DBHubSdkImpl{
		UserMetaProvider: stubUserMetaProvider{err: errors.New("boom")},
	}

	meta, err := sdk.GetUserMeta(context.Background(), 1, 2)
	require.Nil(t, meta)
	require.EqualError(t, err, "boom")
}
