/*
Copyright 2024 New Vector Ltd.
Copyright 2022 The Matrix.org Foundation C.I.C.

SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/

/**
 * Constants for MatrixChat.state.view.
 *
 * The `View` is the primary state machine of the application: it has different states for the various setup flows
 * that the user may find themselves in. Once we have a functioning client, we can transition to the `LOGGED_IN` state
 * which is the "normal" state of the application.
 *
 * An incomplete state transition diagram follows.
 *
 *                      (initial state)
 *                    ┌─────────────────┐ Lock held by other instance  ┌─────────────────┐
 *                    │    LOADING      │─────────────────────────────►│ CONFIRM_LOCK_   │
 *                    │                 │◄─────────────────────────────│     THEFT       │
 *                    └─────────────────┘ Lock theft confirmed         └─────────────────┘
 *     Session recovered │     │      │                                           Token/OIDC login succeeded
 *        ┌──────────────┘     │      └──────────────────────────────────────────────────────────────────┐
 *        │                    └───────────────────────────────────────────┐                             │
 *        │                                                                │ No previous session         │
 *        │                                                                ▼                             │
 *        │          (from all other states    Client logged out   ┌─────────────────┐                   │
 *        │            except LOCK_STOLEN)  ──────────────────────►│     WELCOME     │                   │
 *        │                                                        │                 │                   │
 *        │                                                        └─────────────────┘                   │
 *        │                                                               │   │                          │
 *        │                                                     "Sign in" │   │ "Create account"         │
 *        │                                                  ┌────────────┘   └──────────────┐           │
 *        │                                                  │                               │           │
 *        │                       "Forgot                    ▼       "Create an              ▼           │
 *        │   ┌─────────────────┐  password"     ┌─────────────────┐   account"     ┌─────────────────┐  │
 *        │   │ FORGOT_PASSWORD │◄───────────────│      LOGIN      │───────────────►│     REGISTER    │  │
 *        │   │                 │───────────────►│                 │◄───────────────│                 │  │
 *        │   └─────────────────┘ Complete /     └─────────────────┘ "Sign in here" └─────────────────┘  │
 *        │            ▲        "Sign in instead"        │                                   │           │
 *        │            │                                 └──────────────────────┐  ┌─────────┘           │
 *        │            │"Forgotten your                                         │  │  ┌──────────────────┘
 *        │            │ password?"                                             │  │  │
 *        │            │                                                        │  │  │
 *        │   ┌─────────────────┐ Soft-logout error                             │  │  │
 *        │   │  SOFT_LOGOUT    │◄───────────── (from all other states          │  │  │
 *        │   │                 │                except LOCK_STOLEN)            │  │  │
 *        │   └─────────────────┘                                               │  │  │
 *        │         │ Re-authentication succeeded                               ▼  ▼  ▼
 *        │         │                                                    ┌──────────────────┐
 *        ▼         ▼                                                    │ (postLoginSetup) │
 *     ┌─────────────────┐                                               └──────────────────┘
 *     │ PENDING_CLIENT_ │                                      Account has │     │      │ Account lacks
 *     │     START       │                                    cross-signing │     │      │ cross-signing
 *     └─────────────────┘                                           keys   │     │      │ keys
 *        │          │                                                      │     │      │
 *        │          └───────────────────────────────┐                      │     │      │
 *        │            Client started,               │                      │     │      └──────┐
 *        │            force_verification pending    │                      │     │             │
 *        │                                          ▼                      │     │             │
 *        │ Client started,                 ┌─────────────────┐             │     │             │
 *        │ force_verification              │  COMPLETE_      │◄────────────┘     │             ▼
 *        │ not needed                      │      SECURITY   │                   │      ┌─────────────────┐
 *        │                                 └─────────────────┘                   │      │   E2E_SETUP     │
 *        │                                          │                            │      │                 │
 *        │    ┌─────────────────────────────────────┘           E2EE not enabled │      └─────────────────┘
 *        │    │    ┌─────────────────────────────────────────────────────────────┘              │
 *        │    │    │     ┌──────────────────────────────────────────────────────────────────────┘
 *        │    │    │     │
 *        │    │    │     │
 *        │    │    │     │
 *        │    │    │     │
 *        ▼    ▼    ▼     ▼
 *       ┌─────────────────┐
 *       │   LOGGED_IN     │
 *       │                 │
 *       └─────────────────┘
 *
 *       (from all other states)
 *                │
 *                │ Session lock stolen
 *                ▼
 *       ┌─────────────────┐
 *       │  LOCK_STOLEN    │
 *       │                 │
 *       └─────────────────┘
 */
enum Views {
    // a special initial state which is only used at startup, while we are
    // trying to re-animate a matrix client or register as a guest.
    LOADING,

    // Another tab holds the lock.
    CONFIRM_LOCK_THEFT,

    // we are showing the welcome view
    WELCOME,

    // we are showing the login view
    LOGIN,

    // we are showing the registration view
    REGISTER,

    // showing the 'forgot password' view
    FORGOT_PASSWORD,

    // showing flow to trust this new device with cross-signing
    COMPLETE_SECURITY,

    // flow to setup SSSS / cross-signing on this account
    E2E_SETUP,

    /**
     * We have successfully recovered a session from localstorage, but the client
     * has not yet been started.
     */
    PENDING_CLIENT_START,

    // we are logged in with an active matrix client. The logged_in state also
    // includes guests users as they too are logged in at the client level.
    LOGGED_IN,

    // We are logged out (invalid token) but have our local state again. The user
    // should log back in to rehydrate the client.
    SOFT_LOGOUT,

    // Another instance of the application has started up. We just show an error page.
    LOCK_STOLEN,
}

export default Views;
