"""Tests for player-team reconciliation and conflict detection."""

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

from publishing_integrity.reconciliation import (
    reconcile_player_team,
    detect_identity_collisions,
    detect_stale_mappings,
)
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_market(name, team):
    return {
        "player_name": name,
        "normalized_name": normalize_player_name(name),
        "team": team,
    }


def test_correct_team_mapping():
    roster = [make_roster("LeBron James", "LAL")]
    market = [make_market("LeBron James", "LAL")]
    valid, conflict = reconcile_player_team("LeBron James", "LAL", roster, market)
    assert valid
    assert conflict is None


def test_team_mismatch_trade():
    """Player traded from LAL to GSW but prop still shows LAL."""
    roster = [make_roster("LeBron James", "GSW")]
    market = [make_market("LeBron James", "GSW")]
    valid, conflict = reconcile_player_team("LeBron James", "LAL", roster, market)
    assert not valid
    assert conflict is not None
    assert conflict.conflict_type == "TEAM_MISMATCH"
    assert "GSW" in conflict.official_value


def test_market_team_mismatch():
    """Market has player on different team than prop."""
    roster = [make_roster("Kevin Durant", "PHX")]
    market = [make_market("Kevin Durant", "BOS")]
    valid, conflict = reconcile_player_team("Kevin Durant", "PHX", roster, market)
    # Roster matches, so team check passes. Market mismatch is secondary.
    assert valid or conflict is not None


def test_player_not_in_roster():
    """Player not found in roster — don't block (uncertain)."""
    roster = [make_roster("Other Player", "LAL")]
    market = []
    valid, conflict = reconcile_player_team("Unknown Player", "LAL", roster, market)
    assert valid  # Can't validate, don't block


def test_identity_collision():
    """Same normalized name on two teams."""
    roster = [
        make_roster("Marcus Williams", "BOS"),
        make_roster("Marcus Williams", "MIL"),
    ]
    conflicts = detect_identity_collisions(roster, "nba")
    assert len(conflicts) >= 1
    assert conflicts[0].conflict_type == "IDENTITY_COLLISION"


def test_no_identity_collision():
    roster = [
        make_roster("LeBron James", "LAL"),
        make_roster("Kevin Durant", "PHX"),
    ]
    conflicts = detect_identity_collisions(roster, "nba")
    assert len(conflicts) == 0


def test_stale_mapping():
    """Forecast references player not in recent roster."""
    roster = [make_roster("LeBron James", "LAL")]
    props = [{
        "player_name": "Traded Player",
        "normalized_name": normalize_player_name("Traded Player"),
        "event_id": "nba-test-123",
    }]
    conflicts = detect_stale_mappings(props, roster)
    assert len(conflicts) == 1
    assert conflicts[0].conflict_type == "STALE_MAPPING"


if __name__ == "__main__":
    test_correct_team_mapping()
    test_team_mismatch_trade()
    test_market_team_mismatch()
    test_player_not_in_roster()
    test_identity_collision()
    test_no_identity_collision()
    test_stale_mapping()
    print("All reconciliation tests passed!")
