// 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.auth;
using fuchsia.ui.policy;

// This interface is implemented by a base shell. Dependencies and parameters
// are passed to it in Initialize() on startup. The base shell is also
// expected to implement Lifecycle in order to receive a Terminate() call on
// teardown.
//
// In one component instance there can only be one BaseShell service instance.
// The ViewOwner request is sent to the separate ViewProvider service. This way,
// the base shell may be implemented as a flutter component.
//
// Teardown may be initiated by the base shell calling
// BaseShellContext.Shutdown(), or by the system shutting down.
[Discoverable]
interface BaseShell {
    1: Initialize(BaseShellContext base_shell_context,
                  BaseShellParams base_shell_params);

    // This method may be invoked by the basemgr to request an
    // AuthenticationUIContext. |request| will then be used to request the base
    // shell to show login screen during a UserProvider.AddUser() or if a token
    // needs to be refreshed.
    3: GetAuthenticationUIContext(request<fuchsia.auth.AuthenticationUIContext> request);
};

// This interface allows the |BaseShell| to request capabilities from the
// |Basemgr| in a way that is more explicit about the services that are
// offered than a generic |ServiceProvider|.
interface BaseShellContext {
    1: GetUserProvider(request<UserProvider> request);

    // This requests the shutdown of the basemgr.
    2: Shutdown();
};

// These params are passed to |BaseShell.Initialize|.
struct BaseShellParams {
    // TODO(jjosh): make this non-optional, if feasible.
    fuchsia.ui.policy.Presentation? presentation;
};
