import sys
sys.path.insert(0, r"c:\Projects\FreeExile")
sys.path.insert(0, r"c:\Projects\FreeExile\.agents\teamwork\explorer_m2_progression_1_gen2")

from proposed_level_progression_service import LevelProgressionService
from server.world.level_progression_types import DeathPenaltyResult

def test_proposed_unit_cases():
    s = LevelProgressionService()

    # Case 1: Level 100 clamp
    pid = "player_lv100_overflow"
    d99 = s.get_delta_exp(99)
    s.set_player_state(pid, level=99, current_exp=d99 - 10)
    res = s.award_monster_exp(pid, 100, 100, 1_000_000)
    info = s.get_level_info(pid)
    b100 = s.get_canonical_benchmark(100)
    assert info.level == 100
    assert info.current_exp == 0
    assert info.exp_to_next_level == 0
    assert info.cumulative_exp == b100.cumulative_exp
    assert info.cumulative_exp == 24_285_477_315
    assert res.exp_to_next_level == 0
    print("Case 1 passed")

    # Case 2: Level 100 death listener & counter
    pid2 = "player_lv100_death_listener"
    s.set_player_state(pid2, level=100, current_exp=0)
    dispatched_events: list[DeathPenaltyResult] = []
    s.add_death_penalty_listener(lambda r: dispatched_events.append(r))
    res2 = s.apply_death_penalty(pid2)
    info2 = s.get_level_info(pid2)
    assert info2.deaths_count == 1
    assert len(dispatched_events) == 1
    assert dispatched_events[0] == res2
    assert res2.exp_lost == 0
    assert res2.penalty_ratio == 0.0
    assert res2.de_leveled is False
    print("Case 2 passed")

    # Case 3: Negative exp sanitization
    pid3 = "player_neg_exp"
    s.set_player_state(pid3, level=10, current_exp=100)
    res_neg1 = s.award_monster_exp(pid3, 10, base_exp=-100)
    assert res_neg1.raw_exp == 0
    assert res_neg1.exp_awarded == 0
    assert s.get_level_info(pid3).current_exp == 100
    res_neg2 = s.award_monster_exp(pid3, 10, 10, -50)
    assert res_neg2.raw_exp == 0
    assert res_neg2.exp_awarded == 0
    assert s.get_level_info(pid3).current_exp == 100
    print("Case 3 passed")

if __name__ == "__main__":
    test_proposed_unit_cases()
    print("ALL PROPOSED UNIT CASES PASSED!")
