"""Tests for lineup validation logic."""

import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../scripts'))

from datetime import datetime, timedelta
from publishing_integrity.lineup_validation import (
    validate_lineup_status,
    is_lineup_dependent,
)
from publishing_integrity.enums import LineupStatus


def make_lineup(name, status):
    from publishing_integrity.normalization import normalize_player_name
    return {
        "player_name": name,
        "normalized_name": normalize_player_name(name),
        "lineup_status": status.value,
    }


def test_lineup_dependent_props():
    assert is_lineup_dependent("hits", "mlb")
    assert is_lineup_dependent("saves", "nhl")
    assert is_lineup_dependent("points", "nba")
    assert not is_lineup_dependent("unknown_prop", "nba")


def test_mlb_all_props_lineup_dependent():
    assert is_lineup_dependent("hits", "mlb")
    assert is_lineup_dependent("runs", "mlb")
    assert is_lineup_dependent("strikeouts_batter", "mlb")


def test_confirmed_starter_passes():
    lineup = [make_lineup("LeBron James", LineupStatus.CONFIRMED_STARTER)]
    game_start = datetime.now() + timedelta(minutes=30)
    status, conflict = validate_lineup_status("LeBron James", "points", "nba", game_start, lineup)
    assert status == LineupStatus.CONFIRMED_STARTER
    assert conflict is None


def test_bench_player_suppressed_in_lock_window():
    lineup = [make_lineup("Bench Player", LineupStatus.BENCH)]
    game_start = datetime.now() + timedelta(minutes=20)  # Inside 30-min NBA lock
    status, conflict = validate_lineup_status("Bench Player", "points", "nba", game_start, lineup)
    assert status == LineupStatus.BENCH
    assert conflict is not None
    assert "NOT_IN_STARTING_LINEUP" in conflict.conflict_type


def test_unknown_lineup_outside_lock():
    lineup = []  # No lineup data
    game_start = datetime.now() + timedelta(hours=5)  # 5 hours away
    status, conflict = validate_lineup_status("Player X", "points", "nba", game_start, lineup)
    assert status == LineupStatus.UNKNOWN
    assert conflict is None  # OK outside lock window


def test_goalie_prop_requires_goalie_confirmation():
    lineup = [make_lineup("Goalie A", LineupStatus.BENCH)]
    game_start = datetime.now() + timedelta(minutes=30)  # Inside lock
    status, conflict = validate_lineup_status("Goalie A", "saves", "nhl", game_start, lineup)
    assert conflict is not None


def test_starting_goalie_passes():
    lineup = [make_lineup("Igor Shesterkin", LineupStatus.STARTING_GOALIE)]
    game_start = datetime.now() + timedelta(minutes=30)
    status, conflict = validate_lineup_status("Igor Shesterkin", "saves", "nhl", game_start, lineup)
    assert status == LineupStatus.STARTING_GOALIE
    assert conflict is None


def test_starting_xi_soccer():
    lineup = [make_lineup("Mohamed Salah", LineupStatus.STARTING_XI)]
    game_start = datetime.now() + timedelta(minutes=30)
    status, conflict = validate_lineup_status("Mohamed Salah", "shots", "epl", game_start, lineup)
    assert status == LineupStatus.STARTING_XI
    assert conflict is None


def test_mlb_no_lineup_in_lock_suppressed():
    """MLB policy: allow_pre_lineup_props=False, so unknown lineup in lock = suppress."""
    lineup = []
    game_start = datetime.now() + timedelta(minutes=30)  # Inside 60-min MLB lock
    status, conflict = validate_lineup_status("Player X", "hits", "mlb", game_start, lineup)
    assert status == LineupStatus.UNKNOWN
    assert conflict is not None
    assert "LINEUP_UNKNOWN" in conflict.conflict_type


if __name__ == "__main__":
    test_lineup_dependent_props()
    test_mlb_all_props_lineup_dependent()
    test_confirmed_starter_passes()
    test_bench_player_suppressed_in_lock_window()
    test_unknown_lineup_outside_lock()
    test_goalie_prop_requires_goalie_confirmation()
    test_starting_goalie_passes()
    test_starting_xi_soccer()
    test_mlb_no_lineup_in_lock_suppressed()
    print("All lineup validation tests passed!")
