// Copyright 2025 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 synchronize to Periodic Advertisements,
//! i.e. the GAP Central role 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::core::Phy;
use futures::{Future, Stream};
use thiserror::Error;

use bt_common::PeerId;

#[derive(Error, Debug)]
#[non_exhaustive]
pub enum Error {
    #[error("Periodic Advertising Sync failed to establish")]
    SyncEstablishFailed,
    #[error("Periodic Advertising Sync lost")]
    SyncLost,
    #[error("I/O error")]
    Io,
}

/// A trait for managing a periodic advertising.
pub trait PeriodicAdvertising {
    type SyncFut: Future<Output = crate::Result<Self::SyncStream>>;
    type SyncStream: Stream<Item = crate::Result<SyncReport>>;

    /// Request to sync to periodic advertising resports.
    /// On success, returns the SyncStream which can be used to receive
    /// SyncReports.
    fn sync_to_advertising_reports(
        peer_id: PeerId,
        advertising_sid: u8,
        config: SyncConfiguration,
    ) -> Self::SyncFut;

    // TODO(b/340885203): Add a method to sync to subevents.
}

#[derive(Debug, Clone)]
pub struct SyncConfiguration {
    /// Filter out duplicate advertising reports.
    /// Optional.
    /// Default: true
    pub filter_duplicates: bool,
}

#[derive(Debug, Clone)]
pub struct PeriodicAdvertisingReport {
    pub rssi: i8,
    pub data: Vec<u8>,
    /// The event counter of the event that the advertising packet was received
    /// in.
    pub event_counter: Option<u16>,
    /// The subevent number of the report. Only present if the packet was
    /// received in a subevent.
    pub subevent: Option<u8>,
    pub timestamp: i64,
}

#[derive(Debug, Clone)]
pub struct BroadcastIsochronousGroupInfo {
    /// The number of Broadcast Isochronous Streams in this group.
    /// The specification calls this "num_bis".
    pub streams_count: u8,
    /// The time interval of the periodic SDUs.
    pub sdu_interval: i64,
    /// The maximum size of an SDU.
    pub max_sdu_size: u16,
    /// The PHY used for transmission of data.
    pub phy: Phy,
    /// Indicates whether the BIG is encrypted.
    pub encryption: bool,
}

#[derive(Debug, Clone)]
pub struct BroadcastIsochronousGroupInfoReport {
    pub info: BroadcastIsochronousGroupInfo,
    pub timestamp: i64,
}

#[derive(Debug, Clone)]
pub enum SyncReport {
    PeriodicAdvertisingReport(PeriodicAdvertisingReport),
    BroadcastIsochronousGroupInfoReport(BroadcastIsochronousGroupInfoReport),
}
