package dto

// TeamResponse is the browser-facing Team profile shape.
type TeamResponse struct {
	ID          string `json:"id"`
	Handle      string `json:"handle"`
	DisplayName string `json:"displayName"`
	Description string `json:"description"`
	AvatarURL   string `json:"avatarUrl,omitempty"`
	Visibility  string `json:"visibility"`
	Status      string `json:"status"`
	ChannelID   string `json:"channelId,omitempty"`
	MemberCount int    `json:"memberCount"`
	CanManage   bool   `json:"canManage"`
	CanDelete   bool   `json:"canDelete"`
	CreatedAt   string `json:"createdAt"`
	UpdatedAt   string `json:"updatedAt"`
	ArchivedAt  string `json:"archivedAt,omitempty"`
}

// TeamListResponse returns one bounded Team directory page.
type TeamListResponse struct {
	Teams []TeamResponse `json:"teams"`
}

// CreateTeamRequest creates one workspace Team. Handle is the single
// user-facing Team name; DisplayName mirrors Handle for storage compatibility.
type CreateTeamRequest struct {
	Handle         string                 `json:"handle"`
	DisplayName    string                 `json:"displayName"`
	Description    string                 `json:"description,omitempty"`
	AvatarURL      string                 `json:"avatarUrl,omitempty"`
	Visibility     string                 `json:"visibility"`
	InitialMembers []AddTeamMemberRequest `json:"initialMembers,omitempty"`
}

// UpdateTeamRequest updates editable Team profile fields. Pointer fields let
// callers intentionally clear optional strings while preserving omitted values.
// Handle and DisplayName represent one Team name; when either is supplied the
// API writes both fields with the same value.
type UpdateTeamRequest struct {
	Handle      *string `json:"handle,omitempty"`
	DisplayName *string `json:"displayName,omitempty"`
	Description *string `json:"description,omitempty"`
	AvatarURL   *string `json:"avatarUrl,omitempty"`
	Visibility  *string `json:"visibility,omitempty"`
}

// TeamMemberResponse is one active Team member row.
type TeamMemberResponse struct {
	ID                string         `json:"id"`
	TeamID            string         `json:"teamId"`
	ActorKind         string         `json:"actorKind"`
	ActorID           string         `json:"actorId"`
	ActorProfile      *AuthorProfile `json:"actorProfile,omitempty"`
	Role              string         `json:"role"`
	RoleLabel         string         `json:"roleLabel,omitempty"`
	RoleOverlayPrompt string         `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention bool           `json:"wakeOnTeamMention"`
	SortOrder         int64          `json:"sortOrder"`
	AddedAt           string         `json:"addedAt"`
	UpdatedAt         string         `json:"updatedAt"`
}

// TeamMemberListResponse returns active Team members.
type TeamMemberListResponse struct {
	Members []TeamMemberResponse `json:"members"`
}

// AddTeamMemberRequest adds one agent assignment to an Agent Team.
type AddTeamMemberRequest struct {
	ActorKind         string `json:"actorKind"`
	ActorID           string `json:"actorId"`
	Role              string `json:"role,omitempty"`
	RoleLabel         string `json:"roleLabel,omitempty"`
	RoleOverlayPrompt string `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention *bool  `json:"wakeOnTeamMention,omitempty"`
	SortOrder         int64  `json:"sortOrder,omitempty"`
}

