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

// 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.
interface StoryController {
    // Gets information associated with the story.
    1: GetInfo() -> (StoryInfo info, StoryState state);

    // DEPRECATED in favor of RequestStart().
    //
    // Runs the story controlled by this |StoryController| instance if not yet
    // running or requested to start, else does nothing. |view_owner| is an
    // interface request for the view of the story shell of this story. If the
    // story is already running, the view owner request is dropped. If Stop()
    // requests are pending when this request is issued, the request is queued
    // until the Stop() requests complete.
    3: Start(request<fuchsia.ui.viewsv1token.ViewOwner> view_owner);

    // Requests to runsthe 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().
    14: 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.
    4: 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.
    13: TakeAndLoadSnapshot(request<fuchsia.ui.viewsv1token.ViewOwner> view_owner) -> ();

    // 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.
    5: Watch(StoryWatcher watcher);

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

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

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

    // DEPRECATED: MI4-1084
    10: GetActiveLinks(StoryLinksWatcher? watcher) -> (vector<LinkPath> link_data);

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

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

    // DEPRECATED
    2: OnModuleAdded(ModuleData module_data);

    // DEPRECATED
    3: 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).
interface 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.
    1: OnNewLink(LinkPath link_path);
};
