package git

import (
	"errors"

	"coopcloud.tech/abra/pkg/i18n"
	"coopcloud.tech/abra/pkg/log"
	"github.com/go-git/go-git/v5"
)

// Commit runs a git commit
func Commit(repoPath, commitMessage string, dryRun bool) error {
	if commitMessage == "" {
		return errors.New(i18n.G("no commit message specified?"))
	}

	commitRepo, err := git.PlainOpen(repoPath)
	if err != nil {
		return err
	}

	commitWorktree, err := commitRepo.Worktree()
	if err != nil {
		return err
	}

	patterns, err := GetExcludesFiles()
	if err != nil {
		return err
	}

	if len(patterns) > 0 {
		commitWorktree.Excludes = append(patterns, commitWorktree.Excludes...)
	}

	if !dryRun {
		// NOTE(d1): `All: true` does not include untracked files
		_, err := commitWorktree.Commit(commitMessage, &git.CommitOptions{All: true})
		if err != nil {
			return err
		}
		log.Debug(i18n.G("git changes commited"))
	} else {
		log.Debug(i18n.G("dry run: no changes commited"))
	}

	return nil
}