// UpdateTeamMemberRequest updates Team member metadata. Store validation keeps
// actor-kind-specific fields from being written to unsupported member types.
type UpdateTeamMemberRequest struct {
	Role              *string `json:"role,omitempty"`
	RoleLabel         *string `json:"roleLabel,omitempty"`
	RoleOverlayPrompt *string `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention *bool   `json:"wakeOnTeamMention,omitempty"`
	SortOrder         *int64  `json:"sortOrder,omitempty"`
}

// TeamMentionCandidateResponse is the compact Team row used by mention pickers.
type TeamMentionCandidateResponse struct {
	ID                  string `json:"id"`
	Handle              string `json:"handle"`
	DisplayName         string `json:"displayName"`
	Description         string `json:"description,omitempty"`
	AvatarURL           string `json:"avatarUrl,omitempty"`
	MemberCount         int    `json:"memberCount"`
	DeliveryPreview     bool   `json:"deliveryPreview"`
	ScopeAgentCount     int    `json:"scopeAgentCount"`
	ReachableAgentCount int    `json:"reachableAgentCount"`
}

// TeamMentionCandidateListResponse returns one bounded Team candidate page.
type TeamMentionCandidateListResponse struct {
	Teams []TeamMentionCandidateResponse `json:"teams"`
}

// TeamTemplateResponse is one Team creation blueprint.
type TeamTemplateResponse struct {
	ID                string                       `json:"id"`
	Name              string                       `json:"name"`
	Description       string                       `json:"description,omitempty"`
	Visibility        string                       `json:"visibility"`
	Source            string                       `json:"source"`
	Scope             string                       `json:"scope"`
	CreatedByMemberID string                       `json:"createdByMemberId,omitempty"`
	CreatedFromTeamID string                       `json:"createdFromTeamId,omitempty"`
	CanManage         bool                         `json:"canManage"`
	Members           []TeamTemplateMemberResponse `json:"members"`
	CreatedAt         string                       `json:"createdAt,omitempty"`
	UpdatedAt         string                       `json:"updatedAt,omitempty"`
}

// TeamTemplateMemberResponse is one actor slot in a Team template.
type TeamTemplateMemberResponse struct {
	ID                string `json:"id"`
	ActorKind         string `json:"actorKind"`
	ActorID           string `json:"actorId,omitempty"`
	Role              string `json:"role,omitempty"`
	RoleLabel         string `json:"roleLabel,omitempty"`
	RoleOverlayPrompt string `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention bool   `json:"wakeOnTeamMention"`
	SortOrder         int64  `json:"sortOrder"`
}

// TeamTemplateListResponse returns available built-in and custom templates.
type TeamTemplateListResponse struct {
	Templates []TeamTemplateResponse `json:"templates"`
}

// CreateTeamTemplateRequest creates one custom template.
type CreateTeamTemplateRequest struct {
	Name        string                            `json:"name"`
	Description string                            `json:"description,omitempty"`
	Visibility  string                            `json:"visibility,omitempty"`
	Scope       string                            `json:"scope,omitempty"`
	Members     []CreateTeamTemplateMemberRequest `json:"members,omitempty"`
}

// UpdateTeamTemplateRequest updates custom template metadata.
type UpdateTeamTemplateRequest struct {
	Name        string `json:"name"`
	Description string `json:"description,omitempty"`
	Scope       string `json:"scope,omitempty"`
}

// CreateTeamTemplateMemberRequest creates one template member slot.
type CreateTeamTemplateMemberRequest struct {
	ActorKind         string `json:"actorKind"`
	ActorID           string `json:"actorId,omitempty"`
	Role              string `json:"role,omitempty"`
	RoleLabel         string `json:"roleLabel,omitempty"`
	RoleOverlayPrompt string `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention *bool  `json:"wakeOnTeamMention,omitempty"`
	SortOrder         int64  `json:"sortOrder,omitempty"`
}

// SaveTeamTemplateFromTeamRequest creates a custom template by copying a Team.
type SaveTeamTemplateFromTeamRequest struct {
	Name        string `json:"name"`
	Description string `json:"description,omitempty"`
	Scope       string `json:"scope,omitempty"`
}

// InstantiateTeamTemplateRequest creates one ordinary Team from a template.
type InstantiateTeamTemplateRequest struct {
	Handle         string                             `json:"handle"`
	DisplayName    string                             `json:"displayName"`
	Description    *string                            `json:"description,omitempty"`
	Visibility     *string                            `json:"visibility,omitempty"`
	MemberBindings []TeamTemplateMemberBindingRequest `json:"memberBindings,omitempty"`
	InitialMembers []AddTeamMemberRequest             `json:"initialMembers,omitempty"`
}

// InstantiateTeamTemplateResponse returns the created Team profile.
type InstantiateTeamTemplateResponse struct {
	TeamResponse
}

// TeamTemplateMemberBindingRequest maps one template slot to a concrete actor.
type TeamTemplateMemberBindingRequest struct {
	TemplateMemberID  string  `json:"templateMemberId"`
	ActorID           string  `json:"actorId"`
	Role              *string `json:"role,omitempty"`
	RoleLabel         *string `json:"roleLabel,omitempty"`
	RoleOverlayPrompt *string `json:"roleOverlayPrompt,omitempty"`
	WakeOnTeamMention *bool   `json:"wakeOnTeamMention,omitempty"`
}
