"""YouTube Data API v3 collector for trending videos."""

import os
from typing import List
from datetime import datetime

from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

from .base import BaseCollector, TrendItem
from config import YOUTUBE_CATEGORIES, MAX_ITEMS_PER_SOURCE


class YouTubeCollector(BaseCollector):
    """Collects trending videos from YouTube Data API v3."""

    def __init__(self):
        super().__init__("youtube")
        self.api_key = os.environ.get("YOUTUBE_API_KEY")
        self.youtube = None

        if self.api_key:
            self.youtube = build("youtube", "v3", developerKey=self.api_key)

    def collect(self, region: str) -> List[TrendItem]:
        """
        Collect trending videos from YouTube mostPopular chart.

        Queries each category separately (since unified trending was removed July 2025),
        then deduplicates and ranks by view count.

        Args:
            region: Two-letter region code (US, CA)

        Returns:
            List of TrendItem objects
        """
        if not self.youtube:
            raise ValueError("YOUTUBE_API_KEY environment variable not set")

        seen_ids = set()
        items = []

        # First, get overall mostPopular (no category filter) for cross-category trends
        try:
            response = (
                self.youtube.videos()
                .list(
                    part="snippet,statistics",
                    chart="mostPopular",
                    regionCode=region,
                    maxResults=50,
                )
                .execute()
            )

            for video in response.get("items", []):
                vid_id = video["id"]
                if vid_id in seen_ids:
                    continue
                seen_ids.add(vid_id)

                snippet = video["snippet"]
                stats = video.get("statistics", {})
                view_count = int(stats.get("viewCount", 0) or 0)

                items.append(
                    TrendItem(
                        topic_name=snippet["title"],
                        source="youtube",
                        rank=0,
                        region=region,
                        timestamp=datetime.utcnow().isoformat(),
                        url=f"https://youtube.com/watch?v={vid_id}",
                        metadata={
                            "video_id": vid_id,
                            "channel": snippet.get("channelTitle", ""),
                            "category": "General/Mixed",
                            "category_id": None,
                            "views": stats.get("viewCount", "0"),
                            "view_count": view_count,
                            "likes": stats.get("likeCount", "0"),
                            "published_at": snippet.get("publishedAt", ""),
                        },
                    )
                )
        except HttpError as e:
            self.errors.append(f"General mostPopular: {e}")

        # Then get category-specific mostPopular
        for cat_id, cat_name in YOUTUBE_CATEGORIES.items():
            try:
                response = (
                    self.youtube.videos()
                    .list(
                        part="snippet,statistics",
                        chart="mostPopular",
                        regionCode=region,
                        videoCategoryId=str(cat_id),
                        maxResults=50,  # Max allowed by API
                    )
                    .execute()
                )

                for video in response.get("items", []):
                    vid_id = video["id"]

                    # Skip duplicates
                    if vid_id in seen_ids:
                        continue
                    seen_ids.add(vid_id)

                    snippet = video["snippet"]
                    stats = video.get("statistics", {})
                    view_count = int(stats.get("viewCount", 0) or 0)

                    items.append(
                        TrendItem(
                            topic_name=snippet["title"],
                            source="youtube",
                            rank=0,  # Will be set after sorting
                            region=region,
                            timestamp=datetime.utcnow().isoformat(),
                            url=f"https://youtube.com/watch?v={vid_id}",
                            metadata={
                                "video_id": vid_id,
                                "channel": snippet.get("channelTitle", ""),
                                "category": cat_name,
                                "category_id": cat_id,
                                "views": stats.get("viewCount", "0"),
                                "view_count": view_count,
                                "likes": stats.get("likeCount", "0"),
                                "published_at": snippet.get("publishedAt", ""),
                            },
                        )
                    )

            except HttpError as e:
                self.errors.append(f"Category {cat_id} ({cat_name}): {e}")
                continue

        # Sort by view count (descending) and assign ranks
        items.sort(
            key=lambda x: int(x.metadata.get("views", 0) or 0), reverse=True
        )

        # No artificial cap - return all collected items
        for i, item in enumerate(items, start=1):
            item.rank = i

        return items
