// Copyright 2017 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.auth;

/// Stores attributes related to an account that is exposed to base shell.
/// A list of existing account(s) can be obtained via
/// UserProvider.PreviousUsers() and a new account can be added via
/// UserProvider.AddAccount().
struct Account {
    /// A randomly generated identifier that is used to identify this
    /// account on this device. This is meant to be used by base shell when it
    /// wants to login as a user who has previously logged in.
    string id;

    /// The identity provider that was used to authenticate the user on this
    /// device.
    IdentityProvider identity_provider;

    /// Unique identifier configured for the given user at the Identity provider.
    /// Profile id is fetched from user profile attributes as configured by the
    /// user at the given identity provider.
    string profile_id;

    /// The name that is displayed on the base shell while logging in. Display
    /// name is fetched from user profile attributes as configured by the user at
    /// the given identity provider.
    string display_name;

    /// User's profile url that is used by the base shell while logging in.
    /// Profile url is fetched from user profile attributes as configured by the
    /// user at the given identity provider.
    string url;

    /// User's profile image url that is used by the base shell while logging in.
    /// Profile image url is fetched from user profile attributes as configured by
    /// the user at the given identity provider.
    string image_url;
};

/// The currently supported identity providers. An identity provider provides
/// identifiers for users to interact with the system and may provide information
/// about the user that is known to the provider.
enum IdentityProvider {
    /// An identity provider that's used for development and testing. If this
    /// identity provider is chosen, the Framework will continue as if it has
    /// identified the user. Note that the users that use this id provider would
    /// not get cloud ledger access (unless done via a side channel).
    DEV = 0;

    /// Uses Google as the identity provider. Doing this requires a working network
    /// connection and a web view.
    GOOGLE = 1;
};
