#!/usr/bin/env python3
"""Batch-запуск 1cv8 на macOS с ожиданием отсоединённого процесса.

Лаунчер 1cv8 под Rosetta отдаёт управление сразу (и сам стабильно падает с
SIGSEGV — на результат не влияет, реальная работа идёт в фоновом процессе),
поэтому завершение ловим по pgrep уникального tmp-пути в argv.
"""
from __future__ import annotations

import os
import subprocess
import tempfile
import time
from pathlib import Path

PLATFORM = Path(os.environ.get("ONEC_V8_DIR", "/opt/1cv8/8.3.27.1859"))
V8 = str(PLATFORM / "1cv8.app/Contents/MacOS/1cv8")


def run(args: list[str], timeout_s: int = 900) -> tuple[bool, str, float]:
    """Возвращает (успел_ли_завершиться, текст лога /Out, секунды)."""
    tmp = Path(tempfile.mkdtemp(prefix="onec_tb_", dir="/tmp"))
    out = tmp / "v8.log"
    t0 = time.time()
    try:
        subprocess.run([V8, *args, "/Out", str(out)],
                       capture_output=True, timeout=90, check=False)
    except subprocess.TimeoutExpired:
        pass
    time.sleep(2)
    deadline = time.time() + timeout_s
    done = False
    while time.time() < deadline:
        if subprocess.run(["/usr/bin/pgrep", "-f", str(tmp)],
                          capture_output=True, check=False).returncode != 0:
            done = True
            break
        time.sleep(1)
    if not done:
        subprocess.run(["/usr/bin/pkill", "-9", "-f", str(tmp)], check=False)
    log = (out.read_text(encoding="utf-8-sig", errors="replace").strip()
           if out.exists() else "")
    return done, log, time.time() - t0


if __name__ == "__main__":
    import sys
    ok, log, secs = run(sys.argv[2:], int(sys.argv[1]))
    print(f"done={ok} elapsed={secs:.0f}s")
    print(log or "(лог пуст)")
