// Copyright 2019 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.session;

using fuchsia.io;
using fuchsia.ui.policy;
using fuchsia.sys;

/// Descriptions and defaults for these configurations are echoed in
/// peridot/docs/modular/guide/config.md.
table BasemgrConfig {
    /// When set to false, Cobalt statistics are disabled.
    /// Default: true
    1: bool enable_cobalt;

    /// When set to true, wait for persistent data to initialize.
    /// Default: true
    2: bool use_minfs;

    /// Create story shells through StoryShellFactory exposed by the session
    /// shell instead of creating separate story shell components. When set,
    /// `story_shell_url` and any story shell args are ignored.
    /// Default: false
    3: bool use_session_shell_for_story_shell_factory;

    /// Launch configurations specific to base shell.
    4: BaseShellConfig base_shell;

    /// A map of launch configurations specific to session shells.
    5: vector<SessionShellMapEntry> session_shell_map;

    /// Launch configurations specific to story shell.
    6: StoryShellConfig story_shell;

    /// Temporary placeholder to pass configurations to sessionmgr. Will be
    /// removed with the completion of MF-10.
    7: AppConfig sessionmgr;
};

table BaseShellConfig {
    /// Contains the fuchsia package url and arguments to pass to the shell.
    1: AppConfig app_config;

    /// When set to true, the base shell is kept alive after a log in. This is
    /// used for testing because current integration tests expect base shell
    /// to always be running.
    /// Default: false
    2: bool keep_alive_after_login;
};

table SessionShellMapEntry {
    /// The name of the session shell represented by its url.
    1: string:fuchsia.io.MAX_PATH name;

    /// The launch configurations for the session shell.
    2: SessionShellConfig config;
};

table SessionShellConfig {
    /// Contains the fuchsia package url and arguments to pass to the shell.
    1: AppConfig app_config;

    /// The display usage policy for this session shell.
    ///
    /// Optional: defaults to DisplayUsage::kUnknown.
    2: fuchsia.ui.policy.DisplayUsage display_usage;

    /// The screen height in millimeters for the session shell's display.
    ///
    /// Optional: defaults to full screen.
    3: float32 screen_height;

    /// The screen width in millimeters for the session shell's display.
    ///
    /// Optional: defaults to full screen.
    4: float32 screen_width;
};

table StoryShellConfig {
    /// Contains the fuchsia package url and arguments to pass to the shell.
    1: AppConfig app_config;
};

table SessionmgrConfig {
    1: CloudProvider cloud_provider;

    /// When set to false, Cobalt statistics are disabled. This is used for
    /// testing.
    /// Default: true
    2: bool enable_cobalt;

    /// When set to false, StoryShell instances are not warmed up as a startup
    /// latency optimization. This is used for testing.
    /// Default: true
    3: bool enable_story_shell_preload;

    /// Tells the sessionmgr whether it should host+pass a memfs-backed
    /// directory to the ledger for the user's repository, or to use
    /// /data/LEDGER.
    /// Default: false
    4: bool use_memfs_for_ledger;

    /// A list of fuchsia package urls that specify which agents to launch at
    /// startup.
    5: vector<string:fuchsia.io.MAX_PATH> startup_agents;

    /// A list of fuchsia package urls that specify which agents to launch at
    /// startup with PuppetMaster and FocusProvider services.
    6: vector<string:fuchsia.io.MAX_PATH> session_agents;

    /// The fuchsia package url for which story shell to use.
    7: string:fuchsia.io.MAX_PATH story_shell_url;

    /// A map of agents to the arguments they should be started with.
    8: vector<AppConfig> component_args;

    /// Deprecated
    9: bool use_parent_runner_for_story_realm;

    /// A list of supported services and the URL of the agent known to provide
    /// that service. Used by the Session Manager to implement
    /// `ComponentContext` method ConnectToAgentService().
    10: vector<AgentServiceIndexEntry> agent_service_index;
};

/// Used to pass around configuration references to apps such as base shell,
/// session shell, story shell, and agents.
table AppConfig {
    /// The fuchsia package url for app.
    1: string:fuchsia.io.MAX_PATH url;

    /// The arguments for the app.
    2: vector<string> args;
};

/// A service and the URL of the agent known to provide that service.
table AgentServiceIndexEntry {
    /// The service name.
    1: string service_name;

    /// The fuchsia component url for agent.
    2: fuchsia.sys.component_url agent_url;
};

enum CloudProvider {
    /// Use a cloud provider configured by Ledger.
    LET_LEDGER_DECIDE = 1;

    /// Use a cloud provider available in the incoming namespace, rather than
    /// initializing and instance within sessionmgr. This can be used to inject
    /// a custom cloud provider.
    FROM_ENVIRONMENT = 2;

    NONE = 3;
};

/// Contains the configurations for the modular framework components.
table ModularConfig {
    1: BasemgrConfig basemgr_config;

    2: SessionmgrConfig sessionmgr_config;
};
