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

type ExecuteStatus = strict enum {
    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;
};

type ConfigureStoryError = strict enum : int32 {
    /// The story cannot be (re)configured because it was already created.
    ERR_STORY_ALREADY_CREATED = 1;
};

type ExecuteResult = struct {
    status ExecuteStatus;
    story_id string:<MAX, optional>;
    error_message string:<MAX, optional>;
};

// 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
protocol 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(resource struct {
        story_name string:MAX;
        request server_end:StoryPuppetMaster;
    });

    // Deletes a story associated to `story_name`.
    // Any active StoryPuppetMaster connections to the Story will be closed.
    DeleteStory(struct {
        story_name string:MAX;
    }) -> ();

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

protocol 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(resource struct {
        commands vector<StoryCommand>:MAX;
    });

    // 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() -> (struct {
        result ExecuteResult;
    });

    /// Attach the `annotations` to the story. If the story does not yet exist,
    /// it will be created.
    ///
    /// Existing annotations with the same key will be overwritten, or
    /// deleted if new value is null.
    Annotate(resource struct {
        annotations vector<Annotation>:MAX_ANNOTATIONS_PER_UPDATE;
    }) -> (struct {}) error AnnotationError;

    /// Returns the annotations attached to this story.
    ///
    /// This is a "hanging get" that returns the current annotations on
    /// first call, and on subsequent calls returns the full set of
    /// annotations once they are updated.
    ///
    /// Returns AnnotationError.NOT_FOUND if the story does not exist.
    WatchAnnotations() -> (resource struct {
        annotations vector<Annotation>:MAX_ANNOTATIONS_PER_STORY;
    }) error AnnotationError;
};
