import os
import time
from pathlib import Path
from urllib.parse import quote, urlparse

import requests

BASE = "https://api.quickrouter.ai/api/v3/contents/generations/tasks"


def wait_for_video(task_id, headers, max_seconds=600):
    deadline = time.monotonic() + max_seconds
    url = BASE + "/" + quote(task_id, safe="")
    while time.monotonic() < deadline:
        response = requests.get(url, headers=headers, timeout=(10, 30))
        response.raise_for_status()
        task = response.json()
        status = task.get("status")
        if status == "succeeded":
            video_url = task.get("content", {}).get("video_url")
            if not video_url or urlparse(video_url).scheme != "https":
                raise ValueError("No HTTPS video URL in successful task")
            return video_url
        if status in {"failed", "cancelled", "canceled", "expired"}:
            raise RuntimeError("Video task ended: " + status + " " + str(task.get("error", "")))
        if status not in {"queued", "running"}:
            raise RuntimeError("Unknown task status: " + str(status))
        time.sleep(min(5, max(0, deadline - time.monotonic())))
    raise TimeoutError("Polling timed out; resume querying this task ID instead of creating another")


def download_video(url, target):
    if urlparse(url).scheme != "https":
        raise ValueError("Expected HTTPS download URL")
    target = Path(target)
    temporary = target.with_suffix(target.suffix + ".part")
    try:
        with requests.get(url, stream=True, timeout=(10, 120)) as response:
            response.raise_for_status()
            with temporary.open("wb") as output:
                for chunk in response.iter_content(1024 * 1024):
                    if chunk:
                        output.write(chunk)
        if temporary.stat().st_size == 0:
            raise ValueError("Empty video download")
        temporary.replace(target)
    except Exception:
        temporary.unlink(missing_ok=True)
        raise


def main():
    headers = {"Authorization": "Bearer " + os.environ["QUICKROUTER_API_KEY"]}
    response = requests.post(
        BASE,
        headers=headers,
        json={
            "model": os.environ["QUICKROUTER_VIDEO_MODEL"],
            "content": [{"type": "text", "text": "A small blue whale swimming slowly in clear water."}],
            "duration": 5,
            "ratio": "16:9",
        },
        timeout=(10, 60),
    )
    response.raise_for_status()
    task_id = response.json().get("id")
    if not task_id:
        raise ValueError("No task ID in creation response")
    Path("video-task-id.txt").write_text(task_id)
    print("task_id:", task_id, flush=True)
    download_video(wait_for_video(task_id, headers), "quickrouter-video.mp4")
    print("saved: quickrouter-video.mp4")


if __name__ == "__main__":
    main()
