package dto

import "time"

// AdminOverview is the API wire system-admin overview metrics payload.
type AdminOverview struct {
	WindowHours             int64 `json:"windowHours"`
	TotalWorkspaces         int64 `json:"totalWorkspaces"`
	NewWorkspaces           int64 `json:"newWorkspaces"`
	ActiveWorkspaces        int64 `json:"activeWorkspaces"`
	TotalUsers              int64 `json:"totalUsers"`
	VerifiedUsers           int64 `json:"verifiedUsers"`
	ActiveUsers             int64 `json:"activeUsers"`
	RecentLoginUsers        int64 `json:"recentLoginUsers"`
	TotalAgents             int64 `json:"totalAgents"`
	ActiveAgents            int64 `json:"activeAgents"`
	TotalMachines           int64 `json:"totalMachines"`
	OnlineMachines          int64 `json:"onlineMachines"`
	PendingWorkspaceInvites int64 `json:"pendingWorkspaceInvites"`
	MessageCount            int64 `json:"messageCount"`
	HumanMessageCount       int64 `json:"humanMessageCount"`
	AgentMessageCount       int64 `json:"agentMessageCount"`
}

// AdminOverviewResponse is returned by the system-admin dashboard overview endpoint.
type AdminOverviewResponse struct {
	Window   string        `json:"window"`
	Overview AdminOverview `json:"overview"`
}

// AdminWorkspaceSummary is one system-admin workspace list row.
type AdminWorkspaceSummary struct {
	ID                 string     `json:"id"`
	Slug               string     `json:"slug"`
	Name               string     `json:"name"`
	OwnerUserID        string     `json:"ownerUserId"`
	OwnerEmail         string     `json:"ownerEmail"`
	OwnerDisplayName   string     `json:"ownerDisplayName"`
	CreatedAt          time.Time  `json:"createdAt"`
	HumanMemberCount   int64      `json:"humanMemberCount"`
	AgentCount         int64      `json:"agentCount"`
	MachineCount       int64      `json:"machineCount"`
	ChannelCount       int64      `json:"channelCount"`
	PendingInviteCount int64      `json:"pendingInviteCount"`
	MessageCount       int64      `json:"messageCount"`
	LastMessageAt      *time.Time `json:"lastMessageAt,omitempty"`
	LastHumanMessageAt *time.Time `json:"lastHumanMessageAt,omitempty"`
	LastAgentMessageAt *time.Time `json:"lastAgentMessageAt,omitempty"`
}

// AdminUserSummary is one system-admin user list row.
type AdminUserSummary struct {
	ID                  string     `json:"id"`
	Email               string     `json:"email"`
	Name                string     `json:"name"`
	DisplayName         string     `json:"displayName"`
	IsAdmin             bool       `json:"isAdmin"`
	EmailVerified       bool       `json:"emailVerified"`
	CreatedAt           time.Time  `json:"createdAt"`
	WorkspaceCount      int64      `json:"workspaceCount"`
	OwnedWorkspaceCount int64      `json:"ownedWorkspaceCount"`
	LastLoginAt         *time.Time `json:"lastLoginAt,omitempty"`
	LastHumanMessageAt  *time.Time `json:"lastHumanMessageAt,omitempty"`
}

// AdminRegistrationAllowlistCreateRequest creates a registration allowlist entry.
type AdminRegistrationAllowlistCreateRequest struct {
	Pattern   string `json:"pattern"`
	Reason    string `json:"reason"`
	ExpiresAt string `json:"expiresAt"`
}

// AdminRegistrationAllowlistEntry is one system-admin registration allowlist row.
type AdminRegistrationAllowlistEntry struct {
	ID                   string     `json:"id"`
	Pattern              string     `json:"pattern"`
	Reason               string     `json:"reason"`
	CreatedByUserID      string     `json:"createdByUserId"`
	CreatedByEmail       string     `json:"createdByEmail"`
	CreatedByDisplayName string     `json:"createdByDisplayName"`
	CreatedAt            time.Time  `json:"createdAt"`
	UpdatedAt            time.Time  `json:"updatedAt"`
	ExpiresAt            *time.Time `json:"expiresAt,omitempty"`
	DisabledAt           *time.Time `json:"disabledAt,omitempty"`
}

