// Copyright 2023 Google LLC
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use bt_common::debug_command::CommandRunner;
use bt_common::debug_command::CommandSet;
use bt_common::gen_commandset;

use bt_gatt::{
    client::{PeerService, PeerServiceHandle},
    Client,
};

use crate::*;

gen_commandset! {
    PacsCmd {
        Print = ("print", [], [], "Print the current PACS status"),
    }
}

pub struct PacsDebug<T: bt_gatt::GattTypes> {
    client: T::Client,
}

impl<T: bt_gatt::GattTypes> PacsDebug<T> {
    pub fn new(client: T::Client) -> Self {
        Self { client }
    }
}

impl<T: bt_gatt::GattTypes> CommandRunner for PacsDebug<T> {
    type Set = PacsCmd;
    type Error = bt_gatt::types::Error;
    type Event = ();

    fn run_command(
        &self,
        _cmd: Self::Set,
        _args: Vec<String>,
    ) -> impl futures::Future<Output = Result<(), Self::Error>> {
        async {
            // Since there is only one command, Print, we just print
            // all the characteristics that are at the remote PACS server.
            let handles = self.client.find_service(PACS_UUID).await?;
            for handle in handles {
                let service = handle.connect().await?;

                let chrs = service.discover_characteristics(None).await?;
                for chr in chrs {
                    let mut buf = [0; 120];
                    match chr.uuid {
                        SourcePac::UUID => {
                            let source_pac = SourcePac::try_read::<T>(chr, &service).await?;
                            println!("{source_pac:?}");
                        }
                        SinkPac::UUID => {
                            let sink_pac = SinkPac::try_read::<T>(chr, &service).await?;
                            println!("{sink_pac:?}");
                        }
                        SinkAudioLocations::UUID => {
                            let locations =
                                SinkAudioLocations::try_read::<T>(chr, &service).await?;
                            println!("{locations:?}");
                        }
                        SourceAudioLocations::UUID => {
                            let (bytes, _trunc) =
                                service.read_characteristic(&chr.handle, 0, &mut buf).await?;
                            let locations = SourceAudioLocations::from_chr(chr, &buf[..bytes])
                                .map_err(bt_gatt::types::Error::other)?;
                            println!("{locations:?}");
                        }
                        AvailableAudioContexts::UUID => {
                            let (bytes, _trunc) =
                                service.read_characteristic(&chr.handle, 0, &mut buf).await?;
                            let contexts = AvailableAudioContexts::from_chr(chr, &buf[..bytes])
                                .map_err(bt_gatt::types::Error::other)?;
                            println!("{contexts:?}");
                        }
                        SupportedAudioContexts::UUID => {
                            let (bytes, _trunc) =
                                service.read_characteristic(&chr.handle, 0, &mut buf).await?;
                            let contexts = SupportedAudioContexts::from_chr(chr, &buf[..bytes])
                                .map_err(bt_gatt::types::Error::other)?;
                            println!("{contexts:?}");
                        }
                        _x => println!("Unrecognized Chr {}", chr.uuid.recognize()),
                    }
                }
            }
            Ok::<(), bt_gatt::types::Error>(())
        }
    }
}
