use std::{collections::HashMap, fmt};

use crate::util::state::NodeSpecs;
use ethtool::{self, EthtoolAttr, EthtoolMessage};

pub fn collect_specs() -> NodeSpecs {
    let mut sys = sysinfo::System::new_all();
    NodeSpecs {
        threads: sys.cpus().len().try_into().unwrap(),
        mem: sys.total_memory(),
        net_speed: 13.0,
    }
}

use futures::stream::TryStreamExt;
use log::{debug, error, info};

pub async fn network() {
    let mut interfaces = vec![];
    match nix::ifaddrs::getifaddrs() {
        Ok(ifaddrs) => {
            debug!("{:?}", ifaddrs);
            for ifaddr in ifaddrs {
                if let Some(interface_name) = Some(ifaddr.interface_name) {
                    if let Some(flags) = Some(ifaddr.flags) {
                        let is_up = flags.contains(nix::net::if_::InterfaceFlags::IFF_UP);
                        let is_running = flags.contains(nix::net::if_::InterfaceFlags::IFF_RUNNING);

                        if is_up && is_running {
                            interfaces.push(interface_name);
                        }
                    }
                }
            }
        }
        Err(err) => {
            error!("Failed to get network interfaces: {}", err);
        }
    }
    debug!("{:?}", interfaces);
    let mut interface_speeds: Vec<(String, i64)> = vec![];
    let mut visited_interfaces = vec![];
    for interface in interfaces {
        let path = format!("{}{}{}", "/sys/class/net/", interface, "/speed");
        debug!("{}", &path);
        if !path.contains("lo") {
            let speed = std::fs::read_to_string(path).unwrap();
            debug!("SPEED: {}", &speed);
            interface_speeds.push((interface, speed.trim_end().parse::<i64>().unwrap()));
        }
    }
    // let res = get_link_mode(Some("enp42s0")).await;
    debug!("{:#?}", interface_speeds);
}

// async fn get_link_mode(
//     iface_name: Option<&str>,
// ) -> Vec<netlink_packet_generic::message::GenlMessage<EthtoolMessage>> {
//     let (connection, mut handle, _) = ethtool::new_connection().unwrap();
//     tokio::spawn(connection);
//
//     let mut link_mode_handle = handle.link_mode().get(iface_name).execute().await;
//
//     let mut msgs = Vec::new();
//     while let Some(msg) = link_mode_handle.try_next().await.unwrap() {
//         msgs.push(msg);
//     }
//     assert!(!msgs.is_empty());
//     let mut lm = None;
//     for msg in &msgs {
//         let payl = msg.payload.clone();
//         for linkmode in payl.nlas {
//             match &linkmode {
//                 ethtool::EthtoolAttr::LinkMode(ethtool::EthtoolLinkModeAttr::Speed(_)) => {
//                     lm = Some(linkmode)
//                 }
//                 _ => continue,
//             };
//         }
//     }
//     // if lm.is_some() {
//     debug!("{:#?}", lm.clone().unwrap());
//     let speed = lm.unwrap();
//     speed.
//     // }
//     msgs
// }