// 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;

using fuchsia.ui.policy;
using fuchsia.ui.views;

/// This interface is implemented by a story shell. Dependencies are passed to it
/// in Initialize() on startup. The story 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 StoryShell service instance.
/// The view token is sent to the separate View service. This way, the story
/// shell may be implemented as a flutter component.
///
/// Teardown may occur via the session shell calling StoryController.Stop(), the
/// sessionmgr being terminated, or by the system shutting down.
[Discoverable] // Created by story shell applications.
protocol StoryShell {
    Initialize(StoryShellContext story_shell_context);

    /// Adds a new Surface and its corresponding view to be displayed by the
    /// StoryShell. More context that allows the story shell to decide how
    /// to layout will be added later. Also, interface to influence life cycle and
    /// focus is obviously missing.
    /// `view_connection` the new view and the associated Surface ID.
    /// `surface_info` metadata relating to the Surface.
    [Transitional = "Implement AddSurface3 instead"]
    AddSurface(ViewConnection view_connection, SurfaceInfo surface_info);
    /// DEPRECATED.  For transition purposes only.
    [Transitional = "Implement AddSurface3 instead"]
    AddSurface2(ViewConnection2 view_connection, SurfaceInfo surface_info);
    /// For transition purposes only.
    [Transitional = "Only implement while AddSurface is transitional"]
    AddSurface3(ViewConnection view_connection, SurfaceInfo2 surface_info);

    /// Focuses the surface with surface_id, bringing it to the foreground.
    FocusSurface(string surface_id);

    /// Defocuses the surface with surface_id, dismissing it to the background.
    DefocusSurface(string surface_id) -> ();

    /// Notify when a Surface is focused in the story. The focus could be from
    /// a user interaction or requested by the framework through
    /// StoryController#FocusModule.
    /// EXPERIMENTAL
    -> OnSurfaceFocused(string surface_id);

    /// Remove the Surface with surface_id from the StoryShell entirely. This is
    /// final. The Surface is removed from the graph. If necessary, the
    /// associated Surface is defocused. There is no expectation that
    /// DefocusSurface is called before this.
    RemoveSurface(string surface_id);

    /// Update the surface
    /// This is called when the intent is to update the surface metadata in the
    /// story graph in place. Any fields, except for the surface_id can be
    /// updated. If no value or null is passed for a field it remains unchanged.
    /// This includes the `view_holder_token` inside the connection.
    ///
    /// E.g called when an intent resolves to a module that is known by the
    /// caller to already be running, to update associated metadata.
    [Transitional = "Implement UpdateSurface3 instead"]
    UpdateSurface(ViewConnection view_connection, SurfaceInfo surface_info);
    /// DEPRECATED.  For transition purposes only.
    [Transitional = "Implement UpdateSurface3 instead"]
    UpdateSurface2(ViewConnection2 view_connection, SurfaceInfo surface_info);
    /// For transition purposes only.
    [Transitional = "Only implement while UpdateSurface is transitional"]
    UpdateSurface3(ViewConnection view_connection, SurfaceInfo2 surface_info);
};

/// A pair mapping a surface ID to a view (via `view_holder_token`).
struct ViewConnection {
    /// The ID for the surface
    string surface_id;

    /// Token for embedding the new view corresponding to the surface.
    fuchsia.ui.views.ViewHolderToken view_holder_token;
};

/// DEPRECATED, for transition purposes only.
struct ViewConnection2 {
    /// The ID for the surface
    string surface_id;

    /// Token for embedding the new view corresponding to the surface.
    fuchsia.ui.views.ViewHolderToken view_holder_token;
};

/// Contains metadata for a Surface.
struct SurfaceInfo {
    /// ID of the view that is parent of this Surface.
    string parent_id;

    /// The relationship between the parent Surface and this new Surface. Used
    /// for layout optimization.
    SurfaceRelation? surface_relation;

    /// Information about the module populates the view.
    ModuleManifest? module_manifest;

    /// How the Surface was generated. By an action internal to the story or by
    /// an external action.
    ModuleSource module_source;
};

/// Contains metadata for a Surface.
table SurfaceInfo2 {
    /// ID of the view that is parent of this Surface.
    1: string parent_id;

    /// The relationship between the parent Surface and this new Surface. Used
    /// for layout optimization.
    2: SurfaceRelation surface_relation;

    /// Information about the module populates the view.
    3: ModuleManifest module_manifest;

    /// How the Surface was generated. By an action internal to the story or by
    /// an external action.
    4: ModuleSource module_source;

    /// Collection of user-defined key-value attributes that describe this surface (module).
    ///
    /// The `Annotation.value` field of each `Annotation` is always set.
    5: vector<Annotation>:MAX_ANNOTATIONS_PER_MODULE annotations;

    /// The view ref associated with the surface, if one is present.
    6: fuchsia.ui.views.ViewRef view_ref;
};

/// This interface provides the StoryShell instance with everything it needs to
/// know or be able to do about the Story. Not much right now, but we expect this
/// to increase.
protocol StoryShellContext {
    /// Requests a Presentation connection from the SessionShell. See
    /// SessionShellPresenationProvider in session_shell.fidl.
    GetPresentation(request<fuchsia.ui.policy.Presentation> request);

    /// Starts watching Story shell's visual state.
    WatchVisualState(StoryVisualStateWatcher watcher);

    /// Requests a view for a Surface.
    /// Requests that a view for `surface_id` is provided through
    /// StoryShell.ReconnectView().
    RequestView(string surface_id);
};

/// Implemented by StoryShell to get notified about visual state changes.
protocol StoryVisualStateWatcher {
    OnVisualStateChange(StoryVisualState visual_state);
};

/// Defines the visual state of the Story shell.
enum StoryVisualState {
    MINIMIZED = 0;
    MAXIMIZED = 1;
    MAXIMIZED_OVERLAYED = 2;
};
