// 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 fidl.test.spaceship;

using zx;

// StarData is 16 bytes, all inline.
struct StarData {
    array<uint8>:16 data;
};

// PlanetData is 4 bytes, all inline.
struct PlanetData {
    array<uint8>:4 data;
};

// AstrologicalData is 20 bytes long, i.e. tag of 4 bytes + max(4, 16).
union AstrologicalData {
    StarData star;
    PlanetData planet;
};

[Layout = "Simple"]
protocol AstrometricsListener {
    OnNova();
};

enum Alert {
    GREEN = 1;
    YELLOW = 2;
    RED = 3;
};

bits Shields : uint8 {
    PORT = 1;
    STARBOARD = 2;
    FORE = 4;
    AFT = 8;
};

struct FuelLevel {
    uint32 reaction_mass;
};

struct ZxTypes {
    zx.status a;
    zx.time b;
    zx.duration c;
    zx.koid d;
    zx.vaddr e;
    zx.paddr f;
    zx.paddr32 g;
    zx.off h;
};

const uint32 MaxStarsAdjustHeading = 64;
const uint32 MaxStarsScanForLifeforms = 64;

[Layout = "Simple"]
protocol SpaceShip {
    AdjustHeading(vector<uint32>:MaxStarsAdjustHeading stars) -> (int8 result);
    ScanForLifeforms() -> (vector<uint32>:MaxStarsScanForLifeforms lifesigns);
    SetAstrometricsListener(AstrometricsListener listener);
    SetDefenseCondition(Alert alert);
    GetFuelRemaining(handle<eventpair>? cancel) -> (zx.status status, FuelLevel? level);
    AddFuelTank(FuelLevel? level) -> (uint32 consumed);
    ScanForTensorLifeforms() -> (array<array<array<uint32>:3>:5>:8 lifesigns);
    ReportAstrologicalData(AstrologicalData data) -> (zx.status status);
    ActivateShields(Shields shields);
};

// Captain Kirk can do many things, possibly all at once.
table CaptainKirkWhereabouts {
    1: bool is_exploring_new_worlds;
    2: bool is_exploring_new_civilizations;
    3: bool is_boldly_going_where_no_man_has_gone_before;
};

/// The USS Enterprise is far from simple.
protocol UssEnterprise {
    WhereIsCaptainKirk() -> (CaptainKirkWhereabouts whereabouts);
};
