from dataclasses import dataclass, field
from typing import List, Optional
from datetime import datetime
import re


@dataclass
class Outcome:
    name: str        # "Home", "Draw", "Away"
    odds: float
    bookmaker: str


@dataclass
class Event:
    event_id: str
    bookmaker: str
    sport: str
    home_team: str
    away_team: str
    market: str      # "1X2", "Home/Away", "Over/Under 2.5"
    outcomes: List[Outcome]
    starts_at: Optional[datetime]
    league: str = ''

    @property
    def match_key(self) -> str:
        """Normalized key for cross-bookmaker matching."""
        teams = sorted([self._norm(self.home_team), self._norm(self.away_team)])
        return f"{self.sport}:{teams[0]}:{teams[1]}"

    @staticmethod
    def _norm(name: str) -> str:
        name = name.lower()
        name = re.sub(r'[^a-z0-9 ]', '', name)
        name = re.sub(r'\s+', ' ', name).strip()
        return name


@dataclass
class ArbOpportunity:
    sport: str
    event_name: str
    market: str
    outcomes: List[dict]   # [{bookmaker, outcome, odds, stake, potential_return}]
    arb_percentage: float
    profit_per_100: float
    starts_at: Optional[datetime]
    league: str = ''
    found_at: datetime = field(default_factory=datetime.now)

    def to_dict(self) -> dict:
        return {
            'sport': self.sport,
            'event_name': self.event_name,
            'league': self.league,
            'market': self.market,
            'outcomes': self.outcomes,
            'arb_percentage': round(self.arb_percentage, 2),
            'profit_per_100': round(self.profit_per_100, 2),
            'starts_at': self.starts_at.strftime('%Y-%m-%d %H:%M') if self.starts_at else '—',
            'found_at': self.found_at.strftime('%H:%M:%S'),
        }
