import aiohttp
from flask import current_app
from . import BaseVideoProvider


class VeoProvider(BaseVideoProvider):
    BASE_URL = "https://generativelanguage.googleapis.com/v1beta"

    def _get_api_key(self):
        from .key_helper import get_provider_key
        key, _ = get_provider_key("veo", "GOOGLE_GEMINI_API_KEY")
        return key

    async def generate_video(self, prompt: str, duration: int = 8, **kwargs) -> dict:
        api_key = self._get_api_key()
        if not api_key:
            return {"error": "Google Gemini API key not configured", "status": "error"}

        url = f"{self.BASE_URL}/models/veo-3.0-generate-001:predictLongRunning"
        payload = {
            "instances": [{"prompt": prompt}],
            "parameters": {
                "sampleCount": 1,
                "durationSeconds": min(duration, 8),
                "aspectRatio": "16:9",
            },
        }
        headers = {"Content-Type": "application/json"}

        async with aiohttp.ClientSession() as session:
            async with session.post(f"{url}?key={api_key}", json=payload, headers=headers) as resp:
                if resp.status == 200:
                    data = await resp.json()
                    operation_name = data.get("name", "")
                    return {"status": "processing", "operation_id": operation_name, "provider": "veo"}
                else:
                    error_text = await resp.text()
                    return {"status": "error", "error": error_text}

    async def check_status(self, operation_id: str) -> dict:
        api_key = self._get_api_key()
        url = f"{self.BASE_URL}/{operation_id}"

        async with aiohttp.ClientSession() as session:
            async with session.get(f"{url}?key={api_key}") as resp:
                data = await resp.json()
                if data.get("done"):
                    videos = data.get("response", {}).get("predictions", [])
                    if videos:
                        video_uri = videos[0].get("videoUri", "")
                        return {"status": "completed", "video_url": video_uri}
                    return {"status": "error", "error": "No video generated"}
                return {"status": "processing"}
