package dto

import "time"

// --- Feishu Enterprise ---

// OrganizationEnterpriseFeishuView is the admin-only credential status surface.
type OrganizationEnterpriseFeishuView struct {
	OrganizationID                string                                   `json:"organizationId"`
	StorageReady                  bool                                     `json:"storageReady"`
	CredentialsConfigured         bool                                     `json:"credentialsConfigured"`
	CredentialSource              string                                   `json:"credentialSource"`
	UpdatedAt                     *time.Time                               `json:"updatedAt"`
	LastValidatedAt               *time.Time                               `json:"lastValidatedAt"`
	AvailableRootDepartments      []OrganizationFeishuDepartmentOptionView `json:"availableRootDepartments"`
	AvailableRootDepartmentsError string                                   `json:"availableRootDepartmentsError"`
}

// OrganizationFeishuDepartmentOptionView is one root department option for Feishu.
type OrganizationFeishuDepartmentOptionView struct {
	DepartmentID string `json:"departmentId"`
	Name         string `json:"name"`
}

// OrganizationFeishuDirectoryImportResult is the result of a Feishu directory import.
type OrganizationFeishuDirectoryImportResult struct {
	SyncRunID               string `json:"syncRunId"`
	ImportedUnitCount       int    `json:"importedUnitCount"`
	ImportedMemberCount     int    `json:"importedMemberCount"`
	ImportedMembershipCount int    `json:"importedMembershipCount"`
}

// --- Settings ---

// OrganizationFeishuProviderSettingsView is the Feishu provider settings surface.
type OrganizationFeishuProviderSettingsView struct {
	TenantKey        string                                   `json:"tenantKey"`
	RootDepartmentID string                                   `json:"rootDepartmentId"`
	HasServerConfig  bool                                     `json:"hasServerConfig"`
	LastSync         *OrganizationDirectorySyncRunSummaryView `json:"lastSync"`
	LastAutoJoin     *OrganizationFeishuAutoJoinStatusView    `json:"lastAutoJoin"`
}

// OrganizationSettingsView is the minimal org settings surface exposed to clients.
type OrganizationSettingsView struct {
	OrganizationID    string                                 `json:"organizationId"`
	DirectoryBackend  string                                 `json:"directoryBackend"`
	DirectoryRevision int64                                  `json:"directoryRevision"`
	AuthProvider      string                                 `json:"authProvider"`
	DirectoryProvider string                                 `json:"directoryProvider"`
	Feishu            OrganizationFeishuProviderSettingsView `json:"feishu"`
}

// --- Directory Sync ---

// OrganizationDirectorySyncRunSummaryView is the latest directory sync summary surfaced to admins.
type OrganizationDirectorySyncRunSummaryView struct {
	SyncRunID         string     `json:"syncRunId"`
	ExternalProvider  string     `json:"externalProvider"`
	SyncSource        string     `json:"syncSource"`
	Status            string     `json:"status"`
	DirectoryRevision int64      `json:"directoryRevision"`
	StartedAt         *time.Time `json:"startedAt"`
	CompletedAt       *time.Time `json:"completedAt"`
}

// OrganizationDirectorySyncRunDetailView explains one sync run plus the
// current objects whose latest provenance still points at that run.
type OrganizationDirectorySyncRunDetailView struct {
	SyncRunID         string     `json:"syncRunId"`
	ExternalProvider  string     `json:"externalProvider"`
	SyncSource        string     `json:"syncSource"`
	Status            string     `json:"status"`
	DirectoryRevision int64      `json:"directoryRevision"`
	StartedAt         *time.Time `json:"startedAt"`
	CompletedAt       *time.Time `json:"completedAt"`
	LinkedTeamCount   int        `json:"linkedTeamCount"`
	LinkedUnitCount   int        `json:"linkedUnitCount"`
	LinkedMemberCount int        `json:"linkedMemberCount"`
}

