use clap::{Parser, Subcommand};

use crate::output::OutputFormat;

#[derive(Parser)]
#[command(name = "stemedb-admin")]
#[command(version)]
#[command(about = "StemeDB Cluster Administration Tool", long_about = None)]
pub struct Cli {
    /// Gateway address
    #[arg(long, env = "STEMEDB_GATEWAY_ADDR", default_value = "http://localhost:18181")]
    pub gateway: String,

    /// Output format (table, json)
    #[arg(short, long, default_value = "table")]
    pub format: OutputFormat,

    /// Enable verbose logging
    #[arg(short, long)]
    pub verbose: bool,

    #[command(subcommand)]
    pub command: Commands,
}

#[derive(Subcommand)]
pub enum Commands {
    /// Cluster operations
    Cluster {
        #[command(subcommand)]
        cmd: ClusterCommands,
    },
    /// Node operations
    Node {
        #[command(subcommand)]
        cmd: NodeCommands,
    },
    /// Shard operations
    Shard {
        #[command(subcommand)]
        cmd: ShardCommands,
    },
    /// Debug operations
    Debug {
        #[command(subcommand)]
        cmd: DebugCommands,
    },
}

#[derive(Subcommand)]
pub enum ClusterCommands {
    /// Show cluster status overview
    Status,
    /// Quick health check (exit code 0 if healthy, 1 if unhealthy)
    Health,
}

#[derive(Subcommand)]
pub enum NodeCommands {
    /// List all nodes in the cluster
    List,
    /// Show detailed information about a specific node
    Info {
        /// Node ID (short hex format)
        node_id: String,
    },
    /// Show shards assigned to a specific node
    Shards {
        /// Node ID (short hex format)
        node_id: String,
        /// Show only leader shards
        #[arg(long)]
        leader: bool,
    },
}

#[derive(Subcommand)]
pub enum ShardCommands {
    /// List all shards
    List,
    /// Show detailed information about a specific shard
    Info {
        /// Shard ID
        shard_id: u32,
    },
    /// Show replica nodes for a specific shard
    Replicas {
        /// Shard ID
        shard_id: u32,
    },
}

#[derive(Subcommand)]
pub enum DebugCommands {
    /// Export complete cluster state for debugging
    Export {
        /// Output file path
        #[arg(short, long, default_value = "cluster-state.json")]
        output: String,
    },
}
