from __future__ import annotations

import os

import numpy as np
import pandas as pd
import pytest

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

from indicators.macd import calculate_macd
from strategy.signal_generator import MACDSignalGenerator


def make_bullish_cross_df() -> pd.DataFrame:
    """يُنشئ DataFrame يحتوي تقاطعاً صاعداً في آخر شمعتين."""
    # MACD كان تحت Signal ثم تجاوزه
    n = 50
    macd_vals = np.linspace(-1.0, 0.5, n)
    sig_vals  = np.zeros(n)
    # التأكد: [-2] macd < signal، [-1] macd > signal
    macd_vals[-2] = -0.1
    macd_vals[-1] =  0.1
    sig_vals[-2]  =  0.0
    sig_vals[-1]  =  0.0
    histogram = macd_vals - sig_vals
    return pd.DataFrame({"macd": macd_vals, "signal": sig_vals, "histogram": histogram})


def make_bearish_cross_df() -> pd.DataFrame:
    """يُنشئ DataFrame يحتوي تقاطعاً هابطاً في آخر شمعتين."""
    n = 50
    macd_vals = np.linspace(1.0, -0.5, n)
    sig_vals  = np.zeros(n)
    macd_vals[-2] =  0.1
    macd_vals[-1] = -0.1
    sig_vals[-2]  =  0.0
    sig_vals[-1]  =  0.0
    histogram = macd_vals - sig_vals
    return pd.DataFrame({"macd": macd_vals, "signal": sig_vals, "histogram": histogram})


def make_no_cross_df() -> pd.DataFrame:
    """لا يوجد تقاطع — MACD دائماً فوق Signal."""
    n = 50
    macd_vals = np.ones(n) * 0.5
    sig_vals  = np.zeros(n)
    histogram = macd_vals - sig_vals
    return pd.DataFrame({"macd": macd_vals, "signal": sig_vals, "histogram": histogram})


gen = MACDSignalGenerator()


def test_bullish_cross_gives_buy():
    df = make_bullish_cross_df()
    sig = gen.generate("BTCUSDT", df, "5m")
    assert sig.action == "BUY"


def test_bearish_cross_gives_sell():
    df = make_bearish_cross_df()
    sig = gen.generate("BTCUSDT", df, "5m")
    assert sig.action == "SELL"


def test_no_cross_gives_hold():
    df = make_no_cross_df()
    sig = gen.generate("BTCUSDT", df, "5m")
    assert sig.action == "HOLD"


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


def test_buy_confidence_between_zero_and_one():
    df = make_bullish_cross_df()
    sig = gen.generate("BTCUSDT", df, "5m")
    assert 0.0 < sig.confidence <= 1.0


def test_signal_source_is_macd_bot():
    df = make_bullish_cross_df()
    sig = gen.generate("BTCUSDT", df, "1h")
    assert sig.source == "macd_bot"


def test_insufficient_data_returns_hold():
    df = pd.DataFrame({"macd": [0.1], "signal": [0.0], "histogram": [0.1]})
    sig = gen.generate("BTCUSDT", df, "5m")
    assert sig.action == "HOLD"
