package bootstrap_test

import (
	"context"
	"fmt"
	"testing"

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

	"github.com/pomerium/pomerium/config"
	"github.com/pomerium/pomerium/internal/zero/bootstrap"
	cluster_api "github.com/pomerium/pomerium/pkg/zero/cluster"
)

func TestConfigChanges(t *testing.T) {
	t.Parallel()

	secret := []byte("secret")

	src, err := bootstrap.New(secret)
	require.NoError(t, err)

	ptr := func(s string) *string { return &s }

	var listenerCalled bool
	src.OnConfigChange(nil, func(_ context.Context, _ *config.Config) {
		listenerCalled = true
	})

	for i, tc := range []struct {
		bootstrap                        cluster_api.BootstrapConfig
		expectChanged                    bool
		expectDatabrokerType             string
		expectDatabrokerConnectionString string
	}{
		{
			cluster_api.BootstrapConfig{},
			false,
			config.StorageInMemoryName,
			"",
		},
		{
			cluster_api.BootstrapConfig{
				DatabrokerStorageConnection: ptr("postgres://"),
			},
			true,
			config.StoragePostgresName,
			"postgres://",
		},
		{
			cluster_api.BootstrapConfig{},
			true,
			config.StorageInMemoryName,
			"",
		},
	} {
		t.Run(fmt.Sprintf("test-%d", i), func(t *testing.T) {
			listenerCalled = false
			changed := src.UpdateBootstrap(context.Background(), tc.bootstrap)
			cfg := src.GetConfig()
			assert.Equal(t, tc.expectChanged, changed, "changed")
			assert.Equal(t, tc.expectChanged, listenerCalled, "listenerCalled")
			assert.Equal(t, tc.expectDatabrokerType, cfg.Options.DataBrokerStorageType, "databroker type")
			assert.Equal(t, tc.expectDatabrokerConnectionString, cfg.Options.DataBrokerStorageConnectionString, "databroker connection string")
		})
	}
}