// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.modular;

using fuchsia.modular.auth;

/// Given by the `Basemgr` to the `BaseShell` at Initialize() so the
/// `BaseShell` can get information about the users of this device from the
/// `Basemgr`, and act on the provided information (including extending the
/// user database).
protocol UserProvider {
    /// Adds information of a user that can be used to authenticate her/him to this
    /// device. Once successfully added, the user can login to the same device via
    /// Login().
    ///
    /// `identity_provider` is the identity provider to use for identification.
    ///
    /// `device_name` is what the user wants to name the device. If null or empty
    /// the device's current hostname will be used.
    ///
    /// `account` is NULL if there was an error during identification and
    /// `error_code` is set.
    AddUser(fuchsia.modular.auth.IdentityProvider identity_provider)
        -> (fuchsia.modular.auth.Account? account, string? error_code);

    /// Removes information of a user from the local user database.
    ///
    /// `account_id` is received from either AddUser() or PreviousUsers().
    RemoveUser(string account_id) -> (string? error_code);

    /// Uses the credentials provided in AddUser() to start a user session. This
    /// would mean syncing with the user's ledger instance and displaying a user
    /// shell with all of the user's stories.
    // TODO(alhaad): In the future, we want to protect Login() with a password,
    // Android lock pattern, etc.
    Login(UserLoginParams user_login_params);
    /// DEPRECATED: For transitional purposes only.
    [Transitional]
    Login2(UserLoginParams2 user_login_params);

    /// List of all users who have authenticated to this device in the past.
    PreviousUsers() -> (vector<fuchsia.modular.auth.Account> accounts);
};

/// Used to specify arguments to log into a user session.
struct UserLoginParams {
    /// `account_id` is received from either AddUser() or PreviousUsers(). It
    /// can be NULL which means logging-in using incognito mode.
    string? account_id;
};

/// DEPRECATED, for backwards compatibility only
struct UserLoginParams2 {
    /// `account_id` is received from either AddUser() or PreviousUsers(). It
    /// can be NULL which means logging-in in an incognito mode.
    string? account_id;
};
