module LaunchDarkly.Server.Client.Status
    ( Status(..)
    , transitionStatus
    )
    where

-- | The status of the client initialization.
data Status
    = Uninitialized
      -- ^ The client has not yet finished connecting to LaunchDarkly.
    | Unauthorized
      -- ^ The client attempted to connect to LaunchDarkly and was denied.
    | Initialized
      -- ^ The client has successfuly connected to LaunchDarkly.
    | ShuttingDown
      -- ^ The client is being terminated
    deriving (Show, Eq)

transitionStatus :: Status -> Status -> Status
transitionStatus requestedStatus oldStatus =
    case requestedStatus of
        -- Only allow setting Initialized if Uninitialized
        Initialized   -> if oldStatus == Uninitialized then Initialized  else oldStatus
        -- Only allow setting status if not ShuttingDown
        _             -> if oldStatus == ShuttingDown  then ShuttingDown else requestedStatus