package healthcheck

import (
	"fmt"
	"log"

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

func catTags(all []string) (out string) {
	out = ""
	for _, str := range all {
		out += str + " "
	}
	return out
}

func getTagsFromRepo(repoPath string) ([]string, error) {
	repo, err := git.PlainOpen(repoPath)
	if err != nil {
		return nil, fmt.Errorf("Cannot open repo: %v", err)
	}

	refs, err := repo.Tags()
	if err != nil {
		return nil, fmt.Errorf("Cannot get tags: %v", err)
	}

	var tags []string
	err = refs.ForEach(func(ref *plumbing.Reference) error {
		tags = append(tags, ref.Name().Short())
		return nil
	})
	if err != nil {
		return nil, fmt.Errorf("Error while iterating tags: %v", err)
	}

	return tags, nil
}

func CheckReleases(repoPath string, category string, n int) (jsonOut CheckStage) {
	jsonOut = CheckStage{
		Name:     "ReleaseCheck",
		StdOut:   "Checking release tag: ",
		ExitCode: 0,
		StdErr:   "",
	}

	tags, err := getTagsFromRepo(repoPath)
	if err != nil {
		log.Fatalf("Error in getting tags: %v", err)
	}

	var prefix string

	switch category {
	case "exam":
		prefix = "e"
	case "project":
		prefix = "p"
	case "homework":
		prefix = "h"
	default:
		prefix = "a"
	}

	target := prefix + fmt.Sprintf("%d", n)
	found := false
	for _, tag := range tags {
		if tag == target {
			found = true
			break
		}
	}
	if !found {
		tagList := catTags(tags)
		jsonOut.ExitCode = 107
		jsonOut.StdOut = "Failed"
		jsonOut.StdErr = fmt.Sprintf("wrong release tag '%s', please use one of %s aborting", target, tagList)
		return jsonOut
	}

	jsonOut.StdOut += "OK"
	jsonOut.ExitCode = 0
	jsonOut.StdErr = "Fine"
	return jsonOut
}