"""VOD playback URL polling — separated from render_video.py.

ab-render 通过远程渲染服务把视频上传到阿里云 VOD 后，会立即返回一个
`vod://` 协议地址 + fileId。但前端需要的是 CDN 加速地址（`http://cdn.aibearer.com/...`），
这要等阿里云转码回调到达 ab-api、回写 `file.fileUrl` 之后才能拿到。

这个模块负责轮询 ab-api /file/get 直到拿到 CDN URL（或超时返回 OSS 原始地址）。
公共入口只有一个：poll_vod_playback_url(file_id, priv_token, ...) -> Optional[str]。
"""
from __future__ import annotations

import builtins
import json
import os
import sys
import time
import urllib.error
import urllib.request
from datetime import datetime
from typing import Optional


def _log(msg: str) -> None:
    now = datetime.now()
    stamp = now.strftime("%Y%m%d %H%M%S") + f":{now.microsecond // 1000:03d}"
    builtins.print(f"[{stamp}] {msg}", file=sys.stderr)


def poll_vod_playback_url(
    file_id: int,
    private_token: str,
    *,
    max_wait: float = 60.0,
    interval: float = 3.0,
) -> Optional[str]:
    """轮询 ab-api /file/get，等待 VOD CDN URL 就绪。

    VOD 上传后通常 10-30 秒完成转码。此函数策略：
      - 一旦看到非 `vod://` 且非阿里云 OSS 域名的 URL（说明 CDN 转码完成），立即返回
      - 看到阿里云 OSS 直链时记为 fallback，继续等 CDN
      - 超时仍未拿到 CDN 时退回到 OSS 原始地址
    """
    api_base = os.environ.get(
        "MM_API_BASE_URL",
        os.environ.get("MM_BACKEND_API_URL", "https://api.remixmate.ai/api"),
    ).rstrip("/")
    url = f"{api_base}/file/get"
    headers = {
        "Content-Type": "application/json",
        "X-Priv-Token": private_token,
        "x-invoke-skill": "render-video",
    }
    agent_name = os.environ.get("AGENT_NAME", "")
    if agent_name:
        headers["x-invoke-agent"] = agent_name

    payload = json.dumps({"fileId": int(file_id)}).encode("utf-8")

    _log(f"   ⏳ 等待 VOD 播放地址就绪（fileId={file_id}，最长等待 {max_wait:.0f}s）...")
    start = time.time()
    oss_fallback: Optional[str] = None

    while time.time() - start < max_wait:
        try:
            req = urllib.request.Request(url, data=payload, headers=headers, method="POST")
            with urllib.request.urlopen(req, timeout=10) as resp:
                result = json.loads(resp.read().decode("utf-8"))

            if result.get("code") == 0:
                data = result.get("data") or {}
                file_url = data.get("fileUrl")
                vod_status = data.get("vodStatus", "")
                if file_url and not file_url.startswith("vod://"):
                    if "aliyuncs.com" not in file_url:
                        return file_url
                    oss_fallback = file_url
                    elapsed = time.time() - start
                    _log(f"   ⏳ VOD 状态: {vod_status}（等待 CDN 转码完成，{elapsed:.0f}s）")
                else:
                    elapsed = time.time() - start
                    _log(f"   ⏳ VOD 状态: {vod_status}（{elapsed:.0f}s）")
        except Exception:
            pass

        time.sleep(interval)

    if oss_fallback:
        _log(f"   ⚠️  等待 CDN 转码超时，返回原始 OSS 地址")
    return oss_fallback
