from __future__ import annotations

import os
import pandas as pd
import pytest

os.environ.setdefault("BRAIN_BOT_URL", "http://localhost:9001")

from strategy.signal_generator import RSISignalGenerator


gen = RSISignalGenerator()


def rsi_series(val: float, n: int = 20) -> pd.Series:
    """يُنشئ Series بقيمة RSI ثابتة في النهاية."""
    return pd.Series([50.0] * (n - 1) + [val])


def test_rsi_below_30_is_buy():
    sig = gen.generate("BTCUSDT", rsi_series(25.0), "5m")
    assert sig.action == "BUY"


def test_rsi_above_70_is_sell():
    sig = gen.generate("BTCUSDT", rsi_series(75.0), "5m")
    assert sig.action == "SELL"


def test_rsi_between_30_and_70_is_hold():
    sig = gen.generate("BTCUSDT", rsi_series(50.0), "5m")
    assert sig.action == "HOLD"


def test_rsi_exactly_30_is_hold():
    """الحد الأدنى نفسه (30) → HOLD (يجب أن يكون أقل من 30)."""
    sig = gen.generate("BTCUSDT", rsi_series(30.0), "5m")
    assert sig.action == "HOLD"


def test_rsi_exactly_70_is_hold():
    sig = gen.generate("BTCUSDT", rsi_series(70.0), "5m")
    assert sig.action == "HOLD"


def test_hold_confidence_is_zero():
    sig = gen.generate("BTCUSDT", rsi_series(55.0), "5m")
    assert sig.confidence == 0.0


def test_extreme_low_rsi_high_confidence():
    """RSI < 20 → confidence >= 0.85."""
    sig = gen.generate("BTCUSDT", rsi_series(15.0), "5m")
    assert sig.confidence >= 0.85


def test_extreme_high_rsi_high_confidence():
    """RSI > 80 → confidence >= 0.85."""
    sig = gen.generate("BTCUSDT", rsi_series(85.0), "5m")
    assert sig.confidence >= 0.85


def test_normal_buy_zone_moderate_confidence():
    """RSI بين 20 و 30 → confidence بين 0.5 و 0.7."""
    sig = gen.generate("BTCUSDT", rsi_series(25.0), "5m")
    assert 0.50 <= sig.confidence <= 0.70


def test_source_is_rsi_bot():
    sig = gen.generate("BTCUSDT", rsi_series(25.0), "1h")
    assert sig.source == "rsi_bot"


def test_empty_series_returns_hold():
    sig = gen.generate("BTCUSDT", pd.Series([], dtype=float), "5m")
    assert sig.action == "HOLD"
