// 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.developer.bridge;
using fuchsia.device;
using fuchsia.net;
using fuchsia.buildinfo;

struct TargetIp {
    fuchsia.net.IpAddress ip;
    uint32 scope_id;
};

struct TargetIpPort {
    fuchsia.net.IpAddress ip;
    uint32 scope_id;
    uint16 port;
};

// TODO(awdavies): Add serial number.
union TargetAddrInfo {
    1: TargetIp ip;
    2: TargetIpPort ip_port;
};

// TODO(awdavies): Add more target states once they're more well defined.
enum TargetState {
    UNKNOWN = 1;
    DISCONNECTED = 2;
    PRODUCT = 3;
    FASTBOOT = 4;
};

// TODO(awdavies): Add more target types. Hardware? Product state?
enum TargetType {
    UNKNOWN = 1;
};

/// Current known state of the remote control
enum RemoteControlState {
    UP = 1;
    DOWN = 2;
    UNKNOWN = 3;
};

table Target {
    1: string:fuchsia.device.DEVICE_NAME_MAX nodename;
    2: vector<TargetAddrInfo>:256 addresses;
    3: uint64 age_ms;
    4: RemoteControlState rcs_state;
    5: TargetType target_type;
    6: TargetState target_state;
    // Contains the string used for the product in `fx set`, for example
    // `fx set core.x64` would make this value "core".
    7: string:fuchsia.buildinfo.MAX_STRING_LENGTH product_config;
    // Contains the string used for the board in `fx set`, for example
    // `fx set core.x64` would make this value "x64".
    8: string:fuchsia.buildinfo.MAX_STRING_LENGTH board_config;
    9: string:256 serial_number;
    /// ssh_address is the preferred address to use to connect to the
    /// device over SSH, and will include a port number if a custom SSH
    /// port number has been set.
    10: TargetAddrInfo ssh_address;
};

enum TargetRebootError {
    UNKNOWN = 1;
    /// Cannot reboot from fastboot to recovery.
    FASTBOOT_TO_RECOVERY = 2;
    /// There was an Overnet communication issue with the target.
    TARGET_COMMUNICATION = 3;
    /// There was a Fastboot protocol communication issue with the
    /// target.
    FASTBOOT_COMMUNICATION = 4;
};

enum TargetRebootState {
    PRODUCT = 1;
    BOOTLOADER = 2;
    RECOVERY = 3;
};

[Discoverable]
protocol TargetControl {
    Reboot(TargetRebootState state) -> () error TargetRebootError;
};
