//! Arguments for `mcptest scenario`.
//!
//! The scenario subcommand replays a recorded trajectory against a seeded
//! hidden world and gates the run on the deterministic oracles (final-state
//! diff, invalid actions, forbidden transitions) plus the `expect:` block.
//! The cassette path runs in CI without a live model.

use std::path::PathBuf;

use clap::{Args, Subcommand};

/// Arguments for `mcptest scenario`.
#[derive(Debug, Args)]
pub struct ScenarioArgs {
    /// Which scenario operation to run.
    #[command(subcommand)]
    pub command: ScenarioCommand,
}

/// Subcommands for `mcptest scenario`.
#[derive(Debug, Subcommand)]
pub enum ScenarioCommand {
    /// Replay each scenario in a suite against its world and report the
    /// final-state diff, invalid actions, recovery attempts, escalations,
    /// refusals, and assertion results.
    Run(ScenarioRunArgs),
}

/// Arguments for `mcptest scenario run`.
#[derive(Debug, Args)]
pub struct ScenarioRunArgs {
    /// Suite YAML file declaring a `scenarios:` block.
    #[arg(value_name = "SUITE")]
    pub suite: PathBuf,

    /// Directory to resolve scenario `cassette:` paths against. Defaults to
    /// the suite file's directory.
    #[arg(long, value_name = "DIR")]
    pub cassette_dir: Option<PathBuf>,

    /// Run only the scenario with this name (repeatable). Without it, every
    /// scenario in the suite runs.
    #[arg(long = "name", value_name = "NAME")]
    pub names: Vec<String>,

    /// Emit the structured scenario reports as JSON instead of the
    /// human-readable summary.
    #[arg(long)]
    pub json: bool,
}
