import re as _re
import requests
import logging
from abc import ABC, abstractmethod
from typing import List, Optional
from core.models import Event


def normalize_cs_score(s) -> Optional[str]:
    """Normalize a correct score string to canonical 'X-Y' (home-away) format.

    Accepts colon or dash separators: '1:0', '1-0', '1 - 0'.
    Returns standardized 'Any Other Score' / 'Any Other Home Win' / etc. for
    catch-all outcomes.  Returns None if the string is not a recognizable score.
    """
    if s is None:
        return None
    s = str(s).strip()
    if not s:
        return None
    low = s.lower()

    # Catch-all outcome variants
    if 'other' in low or low in ('ot', 'oth'):
        if 'home' in low or 'win1' in low or '1x' in low:
            return 'Any Other Home Win'
        if 'away' in low or 'win2' in low or 'x2' in low:
            return 'Any Other Away Win'
        if 'draw' in low:
            return 'Any Other Draw'
        return 'Any Other Score'

    # Standard score: "1:0", "1-0", "1 - 0"
    m = _re.match(r'^(\d{1,2})\s*[:\-]\s*(\d{1,2})$', s)
    if m:
        return f'{m.group(1)}-{m.group(2)}'
    return None

logger = logging.getLogger(__name__)

HEADERS = {
    'User-Agent': (
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
        'AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/120.0.0.0 Safari/537.36'
    ),
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'en-US,en;q=0.9',
}


class BaseScraper(ABC):

    def __init__(self, name: str):
        self.name = name
        self.session = requests.Session()
        self.session.headers.update(HEADERS)

    @abstractmethod
    def get_events(self, sport: str) -> List[Event]:
        """Fetch pre-match events for a given sport."""
        pass

    def get_all_events(self) -> List[Event]:
        all_events: List[Event] = []
        for sport in ['football', 'basketball', 'tennis']:
            try:
                events = self.get_events(sport)
                all_events.extend(events)
                logger.info(f"[{self.name}] {sport}: {len(events)} events")
            except Exception as e:
                logger.error(f"[{self.name}] {sport} fetch failed: {e}")
        return all_events

    def get_live_events(self, sport: str) -> List[Event]:
        """Fetch in-play events for a given sport. Override in scrapers that support live."""
        return []

    def get_all_live_events(self) -> List[Event]:
        """Fetch all in-play events across sports. Override for efficiency (e.g. single fetch)."""
        all_events: List[Event] = []
        for sport in ['football', 'basketball', 'tennis']:
            try:
                events = self.get_live_events(sport)
                all_events.extend(events)
                if events:
                    logger.info(f"[{self.name}] live {sport}: {len(events)} events")
            except Exception as e:
                logger.error(f"[{self.name}] live {sport} fetch failed: {e}")
        return all_events
