// Package ctxkey 定义用于 context.Value 的类型安全 key
package ctxkey

// Key 定义 context key 的类型，避免使用内置 string 类型（staticcheck SA1029）
type Key string

const (
	// ForcePlatform 强制平台（用于 /antigravity 路由），由 middleware.ForcePlatform 设置
	ForcePlatform Key = "ctx_force_platform"

	// RequestID 为服务端生成/透传的请求 ID。
	RequestID Key = "ctx_request_id"

	// ClientRequestID 客户端请求的唯一标识，用于追踪请求全生命周期（用于 Ops 监控与排障）。
	ClientRequestID Key = "ctx_client_request_id"

	// Model 请求模型标识（用于统一请求链路日志字段）。
	Model Key = "ctx_model"

	// Platform 当前请求最终命中的平台（用于统一请求链路日志字段）。
	Platform Key = "ctx_platform"

	// AccountID 当前请求最终命中的账号 ID（用于统一请求链路日志字段）。
	AccountID Key = "ctx_account_id"

	// RetryCount 表示当前请求在网关层的重试次数（用于 Ops 记录与排障）。
	RetryCount Key = "ctx_retry_count"

	// AccountSwitchCount 表示请求过程中发生的账号切换次数
	AccountSwitchCount Key = "ctx_account_switch_count"

	// IsClaudeCodeClient 标识当前请求是否来自 Claude Code 客户端
	IsClaudeCodeClient Key = "ctx_is_claude_code_client"

	// ThinkingEnabled 标识当前请求是否开启 thinking（用于 Antigravity 最终模型名推导与模型维度限流）
	ThinkingEnabled Key = "ctx_thinking_enabled"
	// Group 认证后的分组信息，由 API Key 认证中间件设置
	Group Key = "ctx_group"

	// IsMaxTokensOneHaikuRequest 标识当前请求是否为 max_tokens=1 + haiku 模型的探测请求
	// 用于 ClaudeCodeOnly 验证绕过（绕过 system prompt 检查，但仍需验证 User-Agent）
	IsMaxTokensOneHaikuRequest Key = "ctx_is_max_tokens_one_haiku"

	// SingleAccountRetry 标识当前请求处于单账号 503 退避重试模式。
	// 在此模式下，Service 层的模型限流预检查将等待限流过期而非直接切换账号。
	SingleAccountRetry Key = "ctx_single_account_retry"

	// PrefetchedStickyAccountID 标识上游（通常 handler）预取到的 sticky session 账号 ID。
	// Service 层可复用该值，避免同请求链路重复读取 Redis。
	PrefetchedStickyAccountID Key = "ctx_prefetched_sticky_account_id"

	// PrefetchedStickyGroupID 标识上游预取 sticky session 时所使用的分组 ID。
	// Service 层仅在分组匹配时复用 PrefetchedStickyAccountID，避免分组切换重试误用旧 sticky。
	PrefetchedStickyGroupID Key = "ctx_prefetched_sticky_group_id"

	// ClaudeCodeVersion stores the extracted Claude Code version from User-Agent (e.g. "2.1.22")
	ClaudeCodeVersion Key = "ctx_claude_code_version"

	// ResponseCaptureBuffer 用于在 streaming 响应中收集 assistant 文本，供 request_capture 功能使用。
	// 值类型为 *strings.Builder，由 handler 层注入，service 层只负责追加文本。
	ResponseCaptureBuffer Key = "ctx_response_capture_buffer"
)
