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

/// 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.
    2: fuchsia.ui.policy.DisplayUsage display_usage;

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

    /// The screen width in millimeters for the session shell's display.
    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;
};

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

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