#!/usr/bin/python3 -I
"""Fake-"Codex" fuer die Caged-Runner-Integrationstests. Startet INNERHALB des Kaefigs via
python3 (NIE das echte codex). Ahmt `codex exec --json -o last.txt` nach:
emittiert JSONL-Events auf stdout und schreibt die letzte Agent-Nachricht nach <cwd>/last.txt.

Modi:
  ok   <text>            : erfolgreicher Turn mit <text>, last.txt = <text>, exit 0
  sleep <secs> <pidfile> : schreibt die eigene setsid-Enkel-PID nach <pidfile>, schlaeft (Timeout-Test)
"""
import json
import os
import sys
import time


def emit(text):
    for line in (
        {"type": "thread.started", "thread_id": "fake"},
        {"type": "turn.started"},
        {"type": "item.completed", "item": {"id": "i0", "type": "agent_message", "text": text}},
        {"type": "turn.completed", "usage": {"input_tokens": 1, "output_tokens": 1}},
    ):
        sys.stdout.write(json.dumps(line) + "\n")
    sys.stdout.flush()


def main():
    mode = sys.argv[1]
    if mode == "ok":
        text = sys.argv[2] if len(sys.argv) > 2 else "OK"
        with open("last.txt", "w", encoding="utf-8") as fh:   # cwd == workspace (iso_exec chdir)
            fh.write(text)
        emit(text)
        return 0
    if mode == "sleep":
        secs = float(sys.argv[2])
        pidfile = sys.argv[3]
        pid = os.fork()
        if pid == 0:
            os.setsid()                      # eigener Prozessbaum (Enkel)
            try:
                with open(pidfile, "w", encoding="utf-8") as fh:
                    fh.write(str(os.getpid()))
            except OSError:
                pass
            time.sleep(secs)
            os._exit(0)
        time.sleep(secs)
        return 0
    return 3


if __name__ == "__main__":
    sys.exit(main())
