// 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.
    GetInfo() -> (StoryInfo 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);
};
