package template

import (
	"context"
	"testing"

	"github.com/databricks/cli/libs/cmdio"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestTemplateResolverBothTagAndBranch(t *testing.T) {
	r := Resolver{
		Tag:    "tag",
		Branch: "branch",
	}

	_, err := r.Resolve(context.Background())
	assert.EqualError(t, err, "only one of tag or branch can be specified")
}

func TestTemplateResolverErrorsWhenPromptingIsNotSupported(t *testing.T) {
	r := Resolver{}
	ctx := cmdio.MockDiscard(context.Background())

	_, err := r.Resolve(ctx)
	assert.EqualError(t, err, "prompting is not supported. Please specify the path, name or URL of the template to use")
}

func TestTemplateResolverForDefaultTemplates(t *testing.T) {
	for _, name := range []string{
		"default-python",
		"default-sql",
		"dbt-sql",
	} {
		t.Run(name, func(t *testing.T) {
			r := Resolver{
				TemplatePathOrUrl: name,
			}

			tmpl, err := r.Resolve(context.Background())
			require.NoError(t, err)

			assert.Equal(t, &builtinReader{name: name}, tmpl.Reader)
			assert.IsType(t, &writerWithFullTelemetry{}, tmpl.Writer)
		})
	}

	t.Run("mlops-stacks", func(t *testing.T) {
		r := Resolver{
			TemplatePathOrUrl: "mlops-stacks",
			ConfigFile:        "/config/file",
		}

		tmpl, err := r.Resolve(context.Background())
		require.NoError(t, err)

		// Assert reader and writer configuration
		assert.Equal(t, "https://github.com/databricks/mlops-stacks", tmpl.Reader.(*gitReader).gitUrl)
		assert.Equal(t, "/config/file", tmpl.Writer.(*writerWithFullTelemetry).configPath)
	})
}

func TestTemplateResolverForCustomUrl(t *testing.T) {
	r := Resolver{
		TemplatePathOrUrl: "https://www.example.com/abc",
		Tag:               "tag",
		TemplateDir:       "/template/dir",
		ConfigFile:        "/config/file",
	}

	tmpl, err := r.Resolve(context.Background())
	require.NoError(t, err)

	assert.Equal(t, Custom, tmpl.name)

	// Assert reader configuration
	assert.Equal(t, "https://www.example.com/abc", tmpl.Reader.(*gitReader).gitUrl)
	assert.Equal(t, "tag", tmpl.Reader.(*gitReader).ref)
	assert.Equal(t, "/template/dir", tmpl.Reader.(*gitReader).templateDir)

	// Assert writer configuration
	assert.Equal(t, "/config/file", tmpl.Writer.(*defaultWriter).configPath)
}

func TestTemplateResolverForCustomPath(t *testing.T) {
	r := Resolver{
		TemplatePathOrUrl: "/custom/path",
		ConfigFile:        "/config/file",
	}

	tmpl, err := r.Resolve(context.Background())
	require.NoError(t, err)

	assert.Equal(t, Custom, tmpl.name)

	// Assert reader configuration
	assert.Equal(t, "/custom/path", tmpl.Reader.(*localReader).path)

	// Assert writer configuration
	assert.Equal(t, "/config/file", tmpl.Writer.(*defaultWriter).configPath)
}

func TestBundleInitIsRepoUrl(t *testing.T) {
	assert.True(t, isRepoUrl("git@github.com:databricks/cli.git"))
	assert.True(t, isRepoUrl("https://github.com/databricks/cli.git"))

	assert.False(t, isRepoUrl("./local"))
	assert.False(t, isRepoUrl("foo"))
}