// AdminHostedCreditGrantCreateRequest creates an operator-originated hosted credit grant.
type AdminHostedCreditGrantCreateRequest struct {
	CreditAmount      int64  `json:"creditAmount,omitempty"`
	CreditAmountAtoms int64  `json:"creditAmountAtoms,omitempty"`
	GrantSourceType   string `json:"grantSourceType,omitempty"`
	GrantReasonRef    string `json:"grantReasonRef"`
	Refundable        bool   `json:"refundable,omitempty"`
	ExpiresAt         string `json:"expiresAt,omitempty"`
	SourceRef         string `json:"sourceRef,omitempty"`
}

// AdminHostedCreditGrantResponse is the system-admin view of a MaaS hosted credit grant.
type AdminHostedCreditGrantResponse struct {
	GrantID           string     `json:"grantId"`
	OperationID       string     `json:"operationId"`
	Created           bool       `json:"created"`
	OrganizationID    string     `json:"organizationId"`
	CreditUnit        string     `json:"creditUnit"`
	CreditAmount      int64      `json:"creditAmount"`
	CreditAmountAtoms int64      `json:"creditAmountAtoms"`
	GrantSourceType   string     `json:"grantSourceType"`
	GrantReasonRef    string     `json:"grantReasonRef"`
	Refundable        bool       `json:"refundable"`
	ExpiresAt         *time.Time `json:"expiresAt,omitempty"`
	OperatorIdentity  string     `json:"operatorIdentity,omitempty"`
	SourceRef         string     `json:"sourceRef,omitempty"`
	CreatedAt         time.Time  `json:"createdAt"`
	UpdatedAt         time.Time  `json:"updatedAt"`
}

// OrganizationPlanView is the browser-facing organization plan/quota state.
type OrganizationPlanView struct {
	OrganizationID string           `json:"organizationId"`
	PlanKey        string           `json:"plan"`
	Status         string           `json:"status"`
	Usage          map[string]int64 `json:"usage"`
	Limits         map[string]int64 `json:"limits"`
	OverLimit      bool             `json:"overLimit"`
}

// WorkspaceUsageView is the browser-facing workspace usage response.
type WorkspaceUsageView struct {
	MachineCount int64                `json:"machineCount"`
	AgentCount   int64                `json:"agentCount"`
	ChannelCount int64                `json:"channelCount"`
	Organization OrganizationPlanView `json:"organization"`
}

// AdminDBPoolConfig is the browser-facing runtime database pool config shape.
type AdminDBPoolConfig struct {
	MaxOpenConns    int    `json:"maxOpenConns"`
	MaxIdleConns    int    `json:"maxIdleConns"`
	ConnMaxLifetime string `json:"connMaxLifetime"`
	ConnMaxIdleTime string `json:"connMaxIdleTime"`
}

// AdminDBPoolStats is the browser-facing runtime database pool stats shape.
type AdminDBPoolStats struct {
	MaxOpenConnections int    `json:"maxOpenConnections"`
	OpenConnections    int    `json:"openConnections"`
	InUse              int    `json:"inUse"`
	Idle               int    `json:"idle"`
	WaitCount          int64  `json:"waitCount"`
	WaitDuration       string `json:"waitDuration"`
	MaxIdleClosed      int64  `json:"maxIdleClosed"`
	MaxIdleTimeClosed  int64  `json:"maxIdleTimeClosed"`
	MaxLifetimeClosed  int64  `json:"maxLifetimeClosed"`
}

// AdminDBPoolResponse is returned by the runtime DB pool admin endpoints.
type AdminDBPoolResponse struct {
	Config AdminDBPoolConfig `json:"config"`
	Stats  AdminDBPoolStats  `json:"stats"`
}

// AdminDBPoolPatchRequest updates one or more runtime DB pool settings.
type AdminDBPoolPatchRequest struct {
	MaxOpenConns    *int    `json:"maxOpenConns"`
	MaxIdleConns    *int    `json:"maxIdleConns"`
	ConnMaxLifetime *string `json:"connMaxLifetime"`
	ConnMaxIdleTime *string `json:"connMaxIdleTime"`
}

// WorkspaceGroupsResponse is returned by the internal group list endpoint.
type WorkspaceGroupsResponse struct {
	Groups []WorkspaceGroup `json:"groups"`
}

// WorkspaceGroupResponse is returned by internal group mutation endpoints.
type WorkspaceGroupResponse struct {
	Group WorkspaceGroup `json:"group"`
}

