// Copyright 2023 The Sapphire Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

pub mod types;
pub use types::{Characteristic, Descriptor, Result};

pub mod server;
pub use server::Server;

pub mod client;
pub use client::Client;

pub mod central;
pub use central::Central;

pub mod periodic_advertising;
pub mod pii;

pub mod connected_isochronous;
pub use connected_isochronous::{ConnectedIsochronousGroup, ConnectedIsochronousStream};

#[cfg(any(test, feature = "test-utils"))]
pub mod test_utils;

#[cfg(test)]
mod tests;

use futures::{Future, Stream};

use crate::periodic_advertising::PeriodicAdvertising;

/// Implementors implement traits with respect to GattTypes.
/// Implementation crates provide an object which relates a constellation of
/// types to each other, used to provide concrete types for library crates to
/// paramaterize on.
pub trait GattTypes: Sized {
    // Types related to finding and connecting to peers
    type Central: Central<Self>;
    type ScanResultStream: Stream<Item = Result<central::ScanResult>> + 'static;
    type Client: Client<Self>;
    type ConnectFuture: Future<Output = Result<Self::Client>>;

    // Types related to finding and connecting to services
    type PeerServiceHandle: client::PeerServiceHandle<Self>;
    type FindServicesFut: Future<Output = Result<Vec<Self::PeerServiceHandle>>> + 'static;
    type PeerService: client::PeerService<Self>;
    type ServiceConnectFut: Future<Output = Result<Self::PeerService>>;

    // Types related to interacting with services
    /// Future returned by PeerService::discover_characteristics,
    /// delivering the set of characteristics discovered within a service
    type CharacteristicDiscoveryFut: Future<Output = Result<Vec<Characteristic>>>;
    /// A stream of notifications, delivering updates to a characteristic value
    /// that has been subscribed to.  See [`client::PeerService::subscribe`]
    type NotificationStream: Stream<Item = Result<client::CharacteristicNotification>> + 'static;
    /// Future resolving when a characteristic or descriptor has been read.
    /// Resolves to a number of bytes read along with a boolean indicating if
    /// the value was possibly truncated, or an Error if the value could not
    /// be read.
    type ReadFut<'a>: Future<Output = Result<(usize, bool)>> + 'a;
    /// Future resolving when a characteristic or descriptor has been written.
    /// Returns an error if the value could not be written.
    type WriteFut<'a>: Future<Output = Result<()>> + 'a;
    /// The implementation of periodic advertising for this GATT implementation.
    type PeriodicAdvertising: PeriodicAdvertising;
    /// The implementation of connected isochronous groups.
    /// Note: The provided `NotSupported` can be used here to indicate that it
    /// is not supported.
    type ConnectedIsochronous: connected_isochronous::ConnectedIsochronous;
}

/// Servers and services are defined with respect to ServerTypes.
/// Implementation crates provide an object which relates this constellation of
/// types to each other, used to provide concrete types for library crates to
/// paramaterize on.
pub trait ServerTypes: Sized {
    type Server: Server<Self>;
    type LocalService: server::LocalService<Self>;
    type LocalServiceFut: Future<Output = Result<Self::LocalService>>;
    type ServiceEventStream: Stream<Item = Result<server::ServiceEvent<Self>>>;
    type ServiceWriteType: ToOwned<Owned = Vec<u8>>;
    type ReadResponder: server::ReadResponder;
    type WriteResponder: server::WriteResponder;

    type IndicateConfirmationStream: Stream<Item = Result<server::ConfirmationEvent>>;
}
