"""Base collector infrastructure with standardized data format."""

from dataclasses import dataclass, asdict, field
from typing import List, Optional, Dict, Any
from datetime import datetime
from abc import ABC, abstractmethod


@dataclass
class TrendItem:
    """Standardized format for all trending topics."""

    topic_name: str
    source: str
    rank: int
    region: str
    timestamp: str
    url: Optional[str] = None
    metadata: Dict[str, Any] = field(default_factory=dict)

    def to_dict(self) -> dict:
        """Convert to dictionary for JSON serialization."""
        return asdict(self)


class BaseCollector(ABC):
    """Abstract base class for all trend collectors."""

    def __init__(self, name: str):
        self.name = name
        self.errors: List[str] = []

    @abstractmethod
    def collect(self, region: str) -> List[TrendItem]:
        """
        Collect trending items for a region.

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

        Returns:
            List of TrendItem objects
        """
        pass

    def safe_collect(self, region: str) -> List[TrendItem]:
        """
        Wrapper that catches errors and continues gracefully.

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

        Returns:
            List of TrendItem objects, or empty list on error
        """
        try:
            return self.collect(region)
        except Exception as e:
            error_msg = f"{self.name}:{region} - {str(e)}"
            self.errors.append(error_msg)
            print(f"[ERROR] {self.name} failed for {region}: {e}")
            return []
