package serviceaccount

import "time"

// Account is one workspace-local service-account instance. PrincipalID equals
// ID for workspace-owned accounts and points to the global platform principal
// for platform-owned instances.
type Account struct {
	ID                            string
	PrincipalID                   string
	WorkspaceID                   string
	ManagementKind                string
	PlatformServiceAccountID      string
	ServiceInstallationID         string
	ServiceMemberID               string
	AuthorMemberID                string
	MessageScopeID                string
	Name                          string
	Description                   string
	AvatarAssetID                 string
	AvatarURL                     string
	AppliedPlatformProfileVersion int64
	AudiencePolicyVersion         int64
	EffectiveAudienceVersion      int64
	AudienceState                 string
	Version                       int64
	CreatedByMemberID             string
	CreatedByOperatorUserID       string
	CreatedAt                     time.Time
	UpdatedAt                     time.Time
}

type AccountInsert struct {
	Account
}

type ManagerAssignment struct {
	ID                 string
	WorkspaceID        string
	ServiceAccountID   string
	MemberID           string
	Status             string
	Version            int64
	GrantedByMemberID  string
	GrantedByActorType string
	GrantedByActorID   string
	CreatedAt          time.Time
	UpdatedAt          time.Time
	EndedAt            *time.Time
}

type ManagerUpsert struct {
	ID                 string
	WorkspaceID        string
	ServiceAccountID   string
	MemberID           string
	GrantedByMemberID  string
	GrantedByActorType string
	GrantedByActorID   string
	Now                time.Time
}

type CreateRequest struct {
	ID                       string
	WorkspaceID              string
	RequestedByMemberID      string
	RequestVersion           int64
	ClientRequestID          string
	PayloadSnapshot          []byte
	PayloadDigest            string
	AuthorizationPath        string
	BusinessState            string
	ApprovalInstanceID       string
	ConsumedDecisionVersion  int64
	CancelClientMutationID   string
	CancelPayloadDigest      string
	CancelApprovalReceiptRef string
	CancelResultVersion      int64
	CreatedServiceAccountID  string
	Version                  int64
	CreatedAt                time.Time
	UpdatedAt                time.Time
	CancelledAt              *time.Time
	FulfilledAt              *time.Time
}

type CreateRequestInsert struct {
	ID                  string
	WorkspaceID         string
	RequestedByMemberID string
	ClientRequestID     string
	PayloadSnapshot     []byte
	PayloadDigest       string
	AuthorizationPath   string
	BusinessState       string
	Now                 time.Time
}

type PlatformAccount struct {
	ID                            string
	Name                          string
	Description                   string
	AvatarAssetID                 string
	ProfileVersion                int64
	Version                       int64
	ProvisioningMode              string
	ProvisioningState             string
	AppliedProvisioningGeneration int64
	AudiencePolicyVersion         int64
	LatestBroadcastSeq            int64
	CreatedByOperatorUserID       string
	CreatedAt                     time.Time
	UpdatedAt                     time.Time
}

type PlatformWorkspaceInstance struct {
	ID                           string
	PlatformServiceAccountID     string
	WorkspaceID                  string
	LocalServiceAccountID        string
	OpenedProvisioningGeneration int64
	EffectiveFromBroadcastSeq    int64
	EffectiveToBroadcastSeq      *int64
	LastAppliedBroadcastSeq      int64
	AppliedProfileVersion        int64
	ProvisioningState            string
	Version                      int64
	CreatedAt                    time.Time
	UpdatedAt                    time.Time
}

// PlatformProvisioningInput is the durable cross-product input joining one
// platform principal to one workspace at a monotonic generation boundary.
type PlatformProvisioningInput struct {
	ID                       string
	PlatformServiceAccountID string
	WorkspaceID              string
	Generation               int64
	SourceKind               string
	State                    string
	AttemptCount             int64
	LastError                string
	Version                  int64
	CreatedAt                time.Time
	UpdatedAt                time.Time
	AppliedAt                *time.Time
}

