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

use bt_common::PeerId;
use bt_gatt::GattTypes;

use crate::types::{Error, SupportedCapabilities};

/// Represents a connection to a single peer and manages its audio streams.
pub struct BapUnicastClient<T: GattTypes> {
    peer_id: PeerId,
    #[allow(unused)]
    gatt_client: T::Client,
    // TODO: Add ASCS and PACS clients here.
}

impl<T: GattTypes> BapUnicastClient<T> {
    pub fn new(peer_id: PeerId, gatt_client: T::Client) -> Self {
        Self { peer_id, gatt_client }
    }

    pub fn peer_id(&self) -> PeerId {
        self.peer_id
    }

    /// Discovers PACS and ASCS and returns supported configurations.
    pub async fn discover(&mut self) -> Result<SupportedCapabilities, Error> {
        // TODO: Implement actual discovery.
        // Using dummy data for now to trigger skeleton mapping logic.
        let pac_records = vec![bt_pacs::PacRecord {
            codec_id: bt_common::core::CodecId::Assigned(bt_common::core::CodingFormat::Lc3),
            codec_specific_capabilities: vec![],
            metadata: vec![],
        }];
        let sink_ase_count = 1;
        let source_ase_count = 1;

        Ok(crate::mapping::map_capabilities(&pac_records, sink_ase_count, source_ase_count))
    }
}
