package workspace

import "time"

const (
	// DefaultWorkspaceMemberDirectoryLimit is the default page size for workspace member directories.
	DefaultWorkspaceMemberDirectoryLimit = 50
	// MaxWorkspaceMemberDirectoryLimit is the maximum page size accepted by workspace member directories.
	MaxWorkspaceMemberDirectoryLimit = 100
	// MaxWorkspaceMemberDirectoryExcludeUserIDs bounds user ids excluded from a member search request body.
	MaxWorkspaceMemberDirectoryExcludeUserIDs = 5000
	// MaxWorkspaceMemberLookupIDs bounds requested ids in workspace member lookup requests.
	MaxWorkspaceMemberLookupIDs = 100
)

// WorkspaceInviteInfo is the data shown before accepting an invite.
type WorkspaceInviteInfo struct {
	WorkspaceID       string
	WorkspaceName     string
	InviterName       string
	InvitedEmail      string
	InvitedMobileHint string
}

// WorkspaceInvite is the pending invite list item returned by GET /workspaces/:id/invites.
type WorkspaceInvite struct {
	ID                string
	InvitedEmail      string
	InvitedMobileHint string
	CreatedAt         time.Time
	InviteLink        string
}

const (
	DefaultWorkspaceInviteListLimit = 50
	MaxWorkspaceInviteListLimit     = 100
)

type WorkspaceInvitePage struct {
	Invites    []WorkspaceInvite
	HasMore    bool
	NextCursor string
}

type WorkspaceInviteListOptions struct {
	Limit  int
	Cursor string
}

// PendingWorkspaceInvite is a workspace invite visible to the signed-in invitee.
type PendingWorkspaceInvite struct {
	ID                string
	WorkspaceID       string
	WorkspaceName     string
	InviterName       string
	InvitedEmail      string
	InvitedMobileHint string
	CreatedAt         time.Time
	ExpiresAt         time.Time
}

// WorkspaceMember is the response item for GET /workspaces/:workspaceId/members.
type WorkspaceMember struct {
	UserID           string
	Email            string
	Name             string
	DisplayName      string
	MemberID         string
	LegacyTargetKeys []string
	AvatarURL        string
	Role             string
	JoinedAt         time.Time
	AccessSources    []string
	InChannel        *bool
}

// WorkspaceMemberPage is one bounded page of human workspace members.
type WorkspaceMemberPage struct {
	Members    []WorkspaceMember
	HasMore    bool
	NextCursor string
}

// WorkspaceMemberListOptions bounds workspace member directory requests.
type WorkspaceMemberListOptions struct {
	Limit          int
	Cursor         string
	Query          string
	ExcludeUserIDs []string
}

// WorkspaceMemberLookupOptions bounds workspace member identity lookup requests.
type WorkspaceMemberLookupOptions struct {
	MemberIDs []string
	UserIDs   []string
}

// WorkspaceUsage is the response body for GET /workspaces/:workspaceId/usage.
type WorkspaceUsage struct {
	MachineCount int64
	AgentCount   int64
	ChannelCount int64
}

// WorkspaceMemberOffboardingImpact summarizes resources removed with a member.
type WorkspaceMemberOffboardingImpact struct {
	MachineCount int64
	AgentCount   int64
}
