"""
Integration Test Suite for Beggar's Journey through Quest and Storyline Systems.
Simulates a player progressing from Level 1 beggar to Level 60+ endgame sovereign:
1. Act I (Lvl 1-5): The Dregs of Hunger -> Defeating Bone Hounds, awakening bloodline.
2. Act II (Lvl 8-10): The Putrid Humiliation -> Surviving swamps and ghost thralls.
3. Act III (Lvl 15-30): Sandstorm Crucible -> Conquering the Dune Scorpion, crafting bone weapons.
4. Act IV (Lvl 40-50): Primal Titan Hunts -> Breaking keystones, cloning with Blood Mirror.
5. Act V (Lvl 60+): Sovereign of Deadlands -> Conquering the void lord, claiming Milestone V.
"""

import pytest
from server.world.quest_engine import (
    create_default_quest_engine,
    QuestStatus,
    QuestEngine,
)
from server.world.storyline_types import (
    StoryAct,
    BeggarAscentStage,
)
from server.world.storyline_engine import StorylineEngine


class TestBeggarQuestProgression:
    @pytest.fixture
    def engines(self) -> tuple[QuestEngine, StorylineEngine]:
        q_engine = create_default_quest_engine(attach_storyline=True)
        s_engine = q_engine.get_story_engine()
        assert s_engine is not None
        return q_engine, s_engine

    def test_act1_hunger_survival(self, engines: tuple[QuestEngine, StorylineEngine]) -> None:
        q_engine, s_engine = engines
        player_id = "beggar_hero_01"

        # 1. Accept first quest
        assert q_engine.accept_quest(player_id, "quest_norm_01_thuc_tinh_tang_kiem", player_level=1)
        quest = q_engine.get_player_quest(player_id, "quest_norm_01_thuc_tinh_tang_kiem")
        assert quest.status == QuestStatus.IN_PROGRESS

        # 2. Defeat 5 bone hounds with beggar stick
        q_engine.record_kill(player_id, "mob_trash_bone_hound", count=5)
        quest = q_engine.get_player_quest(player_id, "quest_norm_01_thuc_tinh_tang_kiem")
        assert quest.status == QuestStatus.COMPLETED

        # 3. Claim reward and check storyline sync
        success, reward, _ = q_engine.claim_quest_reward(player_id, "quest_norm_01_thuc_tinh_tang_kiem")
        assert success is True
        assert reward is not None

        story_state = s_engine.get_player_story_state(player_id)
        assert story_state.current_act == StoryAct.ACT_I_HUNGER
        assert story_state.current_stage == BeggarAscentStage.MENDICANT
        assert "journal_01_chiec_bat_vo" in story_state.unlocked_journal_ids

    def test_act2_swamp_miasma_progression(self, engines: tuple[QuestEngine, StorylineEngine]) -> None:
        q_engine, s_engine = engines
        player_id = "beggar_hero_02"

        # Complete prerequisites
        q_engine.accept_quest(player_id, "quest_norm_01_thuc_tinh_tang_kiem", player_level=1)
        q_engine.record_kill(player_id, "mob_trash_bone_hound", count=5)
        q_engine.claim_quest_reward(player_id, "quest_norm_01_thuc_tinh_tang_kiem")

        q_engine.accept_quest(player_id, "quest_norm_02_khai_thong_dan_dien", player_level=2)
        q_engine.record_meridian_unlock(player_id, "meridian_origin_dantian")
        q_engine.claim_quest_reward(player_id, "quest_norm_02_khai_thong_dan_dien")

        q_engine.accept_quest(player_id, "quest_norm_03_luyen_khi_hoa_thach", player_level=5)
        q_engine.record_craft(player_id, "currency_primal_chaos_stone", count=1)
        q_engine.claim_quest_reward(player_id, "quest_norm_03_luyen_khi_hoa_thach")

        # Act II: Quest 4 - Putrid Fens Sword Thralls
        assert q_engine.accept_quest(player_id, "quest_norm_04_diet_u_hon_kiem_no", player_level=8)
        q_engine.record_kill(player_id, "mob_trash_ghost_sword_thrall", count=10)
        q_engine.claim_quest_reward(player_id, "quest_norm_04_diet_u_hon_kiem_no")

        story_state = s_engine.get_player_story_state(player_id)
        assert story_state.current_act == StoryAct.ACT_II_MIASMA
        assert story_state.current_stage == BeggarAscentStage.SCAVENGER
        assert story_state.reputation_title == "Kẻ Mót Xương Bùn Độc"
        assert "journal_04_bun_ngap_ngang_nguc" in story_state.unlocked_journal_ids

    def test_full_progression_to_sovereign_outcast(self, engines: tuple[QuestEngine, StorylineEngine]) -> None:
        q_engine, s_engine = engines
        player_id = "beggar_hero_03"

        # Quest 1
        q_engine.accept_quest(player_id, "quest_norm_01_thuc_tinh_tang_kiem", player_level=1)
        q_engine.record_kill(player_id, "mob_trash_bone_hound", count=5)
        q_engine.claim_quest_reward(player_id, "quest_norm_01_thuc_tinh_tang_kiem")

        # Quest 2
        q_engine.accept_quest(player_id, "quest_norm_02_khai_thong_dan_dien", player_level=2)
        q_engine.record_meridian_unlock(player_id, "meridian_origin_dantian")
        q_engine.claim_quest_reward(player_id, "quest_norm_02_khai_thong_dan_dien")

        # Quest 3
        q_engine.accept_quest(player_id, "quest_norm_03_luyen_khi_hoa_thach", player_level=5)
        q_engine.record_craft(player_id, "currency_primal_chaos_stone", count=1)
        q_engine.claim_quest_reward(player_id, "quest_norm_03_luyen_khi_hoa_thach")

        # Quest 4
        q_engine.accept_quest(player_id, "quest_norm_04_diet_u_hon_kiem_no", player_level=8)
        q_engine.record_kill(player_id, "mob_trash_ghost_sword_thrall", count=10)
        q_engine.claim_quest_reward(player_id, "quest_norm_04_diet_u_hon_kiem_no")

        # Quest 5
        q_engine.accept_quest(player_id, "quest_norm_05_khai_mo_van_gioi_cac", player_level=10)
        q_engine.record_action(player_id, "action_vault_instant_buyout", count=1)
        q_engine.claim_quest_reward(player_id, "quest_norm_05_khai_mo_van_gioi_cac")

        # Act III: Epic 1 - Dune Scorpion Bone Weapons
        assert q_engine.accept_quest(player_id, "quest_epic_01_phong_ma_co_tran", player_level=30)
        q_engine.record_kill(player_id, "boss_black_dragon_demon", count=1)
        q_engine.record_craft(player_id, "craft_rare_gear", count=1)
        q_engine.claim_quest_reward(player_id, "quest_epic_01_phong_ma_co_tran")

        story_state = s_engine.get_player_story_state(player_id)
        assert story_state.current_stage == BeggarAscentStage.BONE_WARRIOR

        # Act IV: Epic 2 - Breaking Keystone
        assert q_engine.accept_quest(player_id, "quest_epic_02_nghich_menh_dai_huyet", player_level=40)
        q_engine.record_meridian_unlock(player_id, "meridian_keystone_unbreakable")
        q_engine.claim_quest_reward(player_id, "quest_epic_02_nghich_menh_dai_huyet")

        story_state = s_engine.get_player_story_state(player_id)
        assert story_state.current_stage == BeggarAscentStage.PRIMAL_HUNTER

        # Act V: Epic 3 & 4 - Blood Mirror & Void Lord
        assert q_engine.accept_quest(player_id, "quest_epic_03_luyen_che_thai_hu_kinh", player_level=50)
        q_engine.record_action(player_id, "action_mirror_artifact_clone", count=1)
        q_engine.claim_quest_reward(player_id, "quest_epic_03_luyen_che_thai_hu_kinh")

        assert q_engine.accept_quest(player_id, "quest_epic_04_van_gioi_than_ma_tranh_ba", player_level=60)
        q_engine.record_kill(player_id, "boss_flame_demon_lord", count=1)
        q_engine.claim_quest_reward(player_id, "quest_epic_04_van_gioi_than_ma_tranh_ba")

        # Check pinnacle stage
        story_state = s_engine.get_player_story_state(player_id)
        assert story_state.current_act == StoryAct.ACT_V_SOVEREIGN
        assert story_state.current_stage == BeggarAscentStage.SOVEREIGN_OUTCAST
        assert story_state.reputation_title == "Bá Chủ Tối Cao Cõi Lưu Đày"
