package bundle

import (
	"os"
	"path/filepath"
	"strings"

	"github.com/databricks/cli/libs/git"
	"github.com/databricks/cli/libs/template"
	"github.com/spf13/cobra"
)

var gitUrlPrefixes = []string{
	"https://",
	"git@",
}

func isRepoUrl(url string) bool {
	result := false
	for _, prefix := range gitUrlPrefixes {
		if strings.HasPrefix(url, prefix) {
			result = true
			break
		}
	}
	return result
}

// Computes the repo name from the repo URL. Treats the last non empty word
// when splitting at '/' as the repo name. For example: for url git@github.com:databricks/cli.git
// the name would be "cli.git"
func repoName(url string) string {
	parts := strings.Split(strings.TrimRight(url, "/"), "/")
	return parts[len(parts)-1]
}

func newInitCommand() *cobra.Command {
	cmd := &cobra.Command{
		Use:   "init TEMPLATE_PATH",
		Short: "Initialize Template",
		Args:  cobra.ExactArgs(1),
	}

	var configFile string
	var projectDir string
	cmd.Flags().StringVar(&configFile, "config-file", "", "File containing input parameters for template initialization.")
	cmd.Flags().StringVar(&projectDir, "project-dir", "", "The project will be initialized in this directory.")
	cmd.MarkFlagRequired("project-dir")

	cmd.RunE = func(cmd *cobra.Command, args []string) error {
		templatePath := args[0]
		ctx := cmd.Context()

		if !isRepoUrl(templatePath) {
			// skip downloading the repo because input arg is not a URL. We assume
			// it's a path on the local file system in that case
			return template.Materialize(ctx, configFile, templatePath, projectDir)
		}

		// Download the template in a temporary directory
		tmpDir := os.TempDir()
		templateURL := templatePath
		templateDir := filepath.Join(tmpDir, repoName(templateURL))
		err := os.MkdirAll(templateDir, 0755)
		if err != nil {
			return err
		}
		// TODO: Add automated test that the downloaded git repo is cleaned up.
		err = git.Clone(ctx, templateURL, "", templateDir)
		if err != nil {
			return err
		}
		defer os.RemoveAll(templateDir)

		return template.Materialize(ctx, configFile, templateDir, projectDir)
	}

	return cmd
}