use clap::Parser;
#[derive(Parser, Debug)]
pub struct App {
    #[clap(flatten)]
    pub args: Args,
    #[clap(subcommand)]
    pub command: Command,
}
#[derive(Parser, Debug)]
#[command(version)]
pub struct Args {
    #[arg(short, long, default_value = "https://api.mainnet-beta.solana.com")]
    pub url: String,
    #[arg(short, long, default_value = "wss://api.mainnet-beta.solana.com")]
    pub ws_url: String,
    #[arg(short, long)]
    pub keypair_path: Option<String>,
    #[arg(long, action = clap::ArgAction::SetTrue)]
    pub tokio_console: Option<bool>,
}
#[derive(Debug, Parser)]
pub enum Command {
    ArcAgent {},
    BundleStatus {
        #[arg(long)]
        bundle: String,
    },
    DownloadRaydiumJson {
        #[arg(long, action = clap::ArgAction::SetTrue)]
        update: Option<bool>,
    },
    SweepRaydium {
        #[arg(long)]
        wallet_path: String,
    },
    CloseTokenAccounts {
        #[arg(long)]
        wallet_path: String,
    },
    PumpService {},
    GrabMetadata {
        #[arg(long)]
        mint: String,
    },
    SellPump {
        #[arg(long)]
        mint: String,
    },
    BumpPump {
        #[arg(long)]
        mint: String,
    },
    SweepPump {
        #[arg(long)]
        wallet_path: String,
    },
    SnipePump {
        #[arg(long, action = clap::ArgAction::SetTrue)]
        only_listen: Option<bool>,
    },
    BuyPumpToken {
        #[arg(long)]
        mint: String,
    },
    GenerateCustomAddress {
        #[arg(long)]
        prefixes: Vec<String>,
    },
    Ata {
        #[arg(long)]
        mint: String,
    },
    SplStream {
        #[arg(long)]
        ata: String,
    },
    MonitorMempool {},
    SellerService {},
    CheckerService {},
    Checks {
        #[arg(long)]
        signature: String,
    },
    Blockhash {},
    ListenForSolPooled {
        #[arg(long)]
        amm_pool: String,
    },
    BuyerService {},
    TrackPosition {
        #[arg(long)]
        amm_pool: String,
        #[arg(long)]
        owner: String,
    },
    TopHolders {
        #[arg(long)]
        mint: String,
    },
    MonitorLeaders {},
    MonitorSlots {},
    Price {
        #[arg(long)]
        amm_pool: String,
    },
    BenchRPC {
        #[arg(long)]
        rpc_url: String,
    },
    PriorityFee {},
    Tx {
        #[arg(short, long)]
        signature: String,
    },
    Listen {
        #[arg(long, default_value_t = 10)]
        worker_count: i32,
        #[arg(long, default_value_t = 10)]
        buffer_size: i32,
    },
    ListenForBurn {
        #[arg(long)]
        amm_pool: String,
    },
    ListenerService {
        #[arg(long, action = clap::ArgAction::SetTrue)]
        webhook: Option<bool>,
    },
    Snipe {},
    Wallet {},
    ParsePool {
        #[arg(long)]
        signature: String,
    },
    Swap {
        #[arg(long)]
        input_mint: String,
        #[arg(long)]
        output_mint: String,
        #[arg(long)]
        amount: Option<i64>,
        #[arg(long)]
        slippage: Option<u16>,
        #[arg(long)]
        dex: Option<String>,
        #[arg(long)]
        amm_pool_id: Option<String>,
        #[clap(short, long, action = clap::ArgAction::SetTrue)]
        yes: Option<bool>,
    },
}