package agent

import (
	"strings"
	"sync"
)

var (
	// These callbacks are wired by the daemon composition root to avoid making
	// the runtime package import token/profile.
	revokeRuntimeAnalysisToken func(string)
	taskPayloadFPMu            sync.RWMutex
	taskPayloadFPFn            func([]byte) string
)

// SetRuntimeAnalysisTokenRevoker installs the process-lifetime cleanup hook.
func SetRuntimeAnalysisTokenRevoker(revoke func(string)) {
	revokeRuntimeAnalysisToken = revoke
}

// SetTaskPayloadFingerprinter installs the daemon-owned keyed fingerprinter
// used by acknowledged interactive deliveries.
func SetTaskPayloadFingerprinter(fn func([]byte) string) {
	taskPayloadFPMu.Lock()
	taskPayloadFPFn = fn
	taskPayloadFPMu.Unlock()
}

func fingerprintTaskPayload(digest string) string {
	digest = strings.TrimSpace(digest)
	if digest == "" {
		return ""
	}
	taskPayloadFPMu.RLock()
	fn := taskPayloadFPFn
	taskPayloadFPMu.RUnlock()
	if fn == nil {
		return ""
	}
	return strings.TrimSpace(fn([]byte(digest)))
}

func (ap *Process) revokeUnownedAnalysisToken(owned *bool) {
	if ap == nil || owned == nil || *owned {
		return
	}
	value := strings.TrimSpace(ap.analysisToken)
	if value == "" || revokeRuntimeAnalysisToken == nil {
		return
	}
	revokeRuntimeAnalysisToken(value)
	ap.analysisToken = ""
}
