package gitpb

import (
	"fmt"

	"github.com/go-cmd/cmd"
	"go.wit.com/log"
)

func (r *Repo) MergeToDevel() (*cmd.Status, error) {
	r.Reload()
	if r.GetCurrentBranchName() != r.GetDevelBranchName() {
		return nil, fmt.Errorf("repo not on devel branch")
	}
	if r.CheckDirty() {
		return nil, fmt.Errorf("repo is dirty")
	}
	devel := r.GetDevelBranchName()
	user := r.GetUserBranchName()

	log.Info("MergeToDevel() merging from", user, "into", devel)

	cmd := []string{"git", "merge", user}
	result, err := r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "MergeToDevel() failed", r.GetFullPath())
		return result, err
	}

	if !r.IsBranchRemote(devel) {
		// devel branch is not remote. do not try 'git push'
		return result, nil
	}

	// it seems like we have write access. lets find out!
	cmd = []string{"git", "push"}
	result, err = r.RunQuiet(cmd)
	if err != nil {
		log.Log(WARN, "MergeToDevel() failed", r.GetFullPath())
		return result, err
	}
	return result, nil
}

func (rs *Repo) MergeDevelToMaster() (*cmd.Status, error) {
	startbranch := rs.GetCurrentBranchName()
	devel := rs.GetDevelBranchName()
	main := rs.GetMasterBranchName()

	log.Info("MergeDevelToMaster() checking out", main, "started on", startbranch, "merge", devel)

	var all [][]string
	all = append(all, []string{"git", "checkout", main})
	all = append(all, []string{"git", "merge", devel})
	all = append(all, []string{"git", "push"})

	if result, err := rs.RunStrictAll(all); err != nil {
		log.Log(WARN, "MergeDevelToMaster() failed", rs.GetFullPath())
		return result, err
	}
	return nil, nil
}