package tokenanalysis

import "strings"

type blockMetadata struct {
	DisplayName        string
	Origin             string
	Control            string
	TargetPerInjection *uint64
	SuggestedAction    string
	Validation         []string
}

var (
	execTargetPerInjection            = uint64(300)
	workspaceMemoryTargetPerInjection = uint64(200)
)

var knownBlocks = map[string]blockMetadata{
	"platform.identity": {
		DisplayName:     "Platform identity",
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Consolidate overlapping AgentTeam-owned identity framing while preserving the authoritative Agent identity.",
		Validation:      []string{"Agent identity adherence", "communication contract"},
	},
	"agent_config.initial_role": workspaceBlock("Initial role configuration"),
	"platform.who_you_are":      directPolicy("Agent lifecycle identity"),
	"platform.cooperation": {
		DisplayName:     "Cooperation norms",
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Keep unique multi-Agent invariants and remove advice already enforced by task contracts.",
		Validation:      []string{"multi-Agent coordination", "task ownership"},
	},
	"platform.agentteam.startup": {
		DisplayName:     "Startup and delivery rules",
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Separate always-required delivery invariants from startup-only procedure.",
		Validation:      []string{"fresh startup", "resume delivery", "visible final reply"},
	},
	"platform.agentteam.core": {
		DisplayName:     "AgentTeam communication contract",
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Remove duplicated lifecycle prose while preserving exact-target and visible-reply rules.",
		Validation:      []string{"exact target routing", "visible final reply", "task success"},
	},
	"platform.agentteam.exec": {
		DisplayName:        "AgentTeam capability index",
		Origin:             "agentteam_generated",
		Control:            "direct",
		TargetPerInjection: &execTargetPerInjection,
		SuggestedAction:    "Replace the full action catalog with a compact domain index and retrieve details on demand.",
		Validation:         []string{"tool discoverability", "help-call cost", "task success"},
	},
	"platform.agentteam.task_boards": {
		DisplayName:     "Task lifecycle contract",
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Keep one lifecycle authority and leave fields and arguments in structured help.",
		Validation:      []string{"task claim", "status transitions", "checkpoint behavior"},
	},
	"platform.workspace_memory": {
		DisplayName:        "Workspace memory guidance",
		Origin:             "agentteam_policy",
		Control:            "direct",
		TargetPerInjection: &workspaceMemoryTargetPerInjection,
		SuggestedAction:    "Keep only always-required memory boundaries persistent and retrieve maintenance guidance on demand.",
		Validation:         []string{"memory boundary", "secret exclusions", "memory retrieval"},
	},
	"platform.agentteam.review_context": directReference(
		"Review workflow guidance",
		"Inject detailed review guidance only for review work.",
		"review completion", "help-call cost",
	),
	"platform.agent_identity": directPolicy("Configured Agent identity"),
	"workspace.identity":      workspaceBlock("Workspace identity"),
	"agent_config.agents_md":  workspaceBlock("Workspace Agent guidance"),
	"platform.agentteam.reference": directReference(
		"AgentTeam reference material",
		"Keep a short capability index and retrieve detailed reference material on demand.",
		"action discoverability", "help-call cost",
	),
	"notice.identity": {
		DisplayName:     "Identity change notice",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Retire the notice promptly after typed acknowledgement.",
		Validation:      []string{"identity transition", "notice acknowledgement"},
	},
	"event.current_message": requiredPayload("Current message payload"),
	"runtime_attachment_manifest": {
		DisplayName:     "Runtime attachment manifest",
		Origin:          "user_task_payload",
		Control:         "assembly",
		SuggestedAction: "Avoid duplicate attachment metadata while preserving every runtime-readable attachment reference.",
		Validation:      []string{"attachment availability", "message fidelity"},
	},
	"runtime_attachment_preparation_failure": {
		DisplayName:     "Attachment preparation notice",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Keep the failure notice concise while preserving the actionable attachment state.",
		Validation:      []string{"attachment failure recovery", "task success"},
	},
	"event.wake_context": {
		DisplayName:     "Wake delivery context",
		Origin:          "agentteam_generated",
		Control:         "assembly",
		SuggestedAction: "Remove duplicated delivery framing while preserving routing and freshness evidence.",
		Validation:      []string{"wake delivery", "freshness", "exact target routing"},
	},
	"event.resume_context": {
		DisplayName:     "Resume context",
		Origin:          "agentteam_generated",
		Control:         "assembly",
		SuggestedAction: "Carry only recovery deltas not already restored by the runtime.",
		Validation:      []string{"session recovery", "task continuity"},
	},
	"event.deferred_continuation": {
		DisplayName:     "Deferred continuation",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Keep only the exact pending action and required continuation boundary.",
		Validation:      []string{"continuation ownership", "duplicate-action rate"},
	},
	"agentteam.final_visible_reply_check": {
		DisplayName:     "Final visible reply check",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Reduce how often the check is needed before shortening its mandatory routing contract.",
		Validation:      []string{"visible final reply", "duplicate-reply rate"},
	},
	"agentteam.context_compaction_continuation": {
		DisplayName:     "Context compaction continuation",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Keep only the recovery facts needed to resume after runtime compaction.",
		Validation:      []string{"compaction recovery", "duplicate-action rate"},
	},
	"agentteam.output_truncation_continuation": {
		DisplayName:     "Output truncation continuation",
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: "Keep the continuation directive compact and avoid repeating completed output.",
		Validation:      []string{"truncation recovery", "duplicate-output rate"},
	},
	"platform.agentteam.visible_reply_contract": directPolicy("Visible reply contract"),
	// This block ID is part of the agentteam-token-analysis/v2 portable wire
	// contract. Keep the historical surface spelling while internal prompt
	// compiler terminology uses Slot.
	"unattributed.prompt_surface": {
		DisplayName:     "Unattributed prompt surface",
		Origin:          "unknown",
		Control:         "unknown",
		SuggestedAction: "Add typed attribution before changing content.",
		Validation:      []string{"attribution completeness", "rendered prompt parity"},
	},
}

