package gitpb

// does processing on the go.mod and go.sum files

import (
	"go.wit.com/log"
)

// count all objects only in branch1
func (repo *Repo) countDiffObjects(branch1, branch2 string) int {
	cmd := repo.ConstructGitDiffLog(branch1, branch2)
	r, err := repo.RunVerboseOnError(cmd)
	if err != nil {
		return -1
	}
	// log.Info("countDiffObjects()", cmd, len(r.Stdout), strings.Join(r.Stdout, " "))
	return len(r.Stdout)
}

func (repo *Repo) setRepoState() {
	if repo == nil {
		return
	}
	if repo.IsDirty() {
		repo.State = "dirty"
		return
	}
	if repo.GetUserVersion() == "uerr" {
		// user has not made user branches
	} else {
		if repo.GetUserVersion() != repo.GetDevelVersion() {
			repo.State = "merge to devel"
			return
		}
	}
	if repo.GetDevelVersion() != repo.GetMasterVersion() {
		b1 := repo.countDiffObjects(repo.GetMasterBranchName(), repo.GetDevelBranchName())
		if b1 == 0 {
			repo.State = "merge to main"
			// log.Info("master vs devel count is normal b1 == 0", b1)
		} else {
			repo.State = "DEVEL < MASTER"
			// log.Info("master vs devel count b1 != 0", b1)
			log.Info("SERIOUS ERROR. DEVEL BRANCH NEEDS MERGE FROM MASTER b1 ==", b1, repo.GetGoPath())
		}
		return
	}
	// if IsGoTagVersionGreater(oldtag string, newtag string) bool {
	if !IsGoTagVersionGreater(repo.GetLastTag(), repo.GetMasterVersion()) {
		repo.State = "last tag greater error"
		return
	}
	if repo.GetLastTag() != repo.GetMasterVersion() {
		repo.State = "ready to release"
		return
	}

	if repo.CheckBranches() {
		repo.State = "PERFECT"
		return
	}
	log.Info("Branches are not Perfect", repo.GetFullPath())
	log.Info("Branches are not Perfect", repo.GetFullPath())
	log.Info("Branches are not Perfect", repo.GetFullPath())
	repo.State = "unknown branches"
}

// returns true if old="v0.2.4" and new="v0.3.3"
// returns true if equal
// todo: make all of this smarter someday
func IsGoTagVersionGreater(oldtag string, newtag string) bool {
	olda, oldb, oldc := splitInts(oldtag)
	newa, newb, newc := splitInts(newtag)

	if newa < olda {
		return false
	}
	if newb < oldb {
		return false
	}
	if newc < oldc {
		return false
	}
	return true
}

// returns true for "v0.2.4" and false for "v0.2.43-asdfj"
// actually returns false for anything not perfectly versioned
func IsGoTagPublished(oldtag string, newtag string) bool {
	// todo
	return true
}