package mutator_test

import (
	"context"
	"testing"

	"github.com/databricks/cli/bundle"
	"github.com/databricks/cli/bundle/config"
	"github.com/databricks/cli/bundle/config/mutator"
	"github.com/databricks/cli/libs/diag"
	"github.com/databricks/cli/libs/dyn"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestSyncDefaultPath_DefaultIfUnset(t *testing.T) {
	b := &bundle.Bundle{
		BundleRootPath: "/tmp/some/dir",
		Config:         config.Root{},
	}

	ctx := context.Background()
	diags := bundle.Apply(ctx, b, mutator.SyncDefaultPath())
	require.NoError(t, diags.Error())
	assert.Equal(t, []string{"."}, b.Config.Sync.Paths)
}

func TestSyncDefaultPath_SkipIfSet(t *testing.T) {
	tcases := []struct {
		name   string
		paths  dyn.Value
		expect []string
	}{
		{
			name:   "nil",
			paths:  dyn.V(nil),
			expect: nil,
		},
		{
			name:   "empty sequence",
			paths:  dyn.V([]dyn.Value{}),
			expect: []string{},
		},
		{
			name:   "non-empty sequence",
			paths:  dyn.V([]dyn.Value{dyn.V("something")}),
			expect: []string{"something"},
		},
	}

	for _, tcase := range tcases {
		t.Run(tcase.name, func(t *testing.T) {
			b := &bundle.Bundle{
				BundleRootPath: "/tmp/some/dir",
				Config:         config.Root{},
			}

			diags := bundle.ApplyFunc(context.Background(), b, func(ctx context.Context, b *bundle.Bundle) diag.Diagnostics {
				err := b.Config.Mutate(func(v dyn.Value) (dyn.Value, error) {
					v, err := dyn.Set(v, "sync", dyn.V(dyn.NewMapping()))
					if err != nil {
						return dyn.InvalidValue, err
					}
					v, err = dyn.Set(v, "sync.paths", tcase.paths)
					if err != nil {
						return dyn.InvalidValue, err
					}
					return v, nil
				})
				return diag.FromErr(err)
			})
			require.NoError(t, diags.Error())

			ctx := context.Background()
			diags = bundle.Apply(ctx, b, mutator.SyncDefaultPath())
			require.NoError(t, diags.Error())

			// If the sync paths field is already set, do nothing.
			assert.Equal(t, tcase.expect, b.Config.Sync.Paths)
		})
	}
}