func directPolicy(name string) blockMetadata {
	return blockMetadata{
		DisplayName:     name,
		Origin:          "agentteam_policy",
		Control:         "direct",
		SuggestedAction: "Consolidate overlapping AgentTeam-owned instructions while preserving the authoritative invariant.",
		Validation:      []string{"instruction adherence", "task success"},
	}
}

func directReference(name, action string, validation ...string) blockMetadata {
	return blockMetadata{
		DisplayName:     name,
		Origin:          "agentteam_generated",
		Control:         "direct",
		SuggestedAction: action,
		Validation:      validation,
	}
}

func workspaceBlock(name string) blockMetadata {
	return blockMetadata{
		DisplayName:     name,
		Origin:          "workspace_configuration",
		Control:         "assembly",
		SuggestedAction: "Reduce duplicate injection or retrieve extended guidance on demand without rewriting Workspace content.",
		Validation:      []string{"Workspace instruction adherence", "task success"},
	}
}

func requiredPayload(name string) blockMetadata {
	return blockMetadata{
		DisplayName:     name,
		Origin:          "user_task_payload",
		Control:         "none",
		SuggestedAction: "Do not compress user content; only prevent duplicate assembly.",
		Validation:      []string{"message fidelity", "task success"},
	}
}

func metadataFor(blockID, layer string) blockMetadata {
	blockID = safeBlockID(blockID)
	if metadata, ok := knownBlocks[blockID]; ok {
		return metadata
	}
	switch layer {
	case "workspace_doc", "agent_config":
		return workspaceBlock(humanizeBlockID(blockID))
	case "event":
		return requiredPayload(humanizeBlockID(blockID))
	default:
		return blockMetadata{
			DisplayName:     humanizeBlockID(blockID),
			Origin:          "unknown",
			Control:         "unknown",
			SuggestedAction: "Add a registered origin and control classification before optimizing this block.",
			Validation:      []string{"attribution completeness"},
		}
	}
}

func safeBlockID(blockID string) string {
	blockID = strings.TrimSpace(blockID)
	if _, ok := knownBlocks[blockID]; ok {
		return blockID
	}
	return "unattributed.prompt_surface"
}

func humanizeBlockID(blockID string) string {
	if blockID == "" {
		return "Unattributed prompt surface"
	}
	return strings.NewReplacer(".", " ", "_", " ", "-", " ").Replace(blockID)
}

func lifetimeFor(durability string) string {
	switch strings.TrimSpace(durability) {
	case "persistent":
		return "session_persistent"
	case "turn_only":
		return "boundary_only"
	case "until_acknowledged", "compactable":
		return "until_replaced"
	default:
		return "unknown"
	}
}
