import json

from m3m_scout.demo import generate_synthetic_capture, run_demo
from m3m_scout.pipeline import analyze_reflectance_mosaics


def test_synthetic_demo_is_deterministic_and_never_claims_field_results(tmp_path):
    root = tmp_path
    (root / "config").mkdir()
    (root / "config" / "engineering-aoi.geojson").write_text(json.dumps({
        "type": "Polygon",
        "coordinates": [[[121.0, 24.0], [121.001, 24.0], [121.001, 24.001], [121.0, 24.001], [121.0, 24.0]]],
    }), encoding="utf-8")
    first = run_demo(root)
    second = run_demo(root)
    assert first["status"] == "PASSED"
    assert first["dataProvenance"] == "synthetic"
    assert first["fieldFlightExecuted"] is False
    assert first["flightExecutionAuthorized"] is False
    assert first["preflightDecision"] == "NO_GO"
    assert first["priorityZoneCount"] >= 2
    assert first["plannedWaypointCount"] > 10
    first_hashes = [(item["path"], item["sha256"]) for item in first["artifacts"]]
    second_hashes = [(item["path"], item["sha256"]) for item in second["artifacts"]]
    assert first_hashes == second_hashes


def test_public_outputs_do_not_contain_execution_or_diagnosis_claims(tmp_path):
    (tmp_path / "config").mkdir()
    (tmp_path / "config" / "engineering-aoi.geojson").write_text(json.dumps({
        "type": "Polygon",
        "coordinates": [[[121.0, 24.0], [121.001, 24.0], [121.001, 24.001], [121.0, 24.001], [121.0, 24.0]]],
    }), encoding="utf-8")
    run_demo(tmp_path)
    results = json.loads((tmp_path / "outputs" / "demo" / "analysis" / "analysis-results.json").read_text(encoding="utf-8"))
    mission = json.loads((tmp_path / "outputs" / "demo" / "mission" / "mission-summary.json").read_text(encoding="utf-8"))
    assert results["containsFieldResult"] is False
    assert mission["executionAuthorized"] is False
    assert "diagnosis" in results["decisionBoundary"]


def test_generic_four_band_pipeline_accepts_explicit_paths(tmp_path):
    capture = tmp_path / "capture"
    output = tmp_path / "analysis"
    paths = generate_synthetic_capture(capture, size=120)
    result = analyze_reflectance_mosaics(paths, capture / "capture-metadata.json", output)
    assert result["dataProvenance"] == "synthetic"
    assert result["containsFieldResult"] is False
    assert result["priorityZoneCount"] >= 1
    assert (output / "spectral-qc.json").is_file()
