use crate::{app::Application, query::*, units::DataUnit};
use anyhow::Result;
pub use clap::{Parser, Subcommand};
#[derive(Parser, Debug)]
#[command(
    author = "inunix3",
    version = "0.2.0",
    long_about = None,
)]
pub struct Cli {
        #[arg(short = 'I', long)]
    pub interval: Option<humantime::Duration>,
            #[arg(short = 'n', long, default_value_t = 1, verbatim_doc_comment)]
    pub run_times: u64,
        #[arg(short, long, default_value = "\n")]
    pub delimiter: String,
        #[arg(short = 'u', long, default_value_t = DataUnit::Bytes)]
    pub data_unit: DataUnit,
    #[command(subcommand)]
    pub cmd: CliCommand,
                    #[arg(short, long, verbatim_doc_comment)]
    pub fmt: Option<String>,
}
#[derive(Subcommand, Debug)]
pub enum CliCommand {
    Os {
        queries: Vec<OsQuery>,
    },
    Cpu {
        #[clap(value_parser)]
        name: String,
        queries: Vec<CpuQuery>,
    },
    Memory {
        queries: Vec<MemoryQuery>,
    },
    Swap {
        queries: Vec<SwapQuery>,
    },
    Drive {
        name: String,
        queries: Vec<DriveQuery>,
    },
    Sensor {
        name: String,
        queries: Vec<SensorQuery>,
    },
    Network {
        name: String,
        queries: Vec<NetworkQuery>,
    },
        ListSensors,
        ListCpus,
        ListNetworks,
}
impl CliCommand {
    pub fn exec(&self, cli: &Cli) -> Result<Vec<String>> {
        let mut output: Vec<String> = vec![];
        let mut app = Application::new();
        let (mut cmd, queries) = app.command_from_cli(cli)?;
        if !queries.is_empty() {
            for q in queries {
                output.extend(cmd.exec(q));
            }
        } else {
            output.extend(cmd.exec(Query::None));
        }
        Ok(output)
    }
}