use clap::{Parser, Subcommand};
use radicle::node::Alias;

const ABOUT: &str = "Manage your local Radicle configuration";

const LONG_ABOUT: &str = r#"
If no argument is specified, prints the current Radicle configuration as JSON.
To initialize a new configuration file, use `rad config init`.
"#;

#[derive(Debug, Parser)]
#[command(about = ABOUT, long_about = LONG_ABOUT, disable_version_flag = true)]
pub struct Args {
    #[command(subcommand)]
    pub(crate) command: Option<Command>,
}

#[derive(Subcommand, Debug)]
#[group(multiple = false)]
pub(crate) enum Command {
    /// Show the current Radicle configuration as JSON (default)
    Show,
    /// Initialize a new config file
    Init {
        /// Alias to use for the new configuration
        #[arg(long)]
        alias: Alias,
    },
    /// Open the config in your editor
    Edit,
    /// Get a value from the current configuration
    // Command is obsolete.
    #[command(hide = true)]
    Get {
        /// The JSON key path to the value you want to get
        key: String,
    },
    /// Prints the JSON Schema of the Radicle configuration
    Schema,
    /// Set a key to a value in the current configuration
    // Command is obsolete.
    #[command(hide = true)]
    Set {
        /// The JSON key path to the value you want to set
        key: String,
        /// The JSON value used to set the field
        value: String,
    },
    /// Set a key in the current configuration to `null`
    // Command is obsolete.
    #[command(hide = true)]
    Unset {
        /// The JSON key path to the value you want to unset
        key: String,
    },
    /// Push a value onto an array, which is identified by the key, in the
    /// current configuration
    // Command is obsolete.
    #[command(hide = true)]
    Push {
        /// The JSON key path to the array you want to push to
        key: String,
        /// The JSON value being pushed onto the array
        value: String,
    },
    /// Remove a value from an array, which is identified by the key, in the
    /// current configuration
    ///
    /// All instances of the value in the array will be removed
    // Command is obsolete.
    #[command(hide = true)]
    Remove {
        /// The JSON key path to the array you want to push to
        key: String,
        /// The JSON value being pushed onto the array
        value: String,
    },
}
