# Python 3.10+; install requests. Keep your API key on your server.
import os
import sys
import time
import uuid
from pathlib import Path
from urllib.parse import urljoin
import requests

base = os.environ.get("CLEARCUT_BASE_URL", "https://clearcut.sh").rstrip("/")
headers = {"X-API-Key": os.environ["CLEARCUT_API_KEY"]}
# Save this key with your task; reuse it with identical data after a network timeout.
request_key = os.environ.get("CLEARCUT_REQUEST_ID") or str(uuid.uuid4())
print("Request ID:", request_key, file=sys.stderr, flush=True)
source = Path(sys.argv[1])
output = Path(sys.argv[2] if len(sys.argv) > 2 else "cutout.png")

with source.open("rb") as image:
    response = requests.post(
        base + "/v1.0/removebg",
        headers={**headers, "Idempotency-Key": request_key},
        files={"image_file": (source.name, image)},
        data={"size": "full", "format": "png", "quality": "fast"},
        timeout=65,
    )
response.raise_for_status()

if response.status_code == 202:
    job_id = response.json()["error"]["job_id"]
    print("Queued job:", job_id, file=sys.stderr, flush=True)
    deadline = time.monotonic() + 360
    while time.monotonic() < deadline:
        time.sleep(2)
        status = requests.get(base + "/api/jobs/" + job_id,
                              headers=headers, timeout=30)
        if status.status_code == 429:
            time.sleep(float(status.headers.get("Retry-After", "2")))
            continue
        status.raise_for_status()
        job = status.json()
        if job["status"] == "error":
            raise RuntimeError(job.get("error") or "Processing failed")
        if job["status"] == "done":
            response = requests.get(urljoin(base + "/", job["result_url"]),
                                    headers=headers, timeout=60)
            response.raise_for_status()
            break
    else:
        raise TimeoutError("Keep job ID " + job_id + "; check it before resubmitting")

if not response.headers.get("Content-Type", "").lower().startswith("image/png"):
    raise RuntimeError("Expected PNG; inspect the response before saving it")
output.write_bytes(response.content)
print("Saved", output)
