//! CLI フラグ・サブコマンド共通 E2E テスト（シナリオ #64–72）
//!
//! ヘルプ表示、バージョン表示、未知の引数などの CLI インターフェースを検証する。

use assert_cmd::Command;
use predicates::prelude::PredicateBooleanExt;

use super::super::helpers::TestEnv;

const MERGE_READY_PR_VIEW_JSON: &str = r#"{"state":"OPEN","isDraft":false,"mergeable":"MERGEABLE","mergeStateStatus":"CLEAN","reviewDecision":"APPROVED"}"#;
const MERGE_READY_PR_CHECKS_JSON: &str = r#"[{"bucket":"pass","state":"SUCCESS"}]"#;

const BIN: &str = "merge-ready";

fn cmd(env: &TestEnv) -> Command {
    let mut c = Command::cargo_bin(BIN).unwrap();
    env.apply(&mut c);
    c
}

// ── #64: 引数なし ─────────────────────────────────────────────────────────────

/// #64: 引数なし → "Usage:" を含むヘルプを表示
#[test]
fn test_default_no_args_shows_help() {
    let env = TestEnv::new(MERGE_READY_PR_VIEW_JSON, Some(MERGE_READY_PR_CHECKS_JSON));
    cmd(&env)
        .assert()
        .success()
        .stdout(predicates::str::contains("Usage:"));
}

// ── #65–67: トップレベルヘルプ ────────────────────────────────────────────────

/// #65 `help` / #66 `--help` / #67 `-h` → "Usage:" を含み "prompt" サブコマンドを含まない
#[rstest::rstest]
#[case::help_subcommand("help")]
#[case::help_long("--help")]
#[case::help_short("-h")]
fn test_top_level_help(#[case] arg: &str) {
    let env = TestEnv::new(MERGE_READY_PR_VIEW_JSON, Some(MERGE_READY_PR_CHECKS_JSON));
    cmd(&env)
        .arg(arg)
        .assert()
        .success()
        .stdout(predicates::str::contains("Usage:"))
        // "prompt" サブコマンドが Commands セクションに表示されないことを確認
        .stdout(predicates::str::contains("  prompt").not());
}

// ── #71: バージョン ───────────────────────────────────────────────────────────

/// #71: `--version` → CARGO_PKG_VERSION を含む
#[test]
fn test_version_flag() {
    let env = TestEnv::new(MERGE_READY_PR_VIEW_JSON, Some(MERGE_READY_PR_CHECKS_JSON));
    cmd(&env)
        .arg("--version")
        .assert()
        .success()
        .stdout(predicates::str::contains(env!("CARGO_PKG_VERSION")));
}

// ── #72: 未知の引数 ───────────────────────────────────────────────────────────

/// #72: 未知の引数 → exit 非ゼロ
#[test]
fn test_unknown_arg_fails() {
    let env = TestEnv::new(MERGE_READY_PR_VIEW_JSON, Some(MERGE_READY_PR_CHECKS_JSON));
    cmd(&env).arg("unknown").assert().failure();
}
