package git

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

	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/plumbing"
	"github.com/sirupsen/logrus"
)

// Clone runs a git clone which accounts for different default branches.
func Clone(dir, url string) error {
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		logrus.Debugf("%s does not exist, attempting to git clone from %s", dir, url)

		_, err := git.PlainClone(dir, false, &git.CloneOptions{
			URL:           url,
			Tags:          git.AllTags,
			ReferenceName: plumbing.ReferenceName("refs/heads/master"),
			SingleBranch:  true,
		})
		if err != nil {
			logrus.Debugf("cloning %s default branch failed, attempting from main branch", url)

			_, err := git.PlainClone(dir, false, &git.CloneOptions{
				URL:           url,
				Tags:          git.AllTags,
				ReferenceName: plumbing.ReferenceName("refs/heads/main"),
				SingleBranch:  true,
			})
			if err != nil {
				if strings.Contains(err.Error(), "authentication required") {
					name := filepath.Base(dir)
					return fmt.Errorf("unable to clone %s, does %s exist?", name, url)
				}

				return err
			}
		}

		logrus.Debugf("%s has been git cloned successfully", dir)
	} else {
		logrus.Debugf("%s already exists", dir)
	}

	return nil
}