from abc import ABC, abstractmethod


class BaseAdPlatform(ABC):
    """Abstract base class for all paid ad platform integrations."""

    @abstractmethod
    async def upload_video(self, video_url: str, account) -> str:
        """Upload video to the ad platform. Returns media/creative ID."""
        pass

    @abstractmethod
    async def create_campaign(self, ad_campaign, account) -> dict:
        """Create a full campaign (campaign + ad set + ad). Returns platform IDs."""
        pass

    @abstractmethod
    async def get_metrics(self, platform_campaign_id: str, account, date_from=None, date_to=None) -> list:
        """Fetch daily metrics for a campaign. Returns list of daily metric dicts."""
        pass

    @abstractmethod
    async def pause_campaign(self, platform_campaign_id: str, account) -> dict:
        """Pause a running campaign."""
        pass

    @abstractmethod
    async def resume_campaign(self, platform_campaign_id: str, account) -> dict:
        """Resume a paused campaign."""
        pass

    @abstractmethod
    async def delete_campaign(self, platform_campaign_id: str, account) -> dict:
        """Delete/archive a campaign."""
        pass


def get_ad_platform(platform_name: str) -> BaseAdPlatform:
    """Factory to get the ad platform implementation."""
    platform_name = platform_name.lower().strip()
    if platform_name in ("facebook", "instagram", "meta"):
        from .meta_ads import MetaAdsPlatform
        return MetaAdsPlatform()
    elif platform_name == "tiktok":
        from .tiktok_ads import TikTokAdsPlatform
        return TikTokAdsPlatform()
    elif platform_name == "youtube":
        from .youtube_ads import YouTubeAdsPlatform
        return YouTubeAdsPlatform()
    elif platform_name == "snapchat":
        from .snapchat_ads import SnapchatAdsPlatform
        return SnapchatAdsPlatform()
    elif platform_name in ("twitter", "x"):
        from .twitter_ads import TwitterAdsPlatform
        return TwitterAdsPlatform()
    else:
        raise ValueError(f"Unsupported ad platform: {platform_name}")
