package protocol

// DelegationEventPayload is the typed payload for delegation lifecycle events
// (started, completed, failed, cancelled).
type DelegationEventPayload struct {
	DelegationID      string `json:"delegation_id"`
	SourceAgentID     string `json:"source_agent_id"`
	SourceAgentKey    string `json:"source_agent_key"`
	SourceDisplayName string `json:"source_display_name,omitempty"`
	TargetAgentID     string `json:"target_agent_id"`
	TargetAgentKey    string `json:"target_agent_key"`
	TargetDisplayName string `json:"target_display_name,omitempty"`
	UserID            string `json:"user_id"`
	Channel           string `json:"channel"`
	ChatID            string `json:"chat_id"`
	Mode              string `json:"mode"`
	Task              string `json:"task,omitempty"`
	TeamID            string `json:"team_id,omitempty"`
	TeamTaskID        string `json:"team_task_id,omitempty"`
	Status            string `json:"status,omitempty"`
	ElapsedMS         int    `json:"elapsed_ms,omitempty"`
	Error             string `json:"error,omitempty"`
	CreatedAt         string `json:"created_at"`
}

// DelegationProgressItem describes one active delegation in a progress report.
type DelegationProgressItem struct {
	DelegationID      string `json:"delegation_id"`
	TargetAgentKey    string `json:"target_agent_key"`
	TargetDisplayName string `json:"target_display_name,omitempty"`
	ElapsedMS         int    `json:"elapsed_ms"`
	TeamTaskID        string `json:"team_task_id,omitempty"`
	Activity          string `json:"activity,omitempty"` // "thinking", "tool_exec", "compacting"
	Tool              string `json:"tool,omitempty"`     // current tool name (when Activity == "tool_exec")
}

// DelegationProgressPayload is emitted periodically for async delegations.
type DelegationProgressPayload struct {
	SourceAgentID  string                   `json:"source_agent_id"`
	SourceAgentKey string                   `json:"source_agent_key"`
	UserID         string                   `json:"user_id"`
	Channel        string                   `json:"channel"`
	ChatID         string                   `json:"chat_id"`
	TeamID         string                   `json:"team_id,omitempty"`
	Active         []DelegationProgressItem `json:"active_delegations"`
}

// DelegationAccumulatedPayload is emitted when an async delegation completes
// but siblings are still running (result accumulated, not yet announced).
type DelegationAccumulatedPayload struct {
	DelegationID      string `json:"delegation_id"`
	SourceAgentID     string `json:"source_agent_id"`
	SourceAgentKey    string `json:"source_agent_key"`
	TargetAgentKey    string `json:"target_agent_key"`
	TargetDisplayName string `json:"target_display_name,omitempty"`
	UserID            string `json:"user_id"`
	Channel           string `json:"channel"`
	ChatID            string `json:"chat_id"`
	TeamID            string `json:"team_id,omitempty"`
	TeamTaskID        string `json:"team_task_id,omitempty"`
	SiblingsRemaining int    `json:"siblings_remaining"`
	ElapsedMS         int    `json:"elapsed_ms,omitempty"`
}

// DelegationAnnounceResultSummary describes one delegation result in the announce payload.
type DelegationAnnounceResultSummary struct {
	AgentKey       string `json:"agent_key"`
	DisplayName    string `json:"display_name,omitempty"`
	HasMedia       bool   `json:"has_media"`
	ContentPreview string `json:"content_preview,omitempty"`
}

// DelegationAnnouncePayload is emitted when the last sibling delegation completes
// and all accumulated results are announced back to the lead agent.
type DelegationAnnouncePayload struct {
	SourceAgentID     string                            `json:"source_agent_id"`
	SourceAgentKey    string                            `json:"source_agent_key"`
	SourceDisplayName string                            `json:"source_display_name,omitempty"`
	UserID            string                            `json:"user_id"`
	Channel           string                            `json:"channel"`
	ChatID            string                            `json:"chat_id"`
	TeamID            string                            `json:"team_id,omitempty"`
	Results           []DelegationAnnounceResultSummary `json:"results"`
	CompletedTaskIDs  []string                          `json:"completed_task_ids,omitempty"`
	TotalElapsedMS    int                               `json:"total_elapsed_ms"`
	HasMedia          bool                              `json:"has_media"`
}

