// 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));
    }
}
