// 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.ui.views;

/// Used by the clients of StoryProvider (SessionShell) to interact with a single
/// story. Created by StoryProvider.
///
/// If `StoryController` is closed, the `StoryState` associated with this story
/// does not change.
protocol StoryController {
    /// Gets information associated with the story.
    [Transitional = "Use GetInfo2 instead"]
    GetInfo() -> (StoryInfo info, StoryState state);
    /// For transition purposes only.
    [Transitional = "Only use while GetInfo2 is transitional"]
    GetInfo2() -> (StoryInfo2 info, StoryState state);

    /// Requests to run the story controlled by this `StoryController` instance.
    /// When the story starts, if not yet running, the view of the newly started
    /// story shell will be passed in a call to SessionShell.AttachView().
    RequestStart();

    /// Requests to stop the story controlled by this `StoryController`. If Start()
    /// requests are pending when this request is issued, the request is queued
    /// until the Start() requests complete. Before stopping the story, a snapshot
    /// of the story will be taken and saved. Returns when the story is stopped.
    Stop() -> ();

    /// Creates a new view with the given `view_owner` request to display
    /// snapshots. Takes a snapshot for the story controlled by this
    /// `StoryController` and then loads the snapshot to the created view such that
    /// it is rendered. The callback will be invoked once the view has been created
    /// and the snapshot has been loaded.
    TakeAndLoadSnapshot(fuchsia.ui.views.ViewToken view_token) -> ();

    /// Registers a watcher for changes of the story state.
    ///
    /// Note that stories can stop themselves at any time and it is advisable
    /// for the holder of a StoryController to provide a watcher.
    Watch(StoryWatcher watcher);

    /// DEPRECATED
    GetActiveModules() -> (vector<ModuleData> module_data);

    /// DEPRECATED
    GetModules() -> (vector<ModuleData> module_data);

    /// DEPRECATED
    /// (metadata about, and requesting changes to runtime state).
    GetModuleController(vector<string> module_path, request<ModuleController> request);

    /// DEPRECATED
    GetLink(LinkPath link_path, request<Link> link);
};

/// Implemented by the client calling StoryController.Watch().
protocol StoryWatcher {
    /// Called with the current state right after registration, and subsequently
    /// when the state changes.
    OnStateChange(StoryState new_state);

    /// DEPRECATED
    OnModuleAdded(ModuleData module_data);

    /// DEPRECATED
    OnModuleFocused(vector<string> module_path);
};

/// Implemented by the client calling StoryController.GetActiveLinks().
///
/// DEPRECATED: StoryController is only to be used for Story concepts
/// (metadata about, and requesting changes to runtime state).
protocol StoryLinksWatcher {
    /// Called when a link becomes active in the story, i.e. when it is loaded into
    /// memory and connected with modules and watchers. After this notification,
    /// the Link can be obtained with GetLink() and further notifications can be
    /// obtained from watchers on the Link and connection error handlers on the
    /// LinkWatcher.
    ///
    /// Note that the Link remains active until there are no connections to it
    /// left. Hence in order to obtain a notification when the Link becomes
    /// inactive, a client must give up the Link connection after registering a
    /// LinkWatcher, and listen for the LinkWatcher connection to go down.
    ///
    /// This is EXPERIMENTAL. We certainly can make this simpler once we know it is
    /// what we need.
    OnNewLink(LinkPath link_path);
};
