"""Data models for Publishing Integrity entities."""

from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional, Dict, Any, List
from .enums import ValidationState, AvailabilityStatus, LineupStatus, AuditAction, SourceTier


@dataclass
class Player:
    id: Optional[str] = None
    canonical_player_id: str = ""
    display_name: str = ""
    normalized_name: str = ""
    official_player_id: Optional[str] = None
    league: str = ""
    current_team_id: Optional[str] = None
    previous_team_id: Optional[str] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


@dataclass
class Team:
    id: Optional[str] = None
    canonical_team_id: str = ""
    league: str = ""
    display_name: str = ""
    normalized_name: str = ""
    abbreviation: str = ""
    official_team_id: Optional[str] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


@dataclass
class Game:
    id: Optional[str] = None
    canonical_game_id: str = ""
    league: str = ""
    home_team_id: str = ""
    away_team_id: str = ""
    scheduled_start_at: Optional[datetime] = None
    status: str = "scheduled"
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


@dataclass
class RosterEntry:
    id: Optional[str] = None
    run_id: str = ""
    league: str = ""
    team_id: str = ""
    player_id: str = ""
    roster_status: str = "active"
    source: str = ""
    source_timestamp: Optional[datetime] = None
    created_at: Optional[datetime] = None


@dataclass
class TransactionEntry:
    id: Optional[str] = None
    run_id: str = ""
    league: str = ""
    player_id: str = ""
    old_team_id: Optional[str] = None
    new_team_id: Optional[str] = None
    transaction_type: str = ""
    effective_at: Optional[datetime] = None
    source: str = ""
    created_at: Optional[datetime] = None


@dataclass
class AvailabilityReport:
    id: Optional[str] = None
    run_id: str = ""
    game_id: str = ""
    player_id: str = ""
    team_id: str = ""
    availability_status: AvailabilityStatus = AvailabilityStatus.UNKNOWN
    detailed_status: str = ""
    source: str = ""
    source_timestamp: Optional[datetime] = None
    created_at: Optional[datetime] = None


@dataclass
class LineupConfirmation:
    id: Optional[str] = None
    run_id: str = ""
    game_id: str = ""
    player_id: str = ""
    team_id: str = ""
    lineup_status: LineupStatus = LineupStatus.UNKNOWN
    lineup_role: str = ""
    source: str = ""
    source_timestamp: Optional[datetime] = None
    created_at: Optional[datetime] = None


@dataclass
class MarketPlayerProp:
    id: Optional[str] = None
    run_id: str = ""
    sportsbook: str = ""
    game_id: str = ""
    player_id: str = ""
    team_id: str = ""
    market_type: str = ""
    market_status: str = "active"
    source_timestamp: Optional[datetime] = None
    created_at: Optional[datetime] = None


@dataclass
class PropEligibility:
    id: Optional[str] = None
    run_id: str = ""
    game_id: str = ""
    player_id: str = ""
    player_name: str = ""
    team_id: str = ""
    league: str = ""
    validation_state: ValidationState = ValidationState.MANUAL_REVIEW_REQUIRED
    market_presence_flag: bool = False
    roster_verified_at: Optional[datetime] = None
    availability_verified_at: Optional[datetime] = None
    lineup_verified_at: Optional[datetime] = None
    suppress_reason: Optional[str] = None
    suppress_reason_human: Optional[str] = None
    winning_source: Optional[str] = None
    conflict_payload: Optional[Dict[str, Any]] = None
    publish_allowed: bool = False
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


@dataclass
class AuditLogEntry:
    id: Optional[str] = None
    run_id: str = ""
    game_id: str = ""
    player_id: str = ""
    player_name: str = ""
    team_id: str = ""
    league: str = ""
    action: AuditAction = AuditAction.SUPPRESSED
    validation_state: ValidationState = ValidationState.MANUAL_REVIEW_REQUIRED
    suppress_reason: Optional[str] = None
    suppress_reason_human: Optional[str] = None
    winning_source: Optional[str] = None
    conflict_payload: Optional[Dict[str, Any]] = None
    prior_state: Optional[str] = None
    acted_at: Optional[datetime] = None
    created_at: Optional[datetime] = None


@dataclass
class RegressionFailure:
    id: Optional[str] = None
    run_id: str = ""
    test_name: str = ""
    league: str = ""
    entity_type: str = ""
    entity_id: str = ""
    severity: str = "high"
    failure_reason: str = ""
    failure_payload: Optional[Dict[str, Any]] = None
    created_at: Optional[datetime] = None


@dataclass
class ConflictDetail:
    """Structured conflict for debugging and admin display."""
    conflict_type: str = ""
    player_name: str = ""
    player_id: str = ""
    field: str = ""
    official_value: Optional[str] = None
    internal_value: Optional[str] = None
    market_value: Optional[str] = None
    severity: str = "high"
    source: str = ""
    detail: str = ""

    def to_dict(self) -> Dict[str, Any]:
        return {
            "conflict_type": self.conflict_type,
            "player_name": self.player_name,
            "player_id": self.player_id,
            "field": self.field,
            "official_value": self.official_value,
            "internal_value": self.internal_value,
            "market_value": self.market_value,
            "severity": self.severity,
            "source": self.source,
            "detail": self.detail,
        }
