import os
import time
import requests

api_key = os.environ.get("EVOLINK_API_KEY")
if not api_key:
    raise SystemExit("Set EVOLINK_API_KEY first")

base = os.environ.get("EVOLINK_API_BASE", "https://api.evolink.ai")
model = os.environ.get("SEEDANCE_MODEL", "seedance-2.5-text-to-video")
prompt = os.environ.get(
    "SEEDANCE_PROMPT",
    "A paper airplane crosses a sunlit studio and lands on a desk; smooth tracking pan",
)
image_urls = [url for url in os.environ.get("SEEDANCE_IMAGE_URLS", "").split(",") if url]
video_urls = [url for url in os.environ.get("SEEDANCE_VIDEO_URLS", "").split(",") if url]
audio_urls = [url for url in os.environ.get("SEEDANCE_AUDIO_URLS", "").split(",") if url]
timeout_seconds = int(os.environ.get("SEEDANCE_TIMEOUT_SECONDS", "600"))

models = {
    "seedance-2.5-text-to-video",
    "seedance-2.5-image-to-video",
    "seedance-2.5-reference-to-video",
    "seedance-2.5-video-edit",
    "seedance-2.5-video-extend",
}
if model not in models:
    raise SystemExit(f"Unsupported SEEDANCE_MODEL: {model}")
is_edit = model == "seedance-2.5-video-edit"
is_extend = model == "seedance-2.5-video-extend"
duration = int(os.environ.get("SEEDANCE_DURATION", "-1" if is_edit else "5"))
aspect_ratio = os.environ.get("SEEDANCE_ASPECT_RATIO", "adaptive")
if duration != -1 and not 4 <= duration <= 30:
    raise SystemExit("SEEDANCE_DURATION must be -1 or an integer from 4 to 30")
if model.endswith("image-to-video") and not 1 <= len(image_urls) <= 2:
    raise SystemExit("Image-to-video requires one or two SEEDANCE_IMAGE_URLS")
if model.endswith("reference-to-video") and not image_urls + video_urls + audio_urls:
    raise SystemExit("Reference-to-video requires at least one media URL")
if (is_edit or is_extend) and not 1 <= len(video_urls) <= 10:
    raise SystemExit(
        "Video edit/extend requires one to ten SEEDANCE_VIDEO_URLS; the first is the target"
    )
if is_edit and duration != -1:
    raise SystemExit("Video Edit accepts only SEEDANCE_DURATION=-1")
if (model.endswith("image-to-video") or is_edit or is_extend) and aspect_ratio != "adaptive":
    raise SystemExit(
        "Image-to-Video, Video Edit, and Video Extend accept only SEEDANCE_ASPECT_RATIO=adaptive"
    )

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
    "X-EvoLink-Source": "skill",
    "X-EvoLink-Skill": "seedance-2-5-video-gen",
    "X-EvoLink-Package": "evolink-seedance-2-5",
    "X-EvoLink-Campaign": "seedance-2-5-video-gen",
    "X-EvoLink-Touchpoint": "first_call",
}

payload = {
    "model": model,
    "prompt": prompt,
    "duration": duration,
    "quality": "720p",
    "aspect_ratio": aspect_ratio,
    "output_format": "mp4",
    "generate_audio": True,
    "content_filter": True,
}
if image_urls:
    payload["image_urls"] = image_urls
if video_urls:
    payload["video_urls"] = video_urls
if audio_urls:
    payload["audio_urls"] = audio_urls

create_response = requests.post(
    f"{base}/v1/videos/generations", headers=headers, json=payload, timeout=60
)
if not create_response.ok:
    raise SystemExit(f"Create failed: {create_response.status_code} {create_response.text}")
task = create_response.json()
task_id = task.get("id")
if not task_id:
    raise SystemExit(f"Create response did not return id: {task}")
print(f"TASK_SUBMITTED: task_id={task_id}")

deadline = time.time() + timeout_seconds
while time.time() < deadline:
    poll_response = requests.get(
        f"{base}/v1/tasks/{task_id}",
        headers={"Authorization": f"Bearer {api_key}"},
        timeout=30,
    )
    if not poll_response.ok:
        raise SystemExit(f"Poll failed: {poll_response.status_code} {poll_response.text}")
    current = poll_response.json()
    if current.get("status") == "completed":
        print(current)
        for url in current.get("results", []):
            print(f"RESULT_URL={url}")
        raise SystemExit(0)
    if current.get("status") == "failed":
        raise SystemExit(f"Task failed: {current}")
    time.sleep(5)

raise SystemExit(
    f"Timed out waiting for task {task_id}; query the same task later instead of resubmitting"
)
