"""Flashscore data source implementation"""
from typing import List, Optional
from datetime import datetime
import logging
from app.data_sources.base import BaseDataSource, MatchData, LeagueData
from app.data_sources.flashscore.client import FlashscoreClient
from app.data_sources.flashscore.parsers import FlashscoreParser
from app.core.config import settings

logger = logging.getLogger(__name__)


class FlashscoreSource(BaseDataSource):
    """Flashscore data source"""
    
    def __init__(self):
        if not settings.flashscore_enabled:
            raise ValueError("Flashscore is disabled in settings")
        self.client = FlashscoreClient()
        self.parser = FlashscoreParser()
    
    def get_leagues(self, sport: str = "football") -> List[LeagueData]:
        """Get available leagues"""
        try:
            url = f"/{sport}/"
            response = self.client.get(url)
            if not response:
                logger.warning("Failed to fetch leagues page")
                return []
            
            return self.parser.parse_leagues(response.text)
        except Exception as e:
            logger.error(f"Error fetching leagues: {e}")
            return []
    
    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"""
        try:
            # Flashscore URL structure: /football/league-name/league-id/
            url = f"/football/league/{league_source_id}/"
            response = self.client.get(url)
            if not response:
                logger.warning(f"Failed to fetch matches for league {league_source_id}")
                return []
            
            matches = self.parser.parse_matches(response.text, league_source_id)
            
            # Filter by date if provided
            if from_date:
                matches = [m for m in matches if m.match_date >= from_date]
            if to_date:
                matches = [m for m in matches if m.match_date <= to_date]
            
            return matches
        except Exception as e:
            logger.error(f"Error fetching matches: {e}")
            return []
    
    def get_match_details(self, match_source_id: str) -> Optional[MatchData]:
        """Get detailed match information"""
        try:
            url = f"/match/{match_source_id}/"
            response = self.client.get(url)
            if not response:
                return None
            
            return self.parser.parse_match_details(response.text, match_source_id)
        except Exception as e:
            logger.error(f"Error fetching match details: {e}")
            return None
    
    def close(self):
        """Close the client"""
        self.client.close()

