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

const uint64 MAX_NAME = 255;
const uint64 MAX_PATH = 4095;
const uint64 MAX_REPOS = 512;
const uint64 MAX_ALIASES = 32;

flexible union RepositorySpec {
    1: FileSystemRepositorySpec filesystem;
};

table FileSystemRepositorySpec {
    1: string:MAX_PATH path;
};

[Discoverable]
protocol Repositories {
    // FIXME(76719): This will change semantics or be removed when service auto-starting lands
    /// Starts the server listening on the given port.
    Serve(fuchsia.net.IpAddress addr, uint16 port) -> (bool success);

    // FIXME(76201): Should return a RepoError
    Add(string:MAX_NAME name, RepositorySpec repository);

    // FIXME(76201): Should return a RepoError
    Remove(string:MAX_NAME name) -> (bool found);

    List(request<RepositoryIterator> iterator);

    RegisterTarget(RepositoryTarget target_info) -> () error RepositoryError;
};

struct RepositoryConfig {
    string:MAX_NAME name;
    RepositorySpec spec;
};

protocol RepositoryIterator {
    Next() -> (vector<RepositoryConfig>:MAX_REPOS repos);
};

table RepositoryTarget {
    /// The configured name of the repository
    1: string:MAX_NAME repo_name;
    /// The target on which to configure this repository
    2: string:fuchsia.device.DEVICE_NAME_MAX target_identifier;
    /// An optional list of hostnames. A rewrite rule will be added
    /// for each hostname in this list to resolve to this repository.
    3: vector<string:MAX_NAME>:MAX_ALIASES aliases;
};

enum RepositoryError : uint32 {
    /// Repository "name" is missing in an API where it is required.
    MISSING_REPOSITORY_NAME = 1;
    /// No repository matches the provided name.
    NO_MATCHING_REPOSITORY = 2;
    /// There was an error communicating with the target. This may mean that
    /// the target does not exist, is down or unreachable, or that there was an
    /// error communicating with a proxy on target.
    /// TODO(fxbug.dev/77904) make this more specific when we have more specific
    /// errors from the underlying API.
    TARGET_COMMUNICATION_FAILURE = 3;
    /// There was an error from the fuchsia.pkg.RepositoryManager.
    REPOSITORY_MANAGER_ERROR = 4;
    /// There was a error from fuchsia.pkg.rewrite.Engine.
    REWRITE_ENGINE_ERROR = 5;
};
