"""Base data source interface"""
from abc import ABC, abstractmethod
from typing import List, Optional
from datetime import datetime
from dataclasses import dataclass


@dataclass
class MatchData:
    """Match data structure"""
    source_id: str
    league_source_id: str
    home_team_name: str
    away_team_name: str
    match_date: datetime
    status: str
    home_score: Optional[int] = None
    away_score: Optional[int] = None
    source_url: Optional[str] = None


@dataclass
class LeagueData:
    """League data structure"""
    source_id: str
    name: str
    country: Optional[str] = None


@dataclass
class TeamData:
    """Team data structure"""
    source_id: str
    name: str
    country: Optional[str] = None


class BaseDataSource(ABC):
    """Base interface for data sources"""
    
    @abstractmethod
    def get_leagues(self, sport: str = "football") -> List[LeagueData]:
        """Get available leagues"""
        pass
    
    @abstractmethod
    def get_matches(
        self,
        league_source_id: str,
        from_date: Optional[datetime] = None,
        to_date: Optional[datetime] = None
    ) -> List[MatchData]:
        """Get matches for a league"""
        pass
    
    @abstractmethod
    def get_match_details(self, match_source_id: str) -> Optional[MatchData]:
        """Get detailed match information"""
        pass

