# recoil/pipeline/tests/test_ops_log_recovery.py
"""Two-line ops.log.jsonl protocol + crash recovery."""

import json
from pathlib import Path


def test_log_op_started_writes_pending_line(tmp_path):
    from recoil.pipeline._lib.ops_log import log_op_started

    log_path = tmp_path / "ops.log.jsonl"
    log_op_started(log_path, op_id="op_test12345678", name="asset.hero.set", args={"asset_id": "sadie"}, context={"project": "afterimage", "operator": "cli"})

    lines = log_path.read_text().strip().split("\n")
    assert len(lines) == 1
    record = json.loads(lines[0])
    assert record["status"] == "pending"
    assert record["id"] == "op_test12345678"
    assert record["name"] == "asset.hero.set"


def test_log_op_completed_appends_completion_line(tmp_path):
    from recoil.pipeline._lib.ops_log import log_op_started, log_op_completed

    log_path = tmp_path / "ops.log.jsonl"
    log_op_started(log_path, op_id="op_aaa", name="asset.hero.set", args={}, context={})
    log_op_completed(log_path, op_id="op_aaa", outputs={"path": "x.jpg"}, cost=0.0)

    lines = log_path.read_text().strip().split("\n")
    assert len(lines) == 2
    assert json.loads(lines[1])["status"] == "completed"


def test_scan_for_dangling_ops_returns_pending_without_completion(tmp_path):
    from recoil.pipeline._lib.ops_log import log_op_started, log_op_completed, scan_for_dangling_ops

    log_path = tmp_path / "ops.log.jsonl"
    log_op_started(log_path, op_id="op_aaa", name="x", args={}, context={})
    log_op_completed(log_path, op_id="op_aaa", outputs={}, cost=0.0)
    log_op_started(log_path, op_id="op_bbb", name="y", args={}, context={})  # dangling

    dangling = scan_for_dangling_ops(log_path)
    assert len(dangling) == 1
    assert dangling[0]["id"] == "op_bbb"


def test_log_op_failed_writes_failure_line(tmp_path):
    from recoil.pipeline._lib.ops_log import log_op_started, log_op_failed

    log_path = tmp_path / "ops.log.jsonl"
    log_op_started(log_path, op_id="op_xxx", name="z", args={}, context={})
    log_op_failed(log_path, op_id="op_xxx", error="quality gate failed", issues=["face_merge"])

    lines = log_path.read_text().strip().split("\n")
    assert json.loads(lines[1])["status"] == "failed"
    assert "face_merge" in json.loads(lines[1])["issues"]
