package whatever

import (
	"os"
	"path"
	"strings"

	"github.com/cooperspencer/gickup/types"
	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/config"
	"github.com/go-git/go-git/v5/plumbing/transport"
	"github.com/go-git/go-git/v5/plumbing/transport/http"
	"github.com/go-git/go-git/v5/plumbing/transport/ssh"
	"github.com/rs/zerolog/log"
)

// Get TODO.
func Get(conf *types.Conf) ([]types.Repo, bool) {
	ran := false
	repos := []types.Repo{}
	if len(conf.Source.Any) > 0 {
		ran = true
		log.Info().
			Str("stage", "whatever").
			Msgf("adding repos")
		for _, repo := range conf.Source.Any {
			if repo.URL == "" {
				log.Error().
					Str("stage", "whatever").
					Msg("no url configured")
			}

			var auth transport.AuthMethod
			hoster := "local"
			if repo.User == "" {
				if repo.Username != "" {
					repo.User = repo.Username
				} else {
					repo.User = "git"
				}
			}
			if _, err := os.Stat(repo.URL); os.IsNotExist(err) {
				hoster = types.GetHost(repo.URL)
				if strings.HasPrefix(repo.URL, "http://") || strings.HasPrefix(repo.URL, "https://") {
					if repo.Token != "" {
						auth = &http.BasicAuth{
							Username: "xyz",
							Password: repo.Token,
						}
					} else if repo.Username != "" && repo.Password != "" {
						auth = &http.BasicAuth{
							Username: repo.Username,
							Password: repo.Password,
						}
					}
				} else {
					var err error
					if repo.SSHKey == "" {
						home := os.Getenv("HOME")
						repo.SSHKey = path.Join(home, ".ssh", "id_rsa")
					}
					auth, err = ssh.NewPublicKeysFromFile("git", repo.SSHKey, "")
					if err != nil {
						log.Error().
							Str("stage", "whatever").
							Msg(err.Error())
						continue
					}
				}
			}

			rem := git.NewRemote(nil, &config.RemoteConfig{Name: "origin", URLs: []string{repo.URL}})
			data, err := rem.List(&git.ListOptions{Auth: auth})
			if err != nil {
				log.Error().
					Str("stage", "whatever").
					Msg(err.Error())

				continue
			}

			main := ""
			for _, d := range data {
				if d.Hash().IsZero() {
					main = d.Target().Short()

					break
				}
			}

			separator := "/"
			if hoster == "local" {
				separator = string(os.PathSeparator)
			}
			name := repo.URL[strings.LastIndex(repo.URL, separator)+1:]
			if strings.HasSuffix(name, ".git") {
				name = name[:strings.LastIndex(name, ".git")]
			}

			repos = append(repos, types.Repo{
				Name:          name,
				URL:           repo.URL,
				SSHURL:        repo.URL,
				Token:         repo.GetToken(),
				Defaultbranch: main,
				Origin:        repo,
				Owner:         repo.User,
				Hoster:        hoster,
			})
		}
	}
	return repos, ran
}