from abc import ABC, abstractmethod


class BaseVideoProvider(ABC):
    @abstractmethod
    async def generate_video(self, prompt: str, duration: int = 10, **kwargs) -> dict:
        pass

    @abstractmethod
    async def check_status(self, video_id: str) -> dict:
        pass


# ── Provider Registry ──

PROVIDER_CHOICES = [
    ("sora", "OpenAI Sora — سينمائي عالي الجودة"),
    ("veo", "Google Veo 3 — صوت + فيديو مدمج"),
    ("kling", "Kling AI — أفضل سعر/جودة ⭐"),
    ("runway", "Runway Gen-4 — جودة سينمائية"),
    ("pika", "Pika Labs — إبداعي وسريع"),
    ("fal", "fal.ai — متعدد النماذج"),
    ("none", "بدون فيديو"),
]

VALID_PROVIDERS = {name for name, _ in PROVIDER_CHOICES}


def get_video_provider(provider_name: str) -> BaseVideoProvider:
    """Factory: return the correct video provider instance by name."""
    if provider_name == "veo":
        from .veo import VeoProvider
        return VeoProvider()
    elif provider_name == "kling":
        from .kling import KlingProvider
        return KlingProvider()
    elif provider_name == "runway":
        from .runway import RunwayProvider
        return RunwayProvider()
    elif provider_name == "pika":
        from .pika import PikaProvider
        return PikaProvider()
    elif provider_name == "fal":
        from .fal_ai import FalAIProvider
        return FalAIProvider()
    else:
        from .sora import SoraProvider
        return SoraProvider()
