"""Tests for the eligibility determination engine."""

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

from datetime import datetime, timedelta, timezone
from publishing_integrity.eligibility import determine_prop_eligibility
from publishing_integrity.enums import ValidationState, AvailabilityStatus
from publishing_integrity.normalization import normalize_player_name


def make_roster(name, team):
    return {
        "player_name": name,
        "normalized_name": normalize_player_name(name),
        "team": team,
    }


def make_avail(name, status):
    return {
        "player_name": name,
        "normalized_name": normalize_player_name(name),
        "availability_status": status,
        "detailed_status": status.value.lower(),
        "source": "test",
    }


def test_fully_verified_player():
    roster = [make_roster("LeBron James", "LAL")]
    avail = [make_avail("LeBron James", AvailabilityStatus.AVAILABLE)]

    elig = determine_prop_eligibility(
        player_name="LeBron James",
        prop_type="points",
        event_id="nba-lal-bos-20260310",
        league="nba",
        home_team="Los Angeles Lakers",
        away_team="Boston Celtics",
        game_start=datetime.now() + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state in (ValidationState.VERIFIED, ValidationState.VERIFIED_PENDING_LINEUP)
    assert elig.validation_state != ValidationState.SUPPRESSED_TEAM_MISMATCH
    assert elig.suppress_reason != "SUPPRESSED_TEAM_MISMATCH"


def test_out_player_suppressed():
    roster = [make_roster("Kevin Durant", "PHX")]
    avail = [make_avail("Kevin Durant", AvailabilityStatus.OUT)]

    elig = determine_prop_eligibility(
        player_name="Kevin Durant",
        prop_type="points",
        event_id="nba-phx-bos-20260310",
        league="nba",
        home_team="Phoenix Suns",
        away_team="Boston Celtics",
        game_start=datetime.now() + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state == ValidationState.SUPPRESSED_UNAVAILABLE
    assert not elig.publish_allowed
    assert elig.suppress_reason == "SUPPRESSED_UNAVAILABLE"


def test_team_mismatch_suppressed():
    """Player traded but prop still on old team."""
    roster = [make_roster("Jimmy Butler", "GSW")]  # Traded to GSW
    avail = [make_avail("Jimmy Butler", AvailabilityStatus.AVAILABLE)]

    elig = determine_prop_eligibility(
        player_name="Jimmy Butler",
        prop_type="points",
        event_id="nba-mia-bos-20260310",
        league="nba",
        home_team="Miami Heat",
        away_team="Boston Celtics",
        game_start=datetime.now() + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state == ValidationState.SUPPRESSED_TEAM_MISMATCH
    assert not elig.publish_allowed


def test_nhl_team_aliases_do_not_trigger_false_team_mismatch():
    roster = [make_roster("Nikita Kucherov", "TBL")]
    avail = [make_avail("Nikita Kucherov", AvailabilityStatus.AVAILABLE)]

    elig = determine_prop_eligibility(
        player_name="Nikita Kucherov",
        prop_type="shots_on_goal",
        event_id="nhl-nsh-tb-20260329",
        league="nhl",
        home_team="Tampa Bay Lightning",
        away_team="Nashville Predators",
        game_start=datetime.now(timezone.utc) + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state != ValidationState.SUPPRESSED_TEAM_MISMATCH
    assert elig.suppress_reason != "SUPPRESSED_TEAM_MISMATCH"


def test_mlb_team_aliases_do_not_trigger_false_team_mismatch():
    roster = [make_roster("Junior Caminero", "TBR")]
    avail = [make_avail("Junior Caminero", AvailabilityStatus.AVAILABLE)]

    elig = determine_prop_eligibility(
        player_name="Junior Caminero",
        prop_type="hits",
        event_id="mlb-tb-stl-20260329",
        league="mlb",
        home_team="St. Louis Cardinals",
        away_team="Tampa Bay Rays",
        game_start=datetime.now(timezone.utc) + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state != ValidationState.SUPPRESSED_TEAM_MISMATCH
    assert elig.suppress_reason != "SUPPRESSED_TEAM_MISMATCH"


def test_empty_name_suppressed():
    elig = determine_prop_eligibility(
        player_name="",
        prop_type="points",
        event_id="nba-test-20260310",
        league="nba",
        home_team="Team A",
        away_team="Team B",
        game_start=datetime.now() + timedelta(hours=5),
        run_id="test123",
        roster_entries=[],
        availability_reports=[],
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state == ValidationState.SUPPRESSED_NO_CANONICAL_ID
    assert not elig.publish_allowed


def test_suspended_player_suppressed():
    roster = [make_roster("Draymond Green", "GSW")]
    avail = [make_avail("Draymond Green", AvailabilityStatus.SUSPENDED)]

    elig = determine_prop_eligibility(
        player_name="Draymond Green",
        prop_type="points",
        event_id="nba-gsw-bos-20260310",
        league="nba",
        home_team="Golden State Warriors",
        away_team="Boston Celtics",
        game_start=datetime.now() + timedelta(hours=5),
        run_id="test123",
        roster_entries=roster,
        availability_reports=avail,
        lineup_data=[],
        market_props=[],
    )

    assert elig.validation_state == ValidationState.SUPPRESSED_UNAVAILABLE
    assert not elig.publish_allowed


if __name__ == "__main__":
    test_fully_verified_player()
    test_out_player_suppressed()
    test_team_mismatch_suppressed()
    test_empty_name_suppressed()
    test_suspended_player_suppressed()
    print("All eligibility tests passed!")
