namespace DodoSSH.Domain;

/// <summary>Lifecycle state of a user account.</summary>
public enum UserStatus
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Normal, active account.</summary>
    Active = 1,

    /// <summary>Sign-in blocked, data retained.</summary>
    Suspended = 2,

    /// <summary>Offboarded. Grants revoked; audit history retained.</summary>
    Deprovisioned = 3,
}

/// <summary>
/// Which key the user's secret bundle is wrapped under.
/// </summary>
/// <remarks>
/// Every kind wraps the <em>same</em> bundle, which is what makes a passphrase change a
/// single-row update instead of a re-encryption of the whole vault. See docs/crypto.md §3.
/// </remarks>
public enum UserKeyWrapKind
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Wrapped under a key derived from the vault passphrase.</summary>
    Passphrase = 1,

    /// <summary>Sealed to one enrolled device's public key.</summary>
    Device = 2,

    /// <summary>Wrapped under a key derived from the printable recovery code.</summary>
    Recovery = 3,

    /// <summary>Sealed to a team break-glass key. Opt-in; M5.</summary>
    Escrow = 4,
}

/// <summary>Operating system family of an enrolled device, for display only.</summary>
public enum DevicePlatform
{
    /// <summary>Unknown or unreported.</summary>
    Unspecified = 0,

    /// <summary>Windows.</summary>
    Windows = 1,

    /// <summary>macOS.</summary>
    MacOs = 2,

    /// <summary>Linux.</summary>
    Linux = 3,
}

/// <summary>A member's role within a team.</summary>
public enum TeamRole
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Read-only.</summary>
    Viewer = 10,

    /// <summary>Ordinary member.</summary>
    Member = 20,

    /// <summary>May manage members and create vaults.</summary>
    Admin = 30,

    /// <summary>Sole owner. Transferable.</summary>
    Owner = 40,
}

/// <summary>State of a team membership.</summary>
public enum MembershipStatus
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Invited but not yet accepted.</summary>
    Invited = 1,

    /// <summary>Active member.</summary>
    Active = 2,

    /// <summary>Revoked. Retained so audit history stays resolvable.</summary>
    Revoked = 3,
}

/// <summary>Whether a vault belongs to one user or to a team.</summary>
public enum VaultOwnerKind
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Owned by a single user.</summary>
    Personal = 1,

    /// <summary>Owned by a team.</summary>
    Team = 2,
}

/// <summary>Why a vault key grant exists.</summary>
/// <remarks>
/// Present from the first migration on purpose. Recovery is not a feature that can be bolted on
/// later: the schema has to allow a vault key to be wrapped to something other than a member
/// from the outset, or every existing vault becomes unrecoverable by design.
/// </remarks>
public enum GrantKind
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Wrapped to a member's identity key.</summary>
    Member = 1,

    /// <summary>Wrapped to a recovery key held by the vault owner.</summary>
    Recovery = 2,

    /// <summary>Wrapped to a team break-glass key. Opt-in; M5.</summary>
    Escrow = 3,
}

/// <summary>State of a vault key grant.</summary>
public enum GrantState
{
    /// <summary>Not a legal value.</summary>
    Unspecified = 0,

    /// <summary>Usable.</summary>
    Active = 1,

    /// <summary>
    /// The recipient's identity key changed or the vault was rekeyed, so this grant must be
    /// re-wrapped by a member holding Share before the recipient can read the vault again.
    /// </summary>
    AwaitingRewrap = 2,

    /// <summary>
    /// Revoked. Blocks future reads only; anything already downloaded is already gone. See
    /// ADR 0001.
    /// </summary>
    Revoked = 3,
}

/// <summary>Why a vault needs rekeying.</summary>
public enum RekeyReason
{
    /// <summary>No rekey pending.</summary>
    None = 0,

    /// <summary>A member was removed.</summary>
    MemberRemoved = 1,

    /// <summary>A member's identity key was rotated.</summary>
    KeyRotated = 2,

    /// <summary>An operator or member requested it.</summary>
    Requested = 3,
}
