use fabro_test::{fabro_snapshot, test_context};
use insta::assert_snapshot;

#[test]
fn help() {
    let context = test_context!();
    let mut cmd = context.command();
    cmd.args(["repo", "init", "--help"]);
    fabro_snapshot!(context.filters(), cmd, @"
    success: true
    exit_code: 0
    ----- stdout -----
    Initialize a new project

    Usage: fabro repo init [OPTIONS]

    Options:
          --json              Output as JSON [env: FABRO_JSON=]
          --server <SERVER>   Fabro server target: http(s) URL or absolute Unix socket path [env: FABRO_SERVER=]
          --debug             Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
          --no-upgrade-check  Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
          --quiet             Suppress non-essential output [env: FABRO_QUIET=]
          --verbose           Enable verbose output [env: FABRO_VERBOSE=]
      -h, --help              Print help
    ----- stderr -----
    ");
}

#[test]
fn repo_init_creates_project_toml_and_hello_workflow() {
    let context = test_context!();
    context.git_init();

    let mut cmd = context.command();
    cmd.args(["repo", "init"]);

    fabro_snapshot!(context.filters(), cmd, @"
    success: true
    exit_code: 0
    ----- stdout -----
    ----- stderr -----
      ✔ .fabro/project.toml
      ✔ .fabro/workflows/hello/workflow.fabro
      ✔ .fabro/workflows/hello/workflow.toml

    Project initialized! Run a workflow with:

      fabro run hello

      ! No git remote found — skipping GitHub check
      Run `git remote add origin <url>`, then `gh auth login` or `fabro install` to configure GitHub access
    ");

    assert_snapshot!(
        std::fs::read_to_string(context.temp_dir.join(".fabro/project.toml")).unwrap(),
        @r###"
    # Fabro project configuration
    # https://docs.fabro.computer/getting-started/quick-start

    _version = 1

    # Auto-create pull requests on successful workflow runs.
    [run.pull_request]
    enabled = true
    draft = true
    # auto_merge = true
    "###
    );
    assert_snapshot!(
        std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.fabro"))
            .unwrap(),
        @r###"
    digraph Hello {
        graph [goal="Say hello and demonstrate a basic Fabro workflow"]
        rankdir=LR

        start [shape=Mdiamond, label="Start"]
        exit  [shape=Msquare, label="Exit"]

        greet [label="Greet", prompt="Say hello! Introduce yourself and explain that this is a test of the Fabro workflow engine."]

        start -> greet -> exit
    }
    "###
    );
    assert_snapshot!(
        std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.toml"))
            .unwrap(),
        @r###"
    _version = 1

    [workflow]
    graph = "workflow.fabro"

    [run.sandbox]
    provider = "local"
    "###
    );
}

#[test]
fn repo_init_rejects_already_initialized_repo() {
    let context = test_context!();
    context.git_init();
    std::fs::create_dir_all(context.temp_dir.join(".fabro")).unwrap();
    std::fs::write(
        context.temp_dir.join(".fabro/project.toml"),
        "_version = 1\n",
    )
    .unwrap();

    let mut cmd = context.command();
    cmd.args(["repo", "init"]);

    fabro_snapshot!(context.filters(), cmd, @"
    success: false
    exit_code: 1
    ----- stdout -----
    ----- stderr -----
    error: already initialized — .fabro/project.toml exists at [TEMP_DIR]/.fabro/project.toml
    ");
}

#[test]
fn repo_init_errors_outside_git_repo() {
    let context = test_context!();
    let mut cmd = context.command();
    cmd.args(["repo", "init"]);

    fabro_snapshot!(context.filters(), cmd, @"
    success: false
    exit_code: 1
    ----- stdout -----
    ----- stderr -----
    error: not a git repository — run `git init` first
    ");
}
