// 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 view token 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 {
    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.
    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 {
    GetUserProvider(request<UserProvider> request);

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

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