// Copyright 2019 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.identity.prototype;

using fuchsia.identity.account;
using fuchsia.overnet.protocol;

/// A temporary control interface exposed by Account Manager for prototyping.
/// Once the functionality is ready to be brought out of prototype stage this
/// protocol will be removed and its methods will be moved to the
/// AccountManager interface.  This interface is intended only for use by
/// development tools to manually initiate an account transfer, and should
/// generally not be used.
[Discoverable]
protocol PrototypeAccountTransferControl {
    // TODO(satsukiu): Add additional error types such as USER_CANCELED,
    // DEVICE_NOT_FOUND...

    /// Provisions an account on the current device onto another device.
    ///
    /// `account_id` The local id of the account to transfer.
    /// `target_device` The device on which the account should be provisioned,
    ///                 identified using an Overnet NodeId.
    /// `target_lifetime` The lifetime the account should have on the target
    ///                   device
    ///
    /// Returns successfully if the account is provisioned on the remote device
    /// successfully.  Fails with an UNSUPPORTED_OPERATION error if the account
    /// is already present on the remote device.
    TransferAccount(fuchsia.identity.account.LocalAccountId account_id,
                    fuchsia.overnet.protocol.NodeId target_device,
                    fuchsia.identity.account.Lifetime target_lifetime)
        -> () error fuchsia.identity.account.Error;
};
