// 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.

//! Contains traits that are used to find and connect to Low Energy Peers, i.e.
//! the GAP Central and Observer roles role defined in the Bluetooth Core
//! Specification (5.4, Volume 3 Part C Section 2.2.2)
//!
//! These traits should be implemented outside this crate, conforming to the
//! types and structs here when necessary.

use bt_common::{PeerId, Uuid};

#[derive(Debug, Clone)]
pub enum AdvertisingDatum {
    Services(Vec<Uuid>),
    ServiceData(Uuid, Vec<u8>),
    ManufacturerData(u16, Vec<u8>),
    // TODO: Update to a more structured Appearance
    Appearance(u16),
    TxPowerLevel(i8),
    Uri(String),
}

/// Matches a single advertised attribute or condition from a Bluetooth Low
/// Energy peer.
#[derive(Clone, Debug)]
pub enum Filter {
    /// Advertised Service UUID
    ServiceUuid(Uuid),
    /// ServiceData is included which is associated with the UUID
    HasServiceData(Uuid),
    /// ManufacturerData is provided with the Company Identifier Code given
    HasManufacturerData(u16),
    /// Connectable flag is set
    IsConnectable,
    /// String provided is included in the peer's name
    MatchesName(String),
    /// Path loss from the peer (RSSI - Advertised TX Power) is below the given
    /// dB value
    MaxPathLoss(i8),
}

/// A ScanFilter must match all of its combined filters and conditions to
/// provide a result. Currently can only include zero or more Filters.
/// The Default ScanFilter will match everything and should be avoided.
#[derive(Default, Clone, Debug)]
pub struct ScanFilter {
    pub filters: Vec<Filter>,
}

impl From<Filter> for ScanFilter {
    fn from(value: Filter) -> Self {
        ScanFilter { filters: vec![value] }
    }
}

impl ScanFilter {
    pub fn add(&mut self, filter: Filter) -> &mut Self {
        self.filters.push(filter);
        self
    }
}

#[derive(Debug, Clone)]
pub enum PeerName {
    Unknown,
    PartialName(String),
    CompleteName(String),
}

#[derive(Debug, Clone)]
pub struct ScanResult {
    pub id: PeerId,
    pub connectable: bool,
    pub name: PeerName,
    pub advertised: Vec<AdvertisingDatum>,
}

pub trait Central<T: crate::GattTypes> {
    /// Scan for peers.
    /// If any of the filters match, the results will be returned in the Stream.
    fn scan(&self, filters: &[ScanFilter]) -> T::ScanResultStream;

    /// Connect to a specific peer.
    fn connect(&self, peer_id: PeerId) -> T::ConnectFuture;
}
