"""Google Trends RSS feed collector."""

import feedparser
from typing import List
from datetime import datetime

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


class GoogleTrendsCollector(BaseCollector):
    """Collects trending topics from Google Trends RSS feed."""

    def __init__(self):
        super().__init__("google_trends")

    def _get_feed_url(self, region: str) -> str:
        """Build the RSS feed URL for a region."""
        return f"https://trends.google.com/trending/rss?geo={region}&hours={TRENDS_HOURS}"

    def collect(self, region: str) -> List[TrendItem]:
        """
        Collect trending topics from Google Trends RSS.

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

        Returns:
            List of TrendItem objects
        """
        url = self._get_feed_url(region)
        feed = feedparser.parse(url)

        if feed.bozo and not feed.entries:
            raise ValueError(f"Failed to parse feed: {feed.bozo_exception}")

        items = []
        for rank, entry in enumerate(feed.entries[:MAX_ITEMS_PER_SOURCE], start=1):
            # Extract traffic volume from ht:approx_traffic namespace if available
            traffic = getattr(entry, "ht_approx_traffic", "")

            # Extract related news items if available
            news_items = []
            if hasattr(entry, "ht_news_item"):
                news_data = entry.ht_news_item
                if isinstance(news_data, list):
                    news_items = [n.get("ht_news_item_title", "") for n in news_data]
                elif isinstance(news_data, dict):
                    news_items = [news_data.get("ht_news_item_title", "")]

            items.append(
                TrendItem(
                    topic_name=entry.title,
                    source="google_trends",
                    rank=rank,
                    region=region,
                    timestamp=datetime.utcnow().isoformat(),
                    url=entry.get("link"),
                    metadata={
                        "traffic": traffic,
                        "news_items": news_items,
                        "published": entry.get("published", ""),
                    },
                )
            )

        return items
