package commitintel

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"strings"

	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/contracts/events"
)

// JobIDFromEvent returns a deterministic job ID for a graph.delta.ready event.
func JobIDFromEvent(event events.GraphDeltaReadyEvent) string {
	return fmt.Sprintf(
		"analysis_job_%s_%s",
		sanitizeKeySegment(event.RepoID),
		hashKey(event.BaseCommitSHA, event.TargetCommitSHA),
	)
}

// AnalysisIDFromEvent returns a deterministic analysis ID for a graph.delta.ready event.
func AnalysisIDFromEvent(event events.GraphDeltaReadyEvent) string {
	return fmt.Sprintf(
		"analysis_%s_%s_%s",
		sanitizeKeySegment(event.RepoID),
		shortSHA(event.TargetCommitSHA),
		hashKey(event.BaseCommitSHA, event.TargetCommitSHA)[:8],
	)
}

func hashKey(parts ...string) string {
	h := sha256.New()
	for _, part := range parts {
		_, _ = h.Write([]byte(part))
		_, _ = h.Write([]byte{0})
	}
	return hex.EncodeToString(h.Sum(nil))
}

func sanitizeKeySegment(value string) string {
	value = strings.TrimSpace(value)
	if value == "" {
		return "unknown"
	}
	return value
}