// WorkspaceGroup is the internal admin API shape for one workspace group.
type WorkspaceGroup struct {
	WorkspaceGroupID string    `json:"workspaceGroupId"`
	DisplayName      string    `json:"displayName"`
	State            string    `json:"state"`
	ResourceProfile  string    `json:"resourceProfile,omitempty"`
	ServiceRef       string    `json:"serviceRef,omitempty"`
	CreatedAt        time.Time `json:"createdAt"`
	UpdatedAt        time.Time `json:"updatedAt"`
}

// WorkspaceGroupCreateRequest creates a workspace group through internal admin.
type WorkspaceGroupCreateRequest struct {
	WorkspaceGroupID string `json:"workspaceGroupId"`
	ID               string `json:"id,omitempty"`
	DisplayName      string `json:"displayName"`
	ResourceProfile  string `json:"resourceProfile"`
	ServiceRef       string `json:"serviceRef"`
}

// WorkspacePlacementsResponse is returned by the internal placement list endpoint.
type WorkspacePlacementsResponse struct {
	Placements []WorkspacePlacement `json:"placements"`
}

// WorkspacePlacement is the internal admin API shape for one placement row.
type WorkspacePlacement struct {
	WorkspaceID      string    `json:"workspaceId"`
	WorkspaceGroupID string    `json:"workspaceGroupId"`
	State            string    `json:"state"`
	PlacementEpoch   int64     `json:"placementEpoch"`
	CreatedAt        time.Time `json:"createdAt"`
	UpdatedAt        time.Time `json:"updatedAt"`
}

// WorkspacePlacementVerification is the multi-group internal admin verify response.
type WorkspacePlacementVerification struct {
	TotalWorkspaceCount         int64 `json:"totalWorkspaceCount"`
	WorkspaceGroupCount         int64 `json:"workspaceGroupCount"`
	ActiveWorkspaceGroupCount   int64 `json:"activeWorkspaceGroupCount"`
	PlacementCount              int64 `json:"placementCount"`
	MissingPlacementCount       int64 `json:"missingPlacementCount"`
	UnknownGroupCount           int64 `json:"unknownGroupCount,omitempty"`
	UnknownGroupPlacementCount  int64 `json:"unknownGroupPlacementCount"`
	InactiveGroupPlacementCount int64 `json:"inactiveGroupPlacementCount"`
	InactivePlacementCount      int64 `json:"inactivePlacementCount"`
	MalformedPlacementCount     int64 `json:"malformedPlacementCount"`
	StaleMigrationCount         int64 `json:"staleMigrationCount,omitempty"`
	ActiveMigrationCount        int64 `json:"activeMigrationCount"`
}

// WorkspacePlacementVerificationRequest controls optional verify output.
type WorkspacePlacementVerificationRequest struct {
	WorkspaceGroupID string `json:"workspaceGroupId,omitempty"`
	IncludeReadiness bool   `json:"includeReadiness,omitempty"`
}

// WorkspacePlacementMigrationResponse is returned by migration endpoints.
type WorkspacePlacementMigrationResponse struct {
	Migration WorkspacePlacementMigration `json:"migration"`
}

// WorkspaceActiveMigrationResponse is returned when querying one workspace's current migration.
type WorkspaceActiveMigrationResponse struct {
	Migration *WorkspacePlacementMigration `json:"migration"`
}

// WorkspacePlacementMigration is the internal admin API shape for a migration.
type WorkspacePlacementMigration struct {
	MigrationID           string     `json:"migrationId"`
	WorkspaceID           string     `json:"workspaceId"`
	SourceGroupID         string     `json:"sourceGroupId"`
	TargetGroupID         string     `json:"targetGroupId"`
	State                 string     `json:"state"`
	PlacementEpochStart   int64      `json:"placementEpochStart"`
	PlacementEpochCurrent int64      `json:"placementEpochCurrent"`
	RequestedBy           string     `json:"requestedBy"`
	Reason                string     `json:"reason"`
	LastError             string     `json:"lastError,omitempty"`
	CreatedAt             time.Time  `json:"createdAt"`
	UpdatedAt             time.Time  `json:"updatedAt"`
	CompletedAt           *time.Time `json:"completedAt,omitempty"`
}

