// 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 crate::types::{CodecCapabilitySetting, Configuration};
use bt_pacs::PacRecord;
use std::collections::HashMap;

/// Maps discovered capabilities and endpoints to supported configurations.
pub fn map_capabilities(
    pac_records: &[PacRecord],
    sink_ase_count: usize,
    source_ase_count: usize,
) -> HashMap<Configuration, Vec<CodecCapabilitySetting>> {
    let mut mapping = HashMap::new();

    // TODO: Implement actual mapping logic based on PAC records.
    // This is a skeleton implementation that returns hardcoded values if
    // resources are available.

    if pac_records.is_empty() {
        return mapping;
    }

    // Configuration 1: Mono Audio Sink (Client to Server)
    // Requires 1 Sink ASE.
    if sink_ase_count >= 1 {
        mapping.insert(
            Configuration::MonoAudioSink,
            vec![CodecCapabilitySetting::Lc3_48_2, CodecCapabilitySetting::Lc3_16_2],
        );
    }

    // Configuration 3: Conversational (Bidirectional)
    // Requires 1 Sink ASE and 1 Source ASE.
    if sink_ase_count >= 1 && source_ase_count >= 1 {
        mapping.insert(Configuration::Conversational, vec![CodecCapabilitySetting::Lc3_16_2]);
    }

    mapping
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_map_capabilities_empty() {
        let mapping = map_capabilities(&[], 0, 0);
        assert!(mapping.is_empty());
    }

    #[test]
    fn test_map_capabilities_with_resources() {
        // Create a dummy PacRecord
        // We need to mock it or use a real one if easy.
        // For now, we just need a non-empty slice to trigger the skeleton
        // logic.
        let pac_records = vec![PacRecord {
            codec_id: bt_common::core::CodecId::Assigned(bt_common::core::CodingFormat::Lc3),
            codec_specific_capabilities: vec![],
            metadata: vec![],
        }];

        let mapping = map_capabilities(&pac_records, 1, 1);
        assert!(mapping.contains_key(&Configuration::MonoAudioSink));
        assert!(mapping.contains_key(&Configuration::Conversational));
    }
}
