package git

// Option is a some configuration that modifies options for a commit.
type Option interface {
	// ApplyToCommit applies this configuration to a given commit option.
	ApplyToCommit(*CommitOptions)
}

// CommitOptions contains options for making a commit.
type CommitOptions struct {
	*GPGSigningInfo
}

// GPGSigningInfo contains information for signing a commit.
type GPGSigningInfo struct {
	KeyRingPath string
	Passphrase  string
	KeyID       string
}

type GpgSigningOption struct {
	*GPGSigningInfo
}

func (w GpgSigningOption) ApplyToCommit(in *CommitOptions) {
	in.GPGSigningInfo = w.GPGSigningInfo
}

func WithGpgSigningOption(path, passphrase, keyID string) Option {
	// Return nil if no path is set, even if other options are configured.
	if path == "" {
		return GpgSigningOption{}
	}

	return GpgSigningOption{
		GPGSigningInfo: &GPGSigningInfo{
			KeyRingPath: path,
			Passphrase:  passphrase,
			KeyID:       keyID,
		},
	}
}