// OrganizationFeishuAutoJoinStatusView is the latest Feishu auto-join attempt summary.
type OrganizationFeishuAutoJoinStatusView struct {
	Status      string     `json:"status"`
	SubjectType string     `json:"subjectType"`
	SubjectHint string     `json:"subjectHint"`
	Message     string     `json:"message"`
	AttemptedAt *time.Time `json:"attemptedAt"`
}

// --- Sync Metadata ---

// OrganizationSyncMetadata describes provider-owned external directory metadata.
type OrganizationSyncMetadata struct {
	ExternalProvider          string     `json:"externalProvider"`
	ExternalID                string     `json:"externalId"`
	SyncedAt                  *time.Time `json:"syncedAt"`
	SyncMode                  string     `json:"syncMode"`
	SyncSource                string     `json:"syncSource"`
	LastSyncRunID             string     `json:"lastSyncRunId"`
	LastSyncDirectoryRevision int64      `json:"lastSyncDirectoryRevision"`
	LastSyncRunStatus         string     `json:"lastSyncRunStatus"`
	ReadOnly                  bool       `json:"readOnly"`
}

// --- Invite ---

// OrganizationInviteView is the pending org invite item returned to admins.
type OrganizationInviteView struct {
	ID                   string    `json:"id"`
	Email                string    `json:"email"`
	Role                 string    `json:"role"`
	TeamID               string    `json:"teamId"`
	TeamName             string    `json:"teamName"`
	DefaultWorkspaceRole string    `json:"defaultWorkspaceRole"`
	CreatedAt            time.Time `json:"createdAt"`
	ExpiresAt            time.Time `json:"expiresAt"`
}

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

// --- Unit ---

// OrganizationUnitView is the org unit item returned to clients.
type OrganizationUnitView struct {
	ID              string `json:"id"`
	ParentUnitID    string `json:"parentUnitId"`
	ManagerMemberID string `json:"managerMemberId"`
	Name            string `json:"name"`
	Slug            string `json:"slug"`
	Status          string `json:"status"`
	IsDefault       bool   `json:"isDefault"`
	MemberCount     int    `json:"memberCount"`
	OrganizationSyncMetadata
}

// OrganizationUnitMemberView is one member membership in an organization unit.
type OrganizationUnitMemberView struct {
	UnitID          string `json:"unitId"`
	MemberID        string `json:"memberId"`
	UserID          string `json:"userId"`
	Email           string `json:"email"`
	Name            string `json:"name"`
	DisplayName     string `json:"displayName"`
	Source          string `json:"source"`
	Status          string `json:"status"`
	IsPrimary       bool   `json:"isPrimary"`
	PrimaryUnitID   string `json:"primaryUnitId"`
	PrimaryUnitName string `json:"primaryUnitName"`
}

// --- Team ---

// OrganizationTeamView is the org team item returned to clients.
type OrganizationTeamView struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	Slug        string `json:"slug"`
	Description string `json:"description"`
	Status      string `json:"status"`
	Source      string `json:"source"`
	IsDefault   bool   `json:"isDefault"`
	OrganizationSyncMetadata
}

// OrganizationTeamMemberView is one member membership in an organization team.
type OrganizationTeamMemberView struct {
	TeamID          string `json:"teamId"`
	MemberID        string `json:"memberId"`
	UserID          string `json:"userId"`
	Email           string `json:"email"`
	Name            string `json:"name"`
	DisplayName     string `json:"displayName"`
	MembershipRole  string `json:"membershipRole"`
	Source          string `json:"source"`
	Status          string `json:"status"`
	IsPrimary       bool   `json:"isPrimary"`
	PrimaryTeamID   string `json:"primaryTeamId"`
	PrimaryTeamName string `json:"primaryTeamName"`
}

// --- Member ---

// OrganizationMemberView is the org member item returned to clients.
type OrganizationMemberView struct {
	ID                   string                                  `json:"id"`
	UserID               string                                  `json:"userId"`
	Email                string                                  `json:"email"`
	Name                 string                                  `json:"name"`
	DisplayName          string                                  `json:"displayName"`
	PrimaryTeamID        string                                  `json:"primaryTeamId"`
	PrimaryTeamName      string                                  `json:"primaryTeamName"`
	Status               string                                  `json:"status"`
	Role                 string                                  `json:"role"`
	Source               string                                  `json:"source"`
	DefaultWorkspaceRole string                                  `json:"defaultWorkspaceRole"`
	WorkspaceAccessCount int                                     `json:"workspaceAccessCount"`
	WorkspaceAccesses    []OrganizationMemberWorkspaceAccessView `json:"workspaceAccesses"`
	OrganizationSyncMetadata
}

