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

enum ExecuteStatus {
    OK = 0;

    // Encountered an invalid command.
    INVALID_COMMAND = 1;

    // The |story_id| provided does not exist or is not visible
    // to this client.
    INVALID_STORY_ID = 2;

    // A story must contain at least one mod, and the commands given
    // either don't add one, or remove the last one.
    STORY_MUST_HAVE_MODS = 3;

    // The mod name specified in AddMod, RemoveMod or SendModCommand
    // was not found, or is invalid.
    INVALID_MOD = 4;

    // Resolution of the intent provided in AddMod returned zero results.
    NO_MODULES_FOUND = 5;

    // Some error happened while executing the command.
    INTERNAL_ERROR = 6;
};

struct ExecuteResult {
    ExecuteStatus status;
    string? story_id;
    string? error_message;
};

// Enables control of a session. A session, conceptually, is a single
// full-screen experience of a Fuchsia device. A device can run multiple
// sessions (ie, when one device powers multiple kiosks); that said, sessions
// are siloed from each other.
//
// A session, concretely, is a collection of stories, their state, the modules
// within them, any agents that run to support the mods and the various UI
// shells (session and story shells).
[Discoverable]
interface PuppetMaster {
    // Requests a capability to control a story by name. The name acts as the
    // story's unique ID.  Calling ControlStory() for the same story name will
    // control the same story.
    //
    // The story name, as well as modification to the story, are durable and
    // persist across device reboots. This allows the client to assign its own
    // identifiers to stories. Clients wishing to guarantee a new story is
    // created should generate a UUIDv4 or similar.
    //
    // |request| is closed if control cannot be granted.
    //
    // TODO(thatguy): We want story names to be scoped to the client's namespace.
    ControlStory(string story_name, request<StoryPuppetMaster> request);

    // Deletes a story associated to |story_name|.
    DeleteStory(string story_name) -> ();

    // Returns a list of all the names of stories in the session.
    GetStories() -> (vector<string> story_names);
};

struct WatchSessionOptions {
    // FIDL doens't allow empty structs. We want this struct to exist in the API
    // for future session watching options.
    int32 placeholder;
};

interface StoryPuppetMaster {
    // Enqueues the given |commands| in the order they are given.
    // Can be called as many times as necessary to specify the full
    // set of changes to the story.
    //
    // To execute all enqueued commands, call Execute().
    Enqueue(vector<StoryCommand> commands);

    // Executes the commands enqueued so far by Enqueue() in order and as
    // a batch: no other commands from other clients will be interleaved.
    //
    // If an error occurs, execution is stopped and an error code
    // and message are returned in |result|.
    Execute() -> (ExecuteResult result);

    // If this story is new, sets the options for its creation. Must be called
    // before the first call to Execute(). Any subsequent calls (either on the
    // same channel or on a new StoryPuppetMaster for an existing story) are
    // ignored. Some StoryOptions can be changed through specific story commands.
    // See story_command.fidl for details.
    SetCreateOptions(StoryOptions story_options);
};