// WorkspacePlacementMigrationStartRequest starts a workspace placement migration.
type WorkspacePlacementMigrationStartRequest struct {
	WorkspaceID   string `json:"workspaceId"`
	SourceGroupID string `json:"sourceGroupId"`
	TargetGroupID string `json:"targetGroupId"`
	RequestedBy   string `json:"requestedBy,omitempty"`
	Reason        string `json:"reason"`
}

// WorkspaceResponse is the browser-facing workspace summary shape.
type WorkspaceResponse struct {
	ID                string                 `json:"id"`
	Slug              string                 `json:"slug"`
	Name              string                 `json:"name"`
	Role              string                 `json:"role,omitempty"`
	MemberID          string                 `json:"memberId,omitempty"`
	MemberDisplayName string                 `json:"memberDisplayName,omitempty"`
	Plan              string                 `json:"plan,omitempty"`
	HasUnread         bool                   `json:"hasUnread"`
	UnreadCount       int64                  `json:"unreadCount,omitempty"`
	Capabilities      *WorkspaceCapabilities `json:"capabilities,omitempty"`
}

// WorkspaceCapabilities advertises workspace-scoped feature availability to
// clients. Desktop reads this to decide whether to initiate optional flows
// such as the Memory agent-access batch pull. Values are derived from
// deployment-level configuration today; per-workspace toggles may be added
// later without changing the shape.
type WorkspaceCapabilities struct {
	// Memory advertises the AgentTeam Memory subsystem. When nil, clients treat
	// Memory as unavailable and skip Memory-dependent flows.
	Memory *WorkspaceMemoryCapability `json:"memory,omitempty"`
	// Roles advertises the MeshX Role library and Role-backed Create Agent
	// picker. When nil, clients hide the optional existing-role flow.
	Roles *WorkspaceRoleCapability `json:"roles,omitempty"`
}

// WorkspaceMemoryCapability advertises Memory availability for the workspace.
type WorkspaceMemoryCapability struct {
	// Enabled indicates whether MeshX-backed Memory endpoints
	// (/api/v1/memory/*) and the AGS git-clone pathway should be considered
	// live for this workspace.
	Enabled bool `json:"enabled"`
}

// WorkspaceRoleCapability advertises MeshX Role availability for the workspace.
type WorkspaceRoleCapability struct {
	// Enabled indicates whether MeshX-backed Role endpoints (/api/v1/roles/*)
	// and preset/my-role picker flows should be considered live.
	Enabled bool `json:"enabled"`
}

// WorkspaceCreateRequest creates a workspace.
type WorkspaceCreateRequest struct {
	OrganizationID string `json:"organizationId"`
	Name           string `json:"name"`
	Slug           string `json:"slug"`
}

// WorkspaceUpdateRequest updates a workspace.
type WorkspaceUpdateRequest struct {
	Name string `json:"name"`
}

// WorkspaceMemberRoleUpdateRequest updates a workspace member role.
type WorkspaceMemberRoleUpdateRequest struct {
	Role string `json:"role"`
}

// WorkspaceMemberOffboardingImpactResponse reports resources affected by removing a member.
type WorkspaceMemberOffboardingImpactResponse struct {
	MachineCount int64 `json:"machineCount"`
	AgentCount   int64 `json:"agentCount"`
}

// WorkspaceMemberLookupRequest requests bounded workspace member identity hydration.
type WorkspaceMemberLookupRequest struct {
	MemberIDs []string `json:"memberIds"`
	UserIDs   []string `json:"userIds"`
}

// WorkspaceMemberSearchRequest searches the workspace member directory with
// filters that do not belong in a URL query string.
type WorkspaceMemberSearchRequest struct {
	Query          string   `json:"query"`
	Limit          int      `json:"limit"`
	Cursor         string   `json:"cursor"`
	ExcludeUserIDs []string `json:"excludeUserIds"`
}

// WorkspaceInviteCreateRequest invites a user to a workspace.
type WorkspaceInviteCreateRequest struct {
	Identifier string `json:"identifier"`
	Email      string `json:"email,omitempty"`
	Mobile     string `json:"mobile,omitempty"`
}

// WorkspaceInviteCreateResponse returns the stable invite link generated for a new invite.
type WorkspaceInviteCreateResponse struct {
	InviteID   string `json:"inviteId"`
	InviteLink string `json:"inviteLink"`
}

