package git

import (
	"fmt"

	"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 fmt.Errorf("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("git changes commited")
	} else {
		log.Debug("dry run: no changes commited")
	}

	return nil
}