use fabro_graphviz::graph::Graph;
use fabro_graphviz::parser;
use fabro_model::{Catalog, ProviderId};
use fabro_types::WorkflowSettings;
use fabro_types::settings::InterpString;
use fabro_types::settings::run::{PullRequestSettings, RunGoal, RunModelSettings, RunNamespace};
use fabro_workflow::run_materialization::materialize_run;

fn graph(source: &str) -> Graph {
    parser::parse(source).expect("graph should parse")
}

#[test]
fn materialize_run_applies_graph_and_catalog_defaults() {
    let source = r#"digraph Test {
        graph [goal="Build feature"]
        start [shape=Mdiamond]
        exit  [shape=Msquare]
        start -> exit
    }"#;

    let settings = WorkflowSettings {
        run: RunNamespace {
            model: RunModelSettings {
                name: Some("sonnet".to_string()),
                ..RunModelSettings::default()
            },
            pull_request: Some(PullRequestSettings {
                enabled: false,
                ..PullRequestSettings::default()
            }),
            ..RunNamespace::default()
        },
        ..WorkflowSettings::default()
    };

    let materialized = materialize_run(settings, &graph(source), Catalog::builtin(), &[
        ProviderId::anthropic(),
    ])
    .unwrap();
    let resolved = &materialized.run;

    assert_eq!(resolved.model.name.as_deref(), Some("claude-sonnet-5"));
    assert_eq!(resolved.model.provider.as_deref(), Some("anthropic"));
    assert_eq!(
        materialized.run.goal.as_ref(),
        Some(&RunGoal::Inline(InterpString::parse("Build feature")))
    );
    assert!(resolved.pull_request.is_none());
}

#[test]
fn materialize_run_uses_configured_provider_defaults() {
    let source = r#"digraph Test {
        graph [goal="Build feature"]
        start [shape=Mdiamond]
        exit  [shape=Msquare]
        start -> exit
    }"#;

    let materialized = materialize_run(
        WorkflowSettings::default(),
        &graph(source),
        Catalog::builtin(),
        &[ProviderId::openai()],
    )
    .unwrap();
    let resolved = &materialized.run;

    assert_eq!(resolved.model.provider.as_deref(), Some("openai"));
}