// OrganizationMemberPageResponse is one bounded organization member page.
type OrganizationMemberPageResponse struct {
	Members    []OrganizationMemberView `json:"members"`
	HasMore    bool                     `json:"hasMore"`
	NextCursor string                   `json:"nextCursor"`
}

// OrganizationMemberRemovalImpactResponse is the confirmation payload for
// removing an organization member.
type OrganizationMemberRemovalImpactResponse struct {
	Member             OrganizationMemberView                       `json:"member"`
	BlockingReasons    []OrganizationMemberRemovalBlockerResponse   `json:"blockingReasons"`
	AffectedWorkspaces []OrganizationMemberRemovalWorkspaceResponse `json:"affectedWorkspaces"`
	AgentsToDisable    []OrganizationMemberRemovalAgentResponse     `json:"agentsToDisable"`
	MachinesToRevoke   []OrganizationMemberRemovalMachineResponse   `json:"machinesToRevoke"`
}

// OrganizationMemberRemovalBlockerResponse explains one condition that blocks
// safe member removal.
type OrganizationMemberRemovalBlockerResponse struct {
	Code          string `json:"code"`
	Message       string `json:"message"`
	WorkspaceID   string `json:"workspaceId"`
	WorkspaceName string `json:"workspaceName"`
}

// OrganizationMemberRemovalWorkspaceResponse describes a workspace whose access
// would be reconciled by organization member removal.
type OrganizationMemberRemovalWorkspaceResponse struct {
	ID      string   `json:"id"`
	Name    string   `json:"name"`
	Slug    string   `json:"slug"`
	Role    string   `json:"role"`
	Sources []string `json:"sources"`
}

// OrganizationMemberRemovalAgentResponse describes an active agent that would
// be archived when the owning organization member is removed.
type OrganizationMemberRemovalAgentResponse struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	WorkspaceID string `json:"workspaceId"`
}

// OrganizationMemberRemovalMachineResponse describes an active machine that
// would be revoked when the owning organization member is removed.
type OrganizationMemberRemovalMachineResponse struct {
	ID          string `json:"id"`
	Name        string `json:"name"`
	WorkspaceID string `json:"workspaceId"`
}

// OrganizationMemberRemovalResultResponse is returned after a successful soft
// removal request.
type OrganizationMemberRemovalResultResponse struct {
	MemberID   string     `json:"memberId"`
	Status     string     `json:"status"`
	DisabledAt *time.Time `json:"disabledAt"`
}

// OrganizationMemberWorkspaceAccessView describes one bound workspace that an
// organization member has already entered, plus the active access sources.
type OrganizationMemberWorkspaceAccessView struct {
	WorkspaceID   string   `json:"workspaceId"`
	WorkspaceName string   `json:"workspaceName"`
	WorkspaceSlug string   `json:"workspaceSlug"`
	Role          string   `json:"role"`
	Sources       []string `json:"sources"`
}

// OrganizationMemberUnitView is one unit membership for an organization member.
type OrganizationMemberUnitView struct {
	MemberID     string `json:"memberId"`
	UnitID       string `json:"unitId"`
	UnitName     string `json:"unitName"`
	UnitSlug     string `json:"unitSlug"`
	ParentUnitID string `json:"parentUnitId"`
	Source       string `json:"source"`
	Status       string `json:"status"`
	IsPrimary    bool   `json:"isPrimary"`
}

// --- Workspace ---

