"""
Unit tests for Dynamic Ambush Trigger Engine.
Verifies proximity triggering, once-only activation, and the CRITICAL
PoE2 Safe Haven Firewall rejecting any ambush in Sanctuaries or Hideouts.
"""

import os
import sys
import pytest

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

from world.wilderness_encounter_engine import (
    WildernessEncounterEngine,
    AmbushTrigger,
    AmbushTriggerType,
)


class TestAmbushTriggerEngine:
    def test_ambush_trigger_activates_within_radius(self) -> None:
        """Verifies an ambush triggers when player is within the trigger radius."""
        engine = WildernessEncounterEngine()
        spec = engine.get_zone_density_spec("zone_tang_kiem_nhai")
        assert spec is not None
        trigger_def = spec["ambushes"][0]

        ok, msg, mobs = engine.check_and_trigger_ambush(
            zone_id="zone_tang_kiem_nhai",
            trigger_id=trigger_def.trigger_id,
            player_x=trigger_def.x + 1.0,
            player_y=trigger_def.y + 1.0,
        )

        assert ok is True
        assert "bùng nổ" in msg
        assert len(mobs) >= trigger_def.ambush_pack_size
        for m in mobs:
            assert m.max_hp > 0
            assert m.base_damage > 0

    def test_ambush_trigger_inactive_outside_radius(self) -> None:
        """Verifies an ambush does not trigger when player is beyond the trigger radius."""
        engine = WildernessEncounterEngine()
        spec = engine.get_zone_density_spec("zone_tang_kiem_nhai")
        assert spec is not None
        trigger_def = spec["ambushes"][0]

        ok, msg, mobs = engine.check_and_trigger_ambush(
            zone_id="zone_tang_kiem_nhai",
            trigger_id=trigger_def.trigger_id,
            player_x=trigger_def.x + 25.0,
            player_y=trigger_def.y + 25.0,
        )

        assert ok is False
        assert "vượt quá bán kính" in msg
        assert len(mobs) == 0

    def test_ambush_trigger_is_once_only(self) -> None:
        """Verifies an ambush can only be activated once and does not duplicate."""
        engine = WildernessEncounterEngine()
        spec = engine.get_zone_density_spec("zone_tang_kiem_nhai")
        assert spec is not None
        trigger_def = spec["ambushes"][0]

        # First trigger -> Success
        ok1, _, mobs1 = engine.check_and_trigger_ambush(
            zone_id="zone_tang_kiem_nhai",
            trigger_id=trigger_def.trigger_id,
            player_x=trigger_def.x,
            player_y=trigger_def.y,
        )
        assert ok1 is True
        assert len(mobs1) > 0

        # Second trigger attempt -> Rejected
        ok2, msg2, mobs2 = engine.check_and_trigger_ambush(
            zone_id="zone_tang_kiem_nhai",
            trigger_id=trigger_def.trigger_id,
            player_x=trigger_def.x,
            player_y=trigger_def.y,
        )
        assert ok2 is False
        assert "đã được kích hoạt trước đó" in msg2
        assert len(mobs2) == 0

    def test_ambush_trigger_failsafe_in_sanctuary(self) -> None:
        """
        CRITICAL SAFE HAVEN PURITY TEST:
        Any attempt to evaluate or trigger an ambush in zone_player_hideout
        or zone_boundless_sanctuary must immediately abort with Vietnamese rejection.
        """
        engine = WildernessEncounterEngine()

        # Register an ambush trigger deliberately in hideout
        hideout_trigger = AmbushTrigger(
            trigger_id="ambush_forbidden_hideout",
            zone_id="zone_player_hideout",
            trigger_type=AmbushTriggerType.SHRINE,
            x=0.0,
            y=0.0,
            trigger_radius=5.0,
            ambush_pack_size=4,
        )
        engine.register_trigger(hideout_trigger)

        ok_h, msg_h, mobs_h = engine.check_and_trigger_ambush(
            zone_id="zone_player_hideout",
            trigger_id="ambush_forbidden_hideout",
            player_x=0.0,
            player_y=0.0,
        )
        assert ok_h is False
        assert "Nghiêm cấm kích hoạt phục kích trong khu vực An Toàn" in msg_h
        assert len(mobs_h) == 0

        # Register an ambush trigger deliberately in boundless sanctuary
        sanctuary_trigger = AmbushTrigger(
            trigger_id="ambush_forbidden_sanctuary",
            zone_id="zone_boundless_sanctuary",
            trigger_type=AmbushTriggerType.CORRUPTED_RIFT,
            x=10.0,
            y=10.0,
            trigger_radius=5.0,
            ambush_pack_size=5,
        )
        engine.register_trigger(sanctuary_trigger)

        ok_s, msg_s, mobs_s = engine.check_and_trigger_ambush(
            zone_id="zone_boundless_sanctuary",
            trigger_id="ambush_forbidden_sanctuary",
            player_x=10.0,
            player_y=10.0,
        )
        assert ok_s is False
        assert "Nghiêm cấm kích hoạt phục kích trong khu vực An Toàn" in msg_s
        assert len(mobs_s) == 0
