use clap::{Parser, Subcommand};

#[derive(Debug, Parser)]
pub struct Cli {
    #[command(
        subcommand,
        help = "to manage Noxis work",
    )]
    command : Commands,
} 
#[derive(Debug, Subcommand)]
pub enum Commands {
    #[command(
        about = "To get info about current Noxis status",
    )]
    Status, 
    #[command(
        about = "To start Noxis process",
    )]
    Start(StartAction),
    #[command(
        about = "To stop Noxis process",
    )]
    Stop,
    #[command(
        about = "To restart Noxis process",
    )]
    Restart(StartAction),
    #[command(
        about = "To get list of processes that are being monitoring",
    )]
    Processes,
    // process command
    #[command(
        about = "To manage current process that is being monitoring",
    )]
    Process(ProcessCommand),
    // config command =
    #[command(
        about = "To manage config settings",
    )]
    Config(ConfigCommand),
}

#[derive(Debug, Parser)]
pub struct StartAction {
    #[arg(
        long="with-flags",
        num_args = 1.., 
        value_delimiter = ' '
    )]
    flags : Vec<String>,
}

#[derive(Debug, Parser)]
pub struct ConfigCommand {
    #[command(subcommand)]
    action : ConfigAction,
}

#[derive(Debug, Subcommand)]
pub enum ConfigAction {
    #[command(
        about = "To change current Noxis configuration",
    )]
    Local(LocalConfig),
    #[command(
        about = "To change credentials of the remote config server",
    )]
    Remote,
    #[command(
        about = "To reset all config settings",
    )]
    Reset,
}

#[derive(Debug, Parser)]
pub struct LocalConfig {
    // flag
    #[arg(
        long = "json",
        action,
        help = "to read following input as JSON", 
    )]
    is_json : bool,
    // value
    #[arg(
        help = "path to config file or config String (with --json flag)", 
    )]
    config : String,
}

#[derive(Debug, Parser)]
pub struct ProcessCommand {
    #[arg(
        help = "name of needed process",
    )]
    process : String,
    #[command(
        subcommand,
        help = "To get current process's status",
    )]
    action :  ProcessAction,
}

#[derive(Debug, Subcommand)]
enum ProcessAction {
    #[command(
        about = "To get info about current process status",
    )]
    Status, 
    #[command(
        about = "To start current process",
    )]
    Start, 
    #[command(
        about = "To stop current process",
    )]
    Stop, 
    #[command(
        about = "To freeze (hybernaze) current process",
    )]
    Freeze, 
    #[command(
        about = "To unfreeze (unhybernaze) current process",
    )]
    Unfreeze, 
    #[command(
        about = "To restart current process",
    )]
    Restart, 
    #[command(
        about = "To get info about current process's dependencies",
    )]
    Deps, 
    #[command(
        about = "To get info about current process's files-dependencies",
    )]
    Files, 
    #[command(
        about = "To get info about current process's services-dependencies",
    )]
    Services, 
}