from pathlib import Path
import datetime
import json
import os
import time
import urllib.request

ROOT = Path(__file__).resolve().parents[1]
INTENT_PATH = ROOT / "log/footage-intent.json"
TERMINAL_PATH = ROOT / "log/footage-terminal-response.json"


def atomic_json(path, value):
    temporary = Path(str(path) + ".tmp")
    temporary.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n")
    os.replace(temporary, path)


intent = json.loads(INTENT_PATH.read_text())
base_url = intent["base_url"]
jobs_path = intent["jobs_path"]
job_id = intent["job_id"]
status_url = f"{base_url}{jobs_path}/{job_id}"

while True:
    with urllib.request.urlopen(status_url, timeout=20) as response:
        job = json.loads(response.read())
    response_id = job.get("job_id") or job.get("id")
    if response_id != job_id:
        raise RuntimeError("Pinned job ID mismatch")
    status = job.get("status")
    checkpoint = {
        "base_url": base_url,
        "job_id": job_id,
        "status": status,
        "checked_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
    }
    atomic_json(ROOT / "log/footage-watch.json", checkpoint)
    if status in {"completed", "failed", "cancelled"}:
        terminal = {
            "base_url": base_url,
            "job_id": job_id,
            "received_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
            "response": job,
        }
        atomic_json(TERMINAL_PATH, terminal)
        print(json.dumps(terminal, ensure_ascii=False))
        if status != "completed":
            raise SystemExit(2)
        break
    time.sleep(30)
