"""
Unit tests for FreeExile Seasonal League & Realm Partitioning System.
Verifies PoE2-style fresh start resets, realm isolation, remove-only stash tabs,
hardcore permadeath migration, and lifecycle management.
"""

import pytest
import time
import sys
import os

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../../server")))

from world.season_league_manager import (
    LeagueType,
    LeagueStatus,
    League,
    SeasonCharacter,
    StashTab,
    SeasonStashItem,
    SeasonLeagueManager,
)


@pytest.fixture
def league_manager():
    manager = SeasonLeagueManager()
    # Create Season 1: Minh Nguyet
    manager.create_league(
        league_id="season_01_minh_nguyet",
        display_name="Mùa 1: Minh Nguyệt Trảm Thiên",
        league_type=LeagueType.CHALLENGE,
        status=LeagueStatus.ACTIVE,
        version_requirement="v1.0.0",
        mechanic_flags={"blood_meridian": "enabled", "drop_rate_mult": "1.2"}
    )
    # Create Season 1 Hardcore
    manager.create_league(
        league_id="season_01_hardcore",
        display_name="Mùa 1: Tử Sinh Luân Hồi (Hardcore)",
        league_type=LeagueType.HARDCORE,
        status=LeagueStatus.ACTIVE,
        version_requirement="v1.0.0",
        mechanic_flags={"permadeath_migration": "standard"}
    )
    # Create Season 1 SSF
    manager.create_league(
        league_id="season_01_ssf",
        display_name="Mùa 1: Độc Hành Tu Chân (SSF)",
        league_type=LeagueType.SOLO_SELF_FOUND,
        status=LeagueStatus.ACTIVE,
        version_requirement="v1.0.0",
        mechanic_flags={"trade_disabled": "true"}
    )
    return manager


def test_standard_realm_initialized_by_default(league_manager):
    """Standard (Thái Hư Giới) must always exist and never be archived."""
    standard = league_manager.get_league("standard")
    assert standard is not None
    assert standard.league_type == LeagueType.STANDARD
    assert standard.status == LeagueStatus.ACTIVE


def test_seasonal_fresh_character_creation(league_manager):
    """Creating a character in a new season starts fresh at level 1 with 0 progression."""
    char = league_manager.create_character(
        account_id="acc_001",
        character_name="KiemMaDocHanh",
        martial_class="ThienNhan",
        league_id="season_01_minh_nguyet"
    )
    assert char.character_id is not None
    assert char.level == 1
    assert char.league_id == "season_01_minh_nguyet"
    assert len(char.inventory) == 0
    assert char.is_alive is True


def test_cannot_create_character_in_inactive_or_frozen_league(league_manager):
    """Character creation is rejected if league is frozen or upcoming."""
    league_manager.create_league(
        league_id="season_02_hon_don",
        display_name="Mùa 2: Hỗn Độn Sơ Khai",
        league_type=LeagueType.CHALLENGE,
        status=LeagueStatus.UPCOMING,
        version_requirement="v1.1.0"
    )

    with pytest.raises(ValueError, match="is not active for character creation"):
        league_manager.create_character(
            account_id="acc_001",
            character_name="VoDanhTang",
            martial_class="ThieuLam",
            league_id="season_02_hon_don"
        )


def test_strict_realm_isolation(league_manager):
    """Characters from Standard cannot enter Season instances and vice versa."""
    char_season = league_manager.create_character(
        account_id="acc_001",
        character_name="KiemHiepMua1",
        martial_class="VoDang",
        league_id="season_01_minh_nguyet"
    )
    char_std = league_manager.create_character(
        account_id="acc_001",
        character_name="LaoTienBoiStd",
        martial_class="VoDang",
        league_id="standard"
    )

    # Seasonal character can enter season instance, but not standard
    assert league_manager.validate_realm_access(char_season.character_id, "season_01_minh_nguyet") is True
    assert league_manager.validate_realm_access(char_season.character_id, "standard") is False

    # Standard character cannot enter season instance
    assert league_manager.validate_realm_access(char_std.character_id, "standard") is True
    assert league_manager.validate_realm_access(char_std.character_id, "season_01_minh_nguyet") is False


def test_remove_only_stash_tab_behavior(league_manager):
    """
    Remove-Only tabs (migrated from expired leagues) allow item withdrawal
    but strictly forbid depositing new items. When empty, they are prunable.
    """
    tab = StashTab(
        tab_id="tab_migrated_01",
        account_id="acc_001",
        league_id="standard",
        name="[Chỉ Rút] Mùa 1 Kho Chung",
        is_remove_only=True
    )
    item = SeasonStashItem(item_uuid="item_sword_99", item_name="Bích Huyết Kiếm", stack_count=1)
    tab.items[item.item_uuid] = item

    # Withdrawal is permitted
    withdrawn = tab.withdraw_item("item_sword_99")
    assert withdrawn is not None
    assert withdrawn.item_name == "Bích Huyết Kiếm"
    assert tab.is_empty() is True
    assert tab.is_prunable() is True

    # Depositing back into Remove-Only tab is strictly forbidden
    new_item = SeasonStashItem(item_uuid="item_pill_01", item_name="Thiên Mệnh Đan", stack_count=5)
    with pytest.raises(ValueError, match="Cannot deposit into Remove-Only stash tab"):
        tab.deposit_item(new_item)


def test_hardcore_permadeath_immediate_migration(league_manager):
    """
    In Hardcore league, character death immediately migrates the character to Standard realm.
    They cannot play in the Hardcore league anymore, but do not lose their character permanently.
    """
    hc_char = league_manager.create_character(
        account_id="acc_hardcore",
        character_name="LinhHonBatDiet",
        martial_class="CaiBang",
        league_id="season_01_hardcore"
    )
    assert hc_char.league_id == "season_01_hardcore"

    # Simulate player dying in combat
    success, msg = league_manager.handle_hardcore_death(hc_char.character_id)
    assert success is True
    assert "migrated to Standard" in msg

    # Verification: character is now in standard
    updated_char = league_manager.get_character(hc_char.character_id)
    assert updated_char.league_id == "standard"
    assert updated_char.is_alive is True # Revived in Standard realm


def test_solo_self_found_voluntary_migration(league_manager):
    """
    In SSF league, player can voluntarily migrate their character to the active Trade league.
    """
    ssf_char = league_manager.create_character(
        account_id="acc_ssf",
        character_name="DocHanhKiem",
        martial_class="ThienNhan",
        league_id="season_01_ssf"
    )

    success, msg = league_manager.handle_ssf_voluntary_migration(
        character_id=ssf_char.character_id,
        target_trade_league_id="season_01_minh_nguyet"
    )
    assert success is True
    assert league_manager.get_character(ssf_char.character_id).league_id == "season_01_minh_nguyet"
