from __future__ import annotations

import os
import pytest

os.environ.setdefault("EXECUTION_BOT_TOKEN", "test-token")
os.environ.setdefault("RISK_PER_TRADE", "0.02")
os.environ.setdefault("TAKE_PROFIT_PCT", "0.03")
os.environ.setdefault("STOP_LOSS_PCT", "0.015")

from risk.manager import RiskManager


def make_rm() -> RiskManager:
    return RiskManager()


def test_quantity_calculation():
    """balance=1000، RISK=2%، price=65000 → risk_amount=20 → qty=20/65000"""
    rm = make_rm()
    qty = rm.calculate_quantity(price=65000.0, balance=1000.0)
    expected = round(20.0 / 65000.0, 6)
    assert abs(qty - expected) < 1e-8


def test_quantity_small_balance():
    rm = make_rm()
    qty = rm.calculate_quantity(price=3200.0, balance=500.0)
    expected = round(10.0 / 3200.0, 6)
    assert abs(qty - expected) < 1e-8


def test_quantity_raises_for_zero_price():
    rm = make_rm()
    with pytest.raises(ValueError):
        rm.calculate_quantity(price=0.0, balance=1000.0)


def test_tp_sl_buy():
    """BUY: tp = entry * 1.03، sl = entry * 0.985"""
    rm = make_rm()
    tp, sl = rm.calculate_tp_sl("BUY", 65000.0)
    assert abs(tp - 65000.0 * 1.03) < 1e-4
    assert abs(sl - 65000.0 * 0.985) < 1e-4


def test_tp_sl_sell():
    """SELL: tp = entry * 0.97، sl = entry * 1.015"""
    rm = make_rm()
    tp, sl = rm.calculate_tp_sl("SELL", 65000.0)
    assert abs(tp - 65000.0 * 0.97) < 1e-4
    assert abs(sl - 65000.0 * 1.015) < 1e-4


def test_tp_greater_than_entry_for_buy():
    rm = make_rm()
    tp, sl = rm.calculate_tp_sl("BUY", 3200.0)
    assert tp > 3200.0
    assert sl < 3200.0


def test_tp_less_than_entry_for_sell():
    rm = make_rm()
    tp, sl = rm.calculate_tp_sl("SELL", 3200.0)
    assert tp < 3200.0
    assert sl > 3200.0
