from __future__ import annotations

import asyncio
import os

import pytest

os.environ.setdefault("EXECUTION_BOT_TOKEN", "test-token")
os.environ.setdefault("TRADING_MODE", "SIMULATION")

from signals.aggregator import SignalAggregator


@pytest.mark.asyncio
async def test_single_buy_signal():
    results = []

    async def on_flush(symbol, score, count):
        results.append((symbol, score, count))

    agg = SignalAggregator(on_flush=on_flush)
    agg._timers  # تأكد من وجود dict

    # نستخدم flush مباشرة لتجاوز انتظار النافذة الزمنية
    agg._buffer["BTCUSDT"] = []
    await agg.receive("BTCUSDT", "BUY", 0.8, "macd_bot")

    # نُفلِش يدوياً
    agg._buffer["BTCUSDT"].append(agg._buffer["BTCUSDT"].pop())  # لا شيء، الإشارة موجودة بالفعل
    entries = agg._buffer.pop("BTCUSDT", [])
    score = agg._compute_score(entries)

    assert abs(score - 0.8) < 1e-9


@pytest.mark.asyncio
async def test_buy_and_sell_signals():
    from signals.aggregator import SignalEntry

    agg = SignalAggregator(on_flush=lambda s, sc, c: None)
    from dataclasses import dataclass
    entries = [
        SignalEntry("BTCUSDT", "BUY", 0.8, "macd"),
        SignalEntry("BTCUSDT", "SELL", 0.3, "rsi"),
    ]
    score = agg._compute_score(entries)
    assert abs(score - 0.5) < 1e-9


@pytest.mark.asyncio
async def test_all_sell_signals():
    from signals.aggregator import SignalEntry

    agg = SignalAggregator(on_flush=lambda s, sc, c: None)
    entries = [
        SignalEntry("BTCUSDT", "SELL", 0.7, "rsi"),
        SignalEntry("BTCUSDT", "SELL", 0.5, "macd"),
    ]
    score = agg._compute_score(entries)
    assert abs(score - (-1.2)) < 1e-9


@pytest.mark.asyncio
async def test_different_symbols_independent():
    """إشارات لرموز مختلفة تُخزَّن في buffers مستقلة."""
    results = []

    async def on_flush(symbol, score, count):
        results.append(symbol)

    agg = SignalAggregator(on_flush=on_flush)
    # نحاكي buffer منفصل لكل رمز
    from signals.aggregator import SignalEntry
    agg._buffer["BTCUSDT"] = [SignalEntry("BTCUSDT", "BUY", 0.9, "src")]
    agg._buffer["ETHUSDT"] = [SignalEntry("ETHUSDT", "SELL", 0.6, "src")]

    assert "BTCUSDT" in agg._buffer
    assert "ETHUSDT" in agg._buffer
    assert agg._buffer["BTCUSDT"] != agg._buffer["ETHUSDT"]