// RuntimeDefaults describes default runtime model settings for one runtime.
type RuntimeDefaults struct {
	Model           string `json:"model"`
	ReasoningEffort string `json:"reasoningEffort"`
}

// Machine is the API wire shape for workspace machines.
type Machine struct {
	ID                       string                     `json:"id"`
	Name                     string                     `json:"name"`
	Status                   string                     `json:"status"`
	APIKeyPrefix             string                     `json:"apiKeyPrefix"`
	CanManage                bool                       `json:"canManage"`
	Hostname                 string                     `json:"hostname,omitempty"`
	OS                       string                     `json:"os,omitempty"`
	DaemonVersion            string                     `json:"daemonVersion,omitempty"`
	Runtimes                 []string                   `json:"runtimes"`
	RuntimeDefaults          map[string]RuntimeDefaults `json:"runtimeDefaults"`
	CreatedAt                time.Time                  `json:"createdAt"`
	CreatedByUserID          string                     `json:"createdByUserId,omitempty"`
	DirectoryBrowseSupported bool                       `json:"directoryBrowseSupported"`
	DashboardSupported       bool                       `json:"dashboardSupported"`
}

// CreateMachineResponse is the wire response for creating a machine.
type CreateMachineResponse struct {
	Machine Machine `json:"machine"`
	APIKey  string  `json:"apiKey"`
}

// MachinesListResponse is the wire response for listing workspace machines.
type MachinesListResponse struct {
	Machines            []Machine `json:"machines"`
	LatestDaemonVersion string    `json:"latestDaemonVersion"`
	HasMore             bool      `json:"hasMore"`
	NextCursor          string    `json:"nextCursor,omitempty"`
}

// MachineNameRequest creates or renames a machine.
type MachineNameRequest struct {
	Name string `json:"name"`
}

// MachineDirectoryListRequest is the body of POST
// /api/v1/workspaces/:workspaceId/machines/:machineId/directories:list.
//
// Path is forwarded byte-for-byte (no server-side trimming); the daemon's
// path-resolution layer is the single authority on what "valid" means.
// Cursor carries the canonical raw offset form ("", "0", or [1-9][0-9]*
// up to 1000). Limit defaults to 50 and caps at 200 when zero or negative.
type MachineDirectoryListRequest struct {
	Path   string `json:"path"`
	Limit  int    `json:"limit"`
	Cursor string `json:"cursor"`
}

// MachineDirectoryResponse is one browsable directory row.
type MachineDirectoryResponse struct {
	Name string `json:"name"`
	Path string `json:"path"`
}

// MachineDirectoryListResponse is the wire response for the machine
// directory browse endpoint. Empty arrays and strings MUST be serialized
// as `[]` and `""` (not omitted) so Web clients can render empty state
// without truthy/falsy branching.
type MachineDirectoryListResponse struct {
	CurrentPath string                     `json:"currentPath"`
	ParentPath  string                     `json:"parentPath"`
	Directories []MachineDirectoryResponse `json:"directories"`
	Limit       int                        `json:"limit"`
	Cursor      string                     `json:"cursor"`
	HasMore     bool                       `json:"hasMore"`
	NextCursor  string                     `json:"nextCursor"`
	Truncated   bool                       `json:"truncated"`
}

// MachineRotateKeyResponse returns the new machine API key.
type MachineRotateKeyResponse struct {
	APIKey string `json:"apiKey"`
}

// MachineWorkspaceResponse is one workspace directory discovered on a machine.
type MachineWorkspaceResponse struct {
	DirectoryName  string    `json:"directoryName"`
	Status         string    `json:"status"`
	AgentName      string    `json:"agentName,omitempty"`
	TotalSizeBytes int64     `json:"totalSizeBytes"`
	LastModified   time.Time `json:"lastModified"`
	FileCount      int64     `json:"fileCount"`
}

// MachineWorkspacesListResponse is the paged wire response for scanned
// machine workspace directories.
type MachineWorkspacesListResponse struct {
	Workspaces []MachineWorkspaceResponse `json:"workspaces"`
	Limit      int                        `json:"limit"`
	Cursor     string                     `json:"cursor,omitempty"`
	HasMore    bool                       `json:"hasMore"`
	NextCursor string                     `json:"nextCursor,omitempty"`
}

// MachineEvictResponse reports the result of evicting a machine from a workspace.
type MachineEvictResponse struct {
	Evicted        bool     `json:"evicted"`
	MachineID      string   `json:"machineId"`
	AffectedAgents []string `json:"affectedAgents"`
}

