"""Withdraw new work while preserving an original writer/reviewer handoff."""
from pathlib import Path
from chio_process import ProcessClient, WorkerError
from mailbox_attribution import completed, invoke_recorded, save
import json


def withdraw_writer(writer: ProcessClient, reviewer: ProcessClient, evidence: Path):
    evidence.mkdir(mode=0o700)
    if writer.inspect()["process_id"] != "fixer" or reviewer.inspect()["process_id"] != "reviewer":
        raise ValueError("Wrong independently supplied process pair")
    original = invoke_recorded(writer, evidence, "handoff", "fix-417/send/v1", "send_jobs",
                               {"message_key": "fix-417", "payload": {"fix": "fix-417"}})
    sequence = completed(original)["sequence"]
    cancelled = writer.cancel()
    save(evidence / "cancellation.json", json.dumps(cancelled) + "\n")
    if cancelled["cancelled_processes"] != 1 or writer.inspect()["state"] != "cancelled":
        raise RuntimeError("Writer withdrawal did not persist")
    try:
        invoke_recorded(writer, evidence, "new-work", "fix-418/send/v1", "send_jobs",
                        {"message_key": "fix-418", "payload": {"fix": "fix-418"}})
    except WorkerError as error:
        if error.code != "cancelled":
            raise  # A transport failure would not establish withdrawal.
    else:
        raise RuntimeError("Cancelled writer admitted new work")
    visible = invoke_recorded(reviewer, evidence, "retained", "fix-417/receive/v1",
                             "receive_jobs", {"after_sequence": str(int(sequence) - 1), "limit": 10})
    messages = completed(visible)["messages"]
    if len(messages) != 1 or messages[0]["sequence"] != sequence or messages[0]["sender"] != "fixer":
        raise RuntimeError("Withdrawal erased original handoff or permitted new work")
    if (evidence / "handoff.receipts.jsonl").read_text() != original["receipt_json"] + "\n":
        raise RuntimeError("Original receipt changed")
    print("WITHDRAW fixer: new operation returns cancelled before a per-call receipt")
    print("RETAIN original fixer message and receipt; reviewer can still inspect the handoff")
    return original
