"""Google News RSS feed collector."""

import feedparser
from typing import List
from datetime import datetime

from .base import BaseCollector, TrendItem
from config import GOOGLE_NEWS_TOPICS


class GoogleNewsCollector(BaseCollector):
    """Collects top headlines from Google News RSS feeds including topic-specific feeds."""

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

    def _get_feeds(self, region: str) -> List[tuple]:
        """
        Get all RSS feed URLs for a region.

        Returns list of (url, category_name) tuples.
        """
        if region == "CA":
            lang = "en-CA"
            ceid = "CA:en"
        else:
            lang = "en-US"
            ceid = "US:en"

        feeds = []

        # Main headlines feed
        feeds.append((
            f"https://news.google.com/rss?hl={lang}&gl={region}&ceid={ceid}",
            "Headlines"
        ))

        # Topic-specific feeds
        for topic_name, topic_id in GOOGLE_NEWS_TOPICS.items():
            feeds.append((
                f"https://news.google.com/rss/topics/{topic_id}?hl={lang}&gl={region}&ceid={ceid}",
                topic_name
            ))

        return feeds

    def _parse_feed(self, url: str, region: str, category: str) -> List[TrendItem]:
        """Parse a single RSS feed and return TrendItems."""
        items = []

        try:
            feed = feedparser.parse(url)

            if feed.bozo and not feed.entries:
                self.errors.append(f"Failed to parse {category} feed: {feed.bozo_exception}")
                return []

            for rank, entry in enumerate(feed.entries, start=1):
                # Extract source publication if available
                source_name = ""
                if hasattr(entry, "source"):
                    source_name = entry.source.get("title", "")

                items.append(
                    TrendItem(
                        topic_name=entry.title,
                        source="google_news",
                        rank=rank,
                        region=region,
                        timestamp=datetime.utcnow().isoformat(),
                        url=entry.get("link"),
                        metadata={
                            "published": entry.get("published", ""),
                            "source_publication": source_name,
                            "category": category,
                        },
                    )
                )
        except Exception as e:
            self.errors.append(f"Error parsing {category} feed: {str(e)}")

        return items

    def collect(self, region: str) -> List[TrendItem]:
        """
        Collect headlines from all Google News RSS feeds.

        Fetches main headlines plus topic-specific feeds (Technology, Science,
        Business, Entertainment, Health) for broader coverage.

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

        Returns:
            List of TrendItem objects
        """
        all_items = []
        seen_titles = set()
        feeds = self._get_feeds(region)

        for url, category in feeds:
            items = self._parse_feed(url, region, category)

            # Dedupe by title within this collection
            for item in items:
                title_key = item.topic_name.lower().strip()
                if title_key not in seen_titles:
                    seen_titles.add(title_key)
                    all_items.append(item)

        # Re-rank after deduplication
        for i, item in enumerate(all_items, start=1):
            item.rank = i

        return all_items