// PlatformBroadcast is one immutable platform MessagePlan plus its source
// ordering, target-generation fence, enumeration cursor, and aggregate state.
type PlatformBroadcast struct {
	ID                             string
	PlatformServiceAccountID       string
	OperatorPrincipalID            string
	ClientBroadcastID              string
	AcceptanceOrdinal              int64
	RequiredProvisioningGeneration int64
	BroadcastSeq                   *int64
	PayloadSnapshot                []byte
	PayloadDigest                  string
	State                          string
	EnumerationAfterWorkspaceID    string
	EnumerationComplete            bool
	TargetCount                    int64
	DeliveredCount                 int64
	SkippedCount                   int64
	ExceptionCount                 int64
	Version                        int64
	CorrelationID                  string
	CreatedAt                      time.Time
	UpdatedAt                      time.Time
	AllocatedAt                    *time.Time
	CompletedAt                    *time.Time
	ClosedAt                       *time.Time
}

// PlatformBroadcastDelivery is one workspace-owned execution and settlement
// ledger row for a platform broadcast sequence.
type PlatformBroadcastDelivery struct {
	ID                             string
	BroadcastID                    string
	PlatformServiceAccountID       string
	WorkspaceID                    string
	LocalServiceAccountID          string
	BroadcastSeq                   int64
	RequiredProvisioningGeneration int64
	RecipientEligible              bool
	State                          string
	AttemptCount                   int64
	LeaseToken                     string
	LeaseExpiresAt                 *time.Time
	NextAttemptAt                  time.Time
	PlacementEpoch                 int64
	LocalMessageID                 string
	Outcome                        string
	LastError                      string
	Version                        int64
	CreatedAt                      time.Time
	UpdatedAt                      time.Time
	CompletedAt                    *time.Time
}

// PlatformDeletionDelivery is a durable workspace-owner notification whose identity
// fields are immutable snapshots. They deliberately remain usable after the
// platform account, local account, principal projection, and message scope
// have been deleted.
type PlatformDeletionDelivery struct {
	ID                             string
	WorkspaceID                    string
	PlatformServiceAccountID       string
	LocalServiceAccountID          string
	LocalServiceAccountPrincipalID string
	MessageScopeID                 string
	AttemptCount                   int64
	NextAttemptAt                  time.Time
	LeaseToken                     string
	LeaseExpiresAt                 *time.Time
	LastError                      string
	CreatedAt                      time.Time
	UpdatedAt                      time.Time
}

// PlatformDeletionDeliveryInsert captures one local instance immediately before the
// source rows are permanently deleted in the same transaction.
type PlatformDeletionDeliveryInsert struct {
	ID                             string
	WorkspaceID                    string
	PlatformServiceAccountID       string
	LocalServiceAccountID          string
	LocalServiceAccountPrincipalID string
	MessageScopeID                 string
	Now                            time.Time
}

// PlatformDeletionDeliveryCandidate is the bounded routing projection used before a
// workspace owner attempts an atomic lease.
type PlatformDeletionDeliveryCandidate struct {
	ID          string
	WorkspaceID string
}

// PlatformDeliveryAsset maps one immutable broadcast asset ordinal to its
// workspace-local attachment projection.
type PlatformDeliveryAsset struct {
	DeliveryID        string
	AssetOrdinal      int
	SourceAssetRef    string
	ContentHash       string
	MediaType         string
	SizeBytes         int64
	LocalAttachmentID string
	State             string
	Version           int64
	CreatedAt         time.Time
	UpdatedAt         time.Time
}

type AuditEvent struct {
	ID                       string
	WorkspaceID              string
	ServiceAccountID         string
	PlatformServiceAccountID string
	EventType                string
	SubjectType              string
	SubjectID                string
	SubjectVersion           int64
	ActorType                string
	ActorID                  string
	CausedByActorType        string
	CausedByActorID          string
	ExecutionActorType       string
	ExecutionActorID         string
	PermissionBasisKind      string
	PermissionBasisRef       string
	CorrelationID            string
	Metadata                 []byte
	CreatedAt                time.Time
}