// OrganizationWorkspaceView is the organization-bound workspace item returned to clients.
type OrganizationWorkspaceView struct {
	ID               string    `json:"id"`
	Slug             string    `json:"slug"`
	Name             string    `json:"name"`
	BoundAt          time.Time `json:"boundAt"`
	IsDefault        bool      `json:"isDefault"`
	HumanMemberCount int       `json:"humanMemberCount"`
	AgentCount       int       `json:"agentCount"`
}

// OrganizationWorkspaceGrantView describes one member grant into a workspace.
type OrganizationWorkspaceGrantView struct {
	WorkspaceID       string `json:"workspaceId"`
	MemberID          string `json:"memberId"`
	UserID            string `json:"userId"`
	WorkspaceMemberID string `json:"workspaceMemberId"`
	Role              string `json:"role"`
	Source            string `json:"source"`
}

// OrganizationWorkspaceTeamGrantView describes one team grant into a workspace.
type OrganizationWorkspaceTeamGrantView struct {
	WorkspaceID string `json:"workspaceId"`
	TeamID      string `json:"teamId"`
	TeamName    string `json:"teamName"`
	Role        string `json:"role"`
	Source      string `json:"source"`
	Status      string `json:"status"`
	MemberCount int    `json:"memberCount"`
}

// WorkspaceMemberAccessSourceView describes the access sources currently
// explaining one human workspace member inside an org-bound workspace.
type WorkspaceMemberAccessSourceView struct {
	UserID  string   `json:"userId"`
	Sources []string `json:"sources"`
}

// --- Auth Binding ---

// OrganizationAuthBindingView is the auth-side identity mapping kept separate from directory bindings.
type OrganizationAuthBindingView struct {
	ID                   string    `json:"id"`
	OrganizationID       string    `json:"organizationId"`
	OrganizationMemberID string    `json:"organizationMemberId"`
	AuthProvider         string    `json:"authProvider"`
	SubjectKey           string    `json:"subjectKey"`
	SubjectValue         string    `json:"subjectValue"`
	ProviderTenantID     string    `json:"providerTenantId"`
	CreatedAt            time.Time `json:"createdAt"`
	UpdatedAt            time.Time `json:"updatedAt"`
}

// OrganizationSummary is the top-level org item returned to clients.
type OrganizationSummary struct {
	ID            string `json:"id"`
	Slug          string `json:"slug"`
	Name          string `json:"name"`
	Role          string `json:"role"`
	DefaultTeamID string `json:"defaultTeamId"`
}

// --- Dependencies ---

// WorkspaceSummary is the workspace projection organization needs from core store.
type WorkspaceSummary struct {
	WorkspaceID   string `json:"workspaceId"`
	Slug          string `json:"slug"`
	Name          string `json:"name"`
	MemberID      string `json:"memberId"`
	WorkspaceRole string `json:"workspaceRole"`
}

// AgentView is the public API agent item returned after org installs an agent.
type AgentView struct {
	AgentID              string                      `json:"agentId"`
	MemberID             string                      `json:"memberId"`
	DisplayName          string                      `json:"displayName"`
	Description          string                      `json:"description"`
	Runtime              string                      `json:"runtime"`
	PermissionMode       string                      `json:"permissionMode"`
	Model                string                      `json:"model"`
	ReasoningEffort      string                      `json:"reasoningEffort"`
	LLMMode              string                      `json:"llmMode,omitempty"`
	BaseURL              string                      `json:"baseUrl,omitempty"`
	Headers              map[string]string           `json:"headers,omitempty"`
	WireAPI              string                      `json:"wireApi,omitempty"`
	APIKeyConfigured     bool                        `json:"apiKeyConfigured,omitempty"`
	MachineID            string                      `json:"machineId"`
	SourceKind           string                      `json:"sourceKind,omitempty"`
	SourceRef            string                      `json:"sourceRef,omitempty"`
	AutoWakeEnabled      bool                        `json:"autoWakeEnabled"`
	Status               string                      `json:"status"`
	Activity             string                      `json:"activity"`
	ActivityDetail       string                      `json:"activityDetail"`
	SessionID            string                      `json:"sessionId"`
	LatestRuntimeFailure *AgentRuntimeFailureSummary `json:"latestRuntimeFailure,omitempty"`
}
