package taskboard

import "strings"

const (
	scopeActivityTypeCheckpointAdded        = "task.checkpoint_added"
	scopeActivityTypeBlocked                = "task.blocked"
	scopeActivityTypeUnblocked              = "task.unblocked"
	scopeActivityTypeReviewRequested        = "task.review_requested"
	scopeActivityTypeReviewApproved         = "task.review_approved"
	scopeActivityTypeReviewChangesRequested = "task.review_changes_requested"
	scopeActivityTypeArtifactAdded          = "task.artifact_added"
	scopeActivityTypeStatusChanged          = "task.status_changed"
)

// highSignalActivityPredicateSQL returns the shared task activity allowlist used
// by compact task activity summaries. Callers must apply it only after bounding
// the task scopes they are previewing; it is not recipient, reminder, or Inbox
// candidate policy. The alias must identify a scope_activity_events row.
func highSignalActivityPredicateSQL(alias string) string {
	trimmed := strings.TrimSpace(alias)
	if trimmed == "" {
		trimmed = "scope_activity_events"
	}
	payloadJSON := "CASE WHEN JSON_VALID(" + trimmed + ".payload) THEN " + trimmed + ".payload ELSE '{}' END"
	statusPayloadJSON := "JSON_UNQUOTE(JSON_EXTRACT(" + payloadJSON + ", '$.taskEvent.payload'))"
	statusPayload := "CASE WHEN " + statusPayloadJSON + " IS NULL THEN '' ELSE " + statusPayloadJSON + " END"
	return "(" + trimmed + ".activity_type IN ('" + strings.Join([]string{
		scopeActivityTypeCheckpointAdded,
		scopeActivityTypeBlocked,
		scopeActivityTypeUnblocked,
		scopeActivityTypeReviewRequested,
		scopeActivityTypeReviewApproved,
		scopeActivityTypeReviewChangesRequested,
		scopeActivityTypeArtifactAdded,
	}, "', '") + "') OR (" + trimmed + ".activity_type = '" + scopeActivityTypeStatusChanged + "' AND " + statusPayload + " IN ('in_review', 'done')))"
}
