package metadata

import "strings"

// GitCommitMetadata captures git author/committer identity, timestamps, and message.
type GitCommitMetadata struct {
	AuthorName     string `json:"author_name,omitempty"`
	AuthorEmail    string `json:"author_email,omitempty"`
	CommitterName  string `json:"committer_name,omitempty"`
	CommitterEmail string `json:"committer_email,omitempty"`
	AuthoredAt     string `json:"authored_at,omitempty"`
	CommittedAt    string `json:"committed_at,omitempty"`
	CommitMessage  string `json:"commit_message,omitempty"`
}

// HasMetadata reports whether any git commit metadata field is populated.
func (m GitCommitMetadata) HasMetadata() bool {
	return strings.TrimSpace(m.AuthorName) != "" ||
		strings.TrimSpace(m.AuthorEmail) != "" ||
		strings.TrimSpace(m.CommitterName) != "" ||
		strings.TrimSpace(m.CommitterEmail) != "" ||
		strings.TrimSpace(m.AuthoredAt) != "" ||
		strings.TrimSpace(m.CommittedAt) != "" ||
		strings.TrimSpace(m.CommitMessage) != ""
}

// FormatAuthor returns a legacy "Name <email>" author string.
func (m GitCommitMetadata) FormatAuthor() string {
	return FormatAuthor(m.AuthorName, m.AuthorEmail)
}

// FormatCommitter returns a legacy "Name <email>" committer string.
func (m GitCommitMetadata) FormatCommitter() string {
	return FormatAuthor(m.CommitterName, m.CommitterEmail)
}

// FormatAuthor builds a display author/committer string from name and email.
func FormatAuthor(name, email string) string {
	name = strings.TrimSpace(name)
	email = strings.TrimSpace(email)
	if name == "" && email == "" {
		return ""
	}
	if email == "" {
		return name
	}
	if name == "" {
		return email
	}
	return name + " <" + email + ">"
}
