// 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, the Presenter service controls management of views.
    /// Default: false
    2: bool enable_presenter;

    /// When set to true, wait for persistent data to initialize.
    /// Default: true
    3: 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
    4: bool use_session_shell_for_story_shell_factory;

    /// Tells basemgr whether it is running as a part of an integration test.
    /// Default: false
    5: bool test;

    /// The name of the test
    6: string:fuchsia.io.MAX_PATH test_name;

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

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

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

    /// Temporary placeholder to pass configurations to sessionmgr. Will be
    /// removed with the completion of MF-10.
    10: 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 by Voila to
    /// inject a custom cloud provider.
    FROM_ENVIRONMENT = 2;

    NONE = 3;
};
