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

/// A high level assessment of whether the human that owns a Fuchsia account is
/// present and engaged.
///
/// Note this enum is currently defined to enable multi-user experimentation.
/// Substantial work is required before any realistic use cases.
enum AuthStateSummary {
    /// No information (either affirming or dissenting) is available about the
    /// current presence or engagement of the account owner.
    UNKNOWN = 0;

    /// The account owner has been marked as present by some test or experimental
    /// authentication mechanism. This state should not be used to grant access
    /// to any sensitive user information.
    TEST_PRESENT = 10000;

    /// The account owner has been marked as not-present by some test or
    /// experimental authentication mechanism.
    TEST_ABSENT = 10001;

    // TODO(jsankey): Add additional values to represent realistic
    //                authentication states.
};

/// An assessment of the current presence and engagement of the human that owns
/// a Fuchsia account, including the system's confidence in that assessment and
/// its timeliness.
///
/// Note this struct is currently defined to enable multi-user experimentation.
/// Substantial work is required before any realistic use cases.
struct AuthState {
    /// A high level assessment of whether the human that owns a Fuchsia account
    /// is present and engaged.
    AuthStateSummary summary;

    // TODO(jsankey): Add additional fields to express timeliness, confidence,
    //                and authentication mechanism.
};

/// An expression of the types of changes an auth state that should be reported
/// over listener interfaces. By default no changes will be reported.
struct AuthChangeGranularity {
    /// If true, any changes in the `AuthStateSummary` enumeration will be
    /// reported.
    bool summary_changes;

    // TODO(jsankey): Expand to include other types of change.
};

/// A unique identifier for an account with some service provider, comprised of
/// the identity of the service provider and an account identity supplied by that
/// service provider.
///
// TODO(jsankey): Integrate other parts of the AuthProvider API with this
// domain-based identity. In general multiple auth_provider_types may exist for
// the same identity_provider_domain.
struct ServiceProviderAccount {
    /// The primary domain of the identity provider, such as "www.google.com".
    string identity_provider_domain;

    /// User identifier as supplied by the identity provider. Some identity
    /// providers send verified email address as the identifier, some send an
    /// opaque string.
    string user_profile_id;
};
