"""
Unit Tests for Ange Currency Exchange Routine (Doc 43 P2-2)
============================================================
Kiểm thử các bất biến:
- INV-ANGE-EXCHANGE-01: Reserve Interlock & Anti-Depletion
- Cooldown 60s
- Circuit Breaker sau 2 lần thất bại
"""

import pytest
from src.assistant_tool.pickit.ange_exchange import (
    AngeCurrencyExchangeManager,
    AngeExchangeConfig,
    ExchangeStatus,
)


def test_inv_ange_exchange_reserve_interlock():
    manager = AngeCurrencyExchangeManager()

    # 1. Khi số Exalted <= 5 -> CẤM ĐỔI (REJECTED_LOW_RESERVE)
    decision_5 = manager.evaluate_exchange(current_exalted_count=5, alchemy_rate_per_exalt=15)
    assert decision_5.allowed is False
    assert decision_5.status == ExchangeStatus.REJECTED_LOW_RESERVE
    assert "INV-ANGE-EXCHANGE-01" in decision_5.reason

    decision_3 = manager.evaluate_exchange(current_exalted_count=3, alchemy_rate_per_exalt=15)
    assert decision_3.allowed is False
    assert decision_3.status == ExchangeStatus.REJECTED_LOW_RESERVE

    # 2. Khi số Exalted = 6 (> 5) -> ĐƯỢC PHÉP ĐỔI ĐÚNG 1 EXALT
    decision_6 = manager.evaluate_exchange(current_exalted_count=6, alchemy_rate_per_exalt=15)
    assert decision_6.allowed is True
    assert decision_6.status == ExchangeStatus.SUCCESS
    assert decision_6.exalted_to_spend == 1


def test_ange_exchange_cooldown():
    manager = AngeCurrencyExchangeManager()
    base_time = 1000000

    # Lần đầu đổi thành công
    d1 = manager.evaluate_exchange(current_exalted_count=10, alchemy_rate_per_exalt=15, now_ms=base_time)
    assert d1.allowed is True
    manager.record_exchange_result(success=True, received_alchemy=15, now_ms=base_time)

    # Thử đổi lại sau 30 giây (chưa đủ cooldown 60s) -> Bị từ chối
    d2 = manager.evaluate_exchange(current_exalted_count=9, alchemy_rate_per_exalt=15, now_ms=base_time + 30000)
    assert d2.allowed is False
    assert d2.status == ExchangeStatus.REJECTED_COOLDOWN

    # Sau 61 giây -> Đã hết cooldown -> Được phép đổi
    d3 = manager.evaluate_exchange(current_exalted_count=9, alchemy_rate_per_exalt=15, now_ms=base_time + 61000)
    assert d3.allowed is True


def test_ange_exchange_circuit_breaker():
    manager = AngeCurrencyExchangeManager()
    base_time = 1000000

    # Lần thất bại 1
    manager.record_exchange_result(success=False, now_ms=base_time)
    assert manager.consecutive_failures == 1

    # Lần thất bại 2 -> Kích hoạt Circuit Breaker
    manager.record_exchange_result(success=False, now_ms=base_time + 1000)
    assert manager.consecutive_failures == 2
    assert manager.circuit_breaker_until_ms > base_time

    # Thử đổi ngay sau đó -> Bị chặn bởi CIRCUIT_BREAKER_ACTIVE
    d = manager.evaluate_exchange(current_exalted_count=10, alchemy_rate_per_exalt=15, now_ms=base_time + 2000)
    assert d.allowed is False
    assert d.status == ExchangeStatus.CIRCUIT_BREAKER_ACTIVE