// MachineConnectTokenRequest creates a one-time connect token.
type MachineConnectTokenRequest struct {
	ServerURL string `json:"serverUrl"`
}

// MachineConnectTokenResponse is the wire response for a one-time connect token.
type MachineConnectTokenResponse struct {
	Token string `json:"token"`
}

// MiniappPairingIssueRequest is the body for POST /api/v1/workspaces/:workspaceId/miniapp-pairing-codes.
type MiniappPairingIssueRequest struct {
	ServerURL string `json:"serverUrl"`
}

// MiniappPairingIssueResponse is the wire response for a fresh miniapp pairing code.
type MiniappPairingIssueResponse struct {
	Code      string `json:"code"`
	ExpiresAt string `json:"expiresAt"`
}

// MiniappPairingExchangeRequest is the body for POST /api/v1/miniapp-pairing-exchanges.
type MiniappPairingExchangeRequest struct {
	Code           string `json:"code"`
	InstallationID string `json:"installationId"`
	DeviceName     string `json:"deviceName"`
	DevicePlatform string `json:"devicePlatform"`
}

// MiniappPairingExchangeResponse hands the miniapp a fresh session plus the
// workspace context it needs to skip a separate workspace lookup.
type MiniappPairingExchangeResponse struct {
	AccessToken   string       `json:"accessToken"`
	RefreshToken  string       `json:"refreshToken"`
	User          UserResponse `json:"user"`
	WorkspaceID   string       `json:"workspaceId"`
	WorkspaceName string       `json:"workspaceName"`
	ServerURL     string       `json:"serverUrl"`
}

// MachineConnectExchangeRequest exchanges a one-time connect token for machine credentials.
type MachineConnectExchangeRequest struct {
	Token string `json:"token"`
}

// MachineConnectExchangeResponse is the wire response for exchanging a connect token.
type MachineConnectExchangeResponse struct {
	MachineID   string `json:"machineId"`
	APIKey      string `json:"apiKey"`
	ServerURL   string `json:"serverUrl"`
	WorkspaceID string `json:"workspaceId,omitempty"`
}

// MachineAuthResolveRequest resolves a machine API key into its server-side identity.
type MachineAuthResolveRequest struct {
	APIKey    string `json:"apiKey"`
	ServerURL string `json:"serverUrl"`
}

// MachineAuthResolveResponse is the wire response for resolving machine auth.
type MachineAuthResolveResponse struct {
	MachineID   string `json:"machineId"`
	APIKey      string `json:"apiKey"`
	ServerURL   string `json:"serverUrl"`
	WorkspaceID string `json:"workspaceId"`
}

// WorkspaceMemberResponse is the browser-facing workspace member shape.
type WorkspaceMemberResponse struct {
	UserID           string    `json:"userId"`
	Email            string    `json:"email"`
	Name             string    `json:"name"`
	DisplayName      string    `json:"displayName"`
	MemberID         string    `json:"memberId,omitempty"`
	LegacyTargetKeys []string  `json:"legacyTargetKeys,omitempty"`
	AvatarURL        string    `json:"avatarUrl"`
	Role             string    `json:"role"`
	JoinedAt         time.Time `json:"joinedAt"`
	AccessSources    []string  `json:"accessSources"`
	InChannel        *bool     `json:"inChannel,omitempty"`
}

// WorkspaceMemberPageResponse is one bounded page of workspace members.
type WorkspaceMemberPageResponse struct {
	Members    []WorkspaceMemberResponse `json:"members"`
	HasMore    bool                      `json:"hasMore"`
	NextCursor string                    `json:"nextCursor"`
}

// WorkspaceInviteResponse is the pending invite list item shape.
type WorkspaceInviteResponse struct {
	ID                string    `json:"id"`
	InvitedEmail      string    `json:"invitedEmail,omitempty"`
	InvitedMobileHint string    `json:"invitedMobileHint,omitempty"`
	CreatedAt         time.Time `json:"createdAt"`
	InviteLink        string    `json:"inviteLink,omitempty"`
}

type WorkspaceInvitePageResponse struct {
	Invites    []WorkspaceInviteResponse `json:"invites"`
	HasMore    bool                      `json:"hasMore"`
	NextCursor string                    `json:"nextCursor"`
}
