// 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.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.
closed protocol StoryShell {
    strict Initialize(resource struct {
        story_shell_context client_end:StoryShellContext;
    });

    /// 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.
    strict AddSurface(resource struct {
        view_connection ViewConnection;
        surface_info SurfaceInfo;
    });
    /// DEPRECATED.  For transition purposes only.
    strict AddSurface2(resource struct {
        view_connection ViewConnection2;
        surface_info SurfaceInfo;
    });
    /// For transition purposes only.
    strict AddSurface3(resource struct {
        view_connection ViewConnection;
        surface_info SurfaceInfo2;
    });

    /// Focuses the surface with surface_id, bringing it to the foreground.
    strict FocusSurface(struct {
        surface_id string:MAX;
    });

    /// Defocuses the surface with surface_id, dismissing it to the background.
    strict DefocusSurface(struct {
        surface_id string:MAX;
    }) -> ();

    /// 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
    strict -> OnSurfaceFocused(struct {
        surface_id string:MAX;
    });

    /// 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.
    strict RemoveSurface(struct {
        surface_id string:MAX;
    });

    /// 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.
    strict UpdateSurface(resource struct {
        view_connection ViewConnection;
        surface_info SurfaceInfo;
    });
    /// DEPRECATED.  For transition purposes only.
    strict UpdateSurface2(resource struct {
        view_connection ViewConnection2;
        surface_info SurfaceInfo;
    });
    /// For transition purposes only.
    strict UpdateSurface3(resource struct {
        view_connection ViewConnection;
        surface_info SurfaceInfo2;
    });
};

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

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

/// DEPRECATED, for transition purposes only.
type ViewConnection2 = resource struct {
    /// The ID for the surface
    surface_id string:MAX;

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

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

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

    /// Information about the module populates the view.
    module_manifest box<ModuleManifest>;

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

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

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

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

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

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

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

/// The story shell receives this protocol upon initialization.
closed protocol StoryShellContext {};

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