// Copyright 2023 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.bluetooth.map;

using fuchsia.bluetooth as bt;

/// Clients can use Message Client Equipment (MCE) related features through this protocol.
@discoverable
open protocol MessagingClient {
    /// Make connections to peers that support MAP.
    /// An `Accessor` will be returned for each peer as they are
    /// connected, and only one exists at a time for each peer.
    /// Hangs until a new peer becomes available once all connected
    /// peers have been delivered to this protocol.
    flexible WatchAccessor() -> (resource table {
        1: peer_id bt.PeerId;
        2: accessor client_end:Accessor;
    });
};

open protocol MessageController {
    /// Retrieve all available message details.
    /// + request `handle` Unique identifier for a Messsage.
    /// + request `include_attachment` Whether or not attachment should be included as
    ///                                part of Message content if it's available.
    /// - response NOT_FOUND error is returned if the message with the given handle does not exist.
    flexible GetDetails(struct {
        handle uint64;
        include_attachment bool;
    }) -> (Message) error Error;
};

/// Protocol used for accessing messages and notifications for a connected Bluetooth peer.
open protocol Accessor {
    compose MessageController;

    /// Hanging-get request to get new messages. If new messages have been reported from the peer,
    /// returns the information available. See MAP v1.4.2 section 3.1.7 for details.
    strict FetchNewMessage() -> (resource table {
        /// Note that only some fields will be provided. To retrieve all
        /// available information for a specific message use `GetDetails`.
        1: messages vector<Message>:MAX;
    });
};

// TODO(https://fxbug.dev/42082455): add `RepositoryBrowser` protocol, which
// would be used for browsing through a specific message repository.