// TeamTaskEventPayload is the typed payload for team task lifecycle events
// (created, claimed, completed, cancelled, approved, rejected).
type TeamTaskEventPayload struct {
	TeamID           string `json:"team_id"`
	TaskID           string `json:"task_id"`
	TaskNumber       int    `json:"task_number,omitempty"`
	Subject          string `json:"subject,omitempty"`
	Status           string `json:"status"`
	OwnerAgentKey    string `json:"owner_agent_key,omitempty"`
	OwnerDisplayName string `json:"owner_display_name,omitempty"`
	Reason           string `json:"reason,omitempty"`
	UserID           string `json:"user_id"`
	Channel          string `json:"channel"`
	ChatID           string `json:"chat_id"`
	Timestamp        string `json:"timestamp"`

	// Progress (for team.task.progress events).
	ProgressPercent int    `json:"progress_percent,omitempty"`
	ProgressStep    string `json:"progress_step,omitempty"`

	// Actor info for audit trail (recorded to team_task_events by subscriber).
	ActorType string `json:"actor_type,omitempty"` // "agent", "human", "system"
	ActorID   string `json:"actor_id,omitempty"`   // agent key, user ID, or system identifier
}

// TeamMessageEventPayload is the typed payload for team.message.sent events.
type TeamMessageEventPayload struct {
	TeamID          string `json:"team_id"`
	FromAgentKey    string `json:"from_agent_key"`
	FromDisplayName string `json:"from_display_name,omitempty"`
	ToAgentKey      string `json:"to_agent_key"`
	ToDisplayName   string `json:"to_display_name,omitempty"`
	MessageType     string `json:"message_type"`
	Preview         string `json:"preview"`
	TaskID          string `json:"task_id,omitempty"`
	UserID          string `json:"user_id"`
	Channel         string `json:"channel"`
	ChatID          string `json:"chat_id"`
}

// --- Team CRUD event payloads ---

// TeamCreatedPayload is emitted when a new team is created via RPC.
type TeamCreatedPayload struct {
	TeamID          string `json:"team_id"`
	TeamName        string `json:"team_name"`
	LeadAgentKey    string `json:"lead_agent_key"`
	LeadDisplayName string `json:"lead_display_name,omitempty"`
	MemberCount     int    `json:"member_count"`
}

// TeamUpdatedPayload is emitted when team settings are updated via RPC.
type TeamUpdatedPayload struct {
	TeamID   string   `json:"team_id"`
	TeamName string   `json:"team_name"`
	Changes  []string `json:"changes"`
}

// TeamDeletedPayload is emitted when a team is deleted via RPC.
type TeamDeletedPayload struct {
	TeamID   string `json:"team_id"`
	TeamName string `json:"team_name"`
}

// TeamMemberAddedPayload is emitted when a member is added to a team.
type TeamMemberAddedPayload struct {
	TeamID      string `json:"team_id"`
	TeamName    string `json:"team_name"`
	AgentID     string `json:"agent_id"`
	AgentKey    string `json:"agent_key"`
	DisplayName string `json:"display_name,omitempty"`
	Role        string `json:"role"`
}

// TeamMemberRemovedPayload is emitted when a member is removed from a team.
type TeamMemberRemovedPayload struct {
	TeamID      string `json:"team_id"`
	TeamName    string `json:"team_name"`
	AgentID     string `json:"agent_id"`
	AgentKey    string `json:"agent_key"`
	DisplayName string `json:"display_name,omitempty"`
}

// --- Agent link event payloads ---

// AgentLinkCreatedPayload is emitted when a new agent link is created.
type AgentLinkCreatedPayload struct {
	LinkID         string `json:"link_id"`
	SourceAgentID  string `json:"source_agent_id"`
	SourceAgentKey string `json:"source_agent_key"`
	TargetAgentID  string `json:"target_agent_id"`
	TargetAgentKey string `json:"target_agent_key"`
	Direction      string `json:"direction"`
	TeamID         string `json:"team_id,omitempty"`
	Status         string `json:"status"`
}

// AgentLinkUpdatedPayload is emitted when an agent link is updated.
type AgentLinkUpdatedPayload struct {
	LinkID         string   `json:"link_id"`
	SourceAgentKey string   `json:"source_agent_key"`
	TargetAgentKey string   `json:"target_agent_key"`
	Direction      string   `json:"direction,omitempty"`
	Status         string   `json:"status,omitempty"`
	Changes        []string `json:"changes"`
}

// AgentLinkDeletedPayload is emitted when an agent link is deleted.
type AgentLinkDeletedPayload struct {
	LinkID         string `json:"link_id"`
	SourceAgentKey string `json:"source_agent_key"`
	TargetAgentKey string `json:"target_agent_key"`
}
