"""Tests for availability validation."""

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

from publishing_integrity.availability import validate_player_availability, build_availability_lookup
from publishing_integrity.enums import AvailabilityStatus


def make_report(name, status, sources=2):
    from publishing_integrity.normalization import normalize_player_name
    return {
        "player_name": name,
        "normalized_name": normalize_player_name(name),
        "availability_status": status,
        "detailed_status": status.value.lower(),
        "source": f"test ({sources} sources)",
        "source_count": sources,
    }


def test_available_player():
    reports = [make_report("LeBron James", AvailabilityStatus.AVAILABLE)]
    status, conflict = validate_player_availability("LeBron James", reports, ["OUT", "INACTIVE"])
    assert status == AvailabilityStatus.AVAILABLE
    assert conflict is None


def test_out_player():
    reports = [make_report("Kevin Durant", AvailabilityStatus.OUT)]
    status, conflict = validate_player_availability("Kevin Durant", reports, ["OUT", "INACTIVE"])
    assert status == AvailabilityStatus.OUT
    assert conflict is not None
    assert "PLAYER_UNAVAILABLE" in conflict.conflict_type


def test_suspended_player():
    reports = [make_report("Draymond Green", AvailabilityStatus.SUSPENDED)]
    status, conflict = validate_player_availability("Draymond Green", reports, ["OUT", "SUSPENDED"])
    assert status == AvailabilityStatus.SUSPENDED
    assert conflict is not None


def test_questionable_player_not_blocked():
    reports = [make_report("Anthony Davis", AvailabilityStatus.QUESTIONABLE)]
    status, conflict = validate_player_availability("Anthony Davis", reports, ["OUT", "INACTIVE"])
    assert status == AvailabilityStatus.QUESTIONABLE
    assert conflict is None


def test_player_not_in_reports():
    reports = [make_report("LeBron James", AvailabilityStatus.AVAILABLE)]
    status, conflict = validate_player_availability("Steph Curry", reports, ["OUT"])
    assert status == AvailabilityStatus.AVAILABLE  # presumed available
    assert conflict is None


def test_build_lookup_keeps_most_severe():
    reports = [
        make_report("LeBron James", AvailabilityStatus.QUESTIONABLE),
        make_report("LeBron James", AvailabilityStatus.OUT),
    ]
    # Second entry is more severe
    lookup = build_availability_lookup(reports)
    from publishing_integrity.normalization import normalize_player_name
    norm = normalize_player_name("LeBron James")
    assert lookup[norm]["availability_status"] == AvailabilityStatus.OUT


if __name__ == "__main__":
    test_available_player()
    test_out_player()
    test_suspended_player()
    test_questionable_player_not_blocked()
    test_player_not_in_reports()
    test_build_lookup_keeps_most_severe()
    print("All availability tests passed!")
