#!/usr/bin/env python3
"""Submit one image task, or resume polling an already saved task. No POST retries."""
import argparse
import json
import os
from pathlib import Path
import time
import urllib.error
import urllib.parse
import urllib.request


def request(method, path, payload=None):
    base = os.environ.get("SEEDROUTER_BASE_URL", "https://api.seedrouter.ai/v1").rstrip("/")
    key = os.environ["SEEDROUTER_API_KEY"]
    data = None if payload is None else json.dumps(payload).encode()
    req = urllib.request.Request(base + path, data=data, method=method, headers={
        "Authorization": "Bearer " + key, "Content-Type": "application/json",
    })
    with urllib.request.urlopen(req, timeout=60) as response:
        return json.load(response)


def submit(body, state):
    # Reserve the file before POST. An ambiguous request leaves a marker so
    # rerunning this command cannot silently create a second paid job.
    with state.open("x") as output:
        json.dump({"submission": "unconfirmed"}, output)
    try:
        response = request("POST", "/images/generations", body)
        task_id = response.get("id")
        if not isinstance(task_id, str) or not task_id:
            raise ValueError("Submission did not return a task ID")
        state.write_text(json.dumps({"id": task_id}) + "\n")
        return {"id": task_id}
    except Exception:
        raise RuntimeError("Submission could not be confirmed. Check task history before submitting again; the state marker was retained.") from None


def poll(state, timeout):
    saved = json.loads(state.read_text())
    if not saved.get("id"):
        raise ValueError("No confirmed task ID in the state file. Check task history first.")
    deadline = time.monotonic() + timeout
    path = "/tasks/" + urllib.parse.quote(saved["id"], safe="")
    while time.monotonic() < deadline:
        task = request("GET", path)
        if task.get("status") == "completed":
            return task.get("output", {})
        if task.get("status") == "failed":
            raise RuntimeError("Image task failed; inspect its task details.")
        time.sleep(5)
    raise TimeoutError("Polling wait ended. Resume polling the same state file; do not resubmit automatically.")


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    commands = parser.add_subparsers(dest="command", required=True)
    create = commands.add_parser("submit")
    create.add_argument("request", type=Path)
    create.add_argument("--state", type=Path, required=True)
    read = commands.add_parser("poll")
    read.add_argument("--state", type=Path, required=True)
    read.add_argument("--timeout", type=int, default=3600)
    args = parser.parse_args()
    result = submit(json.loads(args.request.read_text()), args.state) if args.command == "submit" else poll(args.state, args.timeout)
    print(json.dumps(result, indent=2))


if __name__ == "__main__":
    main()
