from __future__ import annotations

import logging

from config.settings import settings

logger = logging.getLogger(__name__)


class RiskManager:
    """يحسب حجم الصفقة ومستويات TP/SL بناءً على نسبة المخاطرة."""

    def calculate_quantity(self, price: float, balance: float) -> float:
        """
        risk_amount = balance * RISK_PER_TRADE
        quantity    = risk_amount / price
        مُقرَّب لـ 6 أرقام عشرية (معيار Binance Spot)
        """
        if price <= 0:
            raise ValueError(f"السعر يجب أن يكون أكبر من صفر، القيمة الواردة: {price}")
        risk_amount = balance * settings.RISK_PER_TRADE
        quantity = round(risk_amount / price, 6)
        logger.debug(
            f"حجم الصفقة: risk={risk_amount:.2f} USDT | price={price} | qty={quantity}"
        )
        return quantity

    def calculate_tp_sl(
        self, action: str, entry_price: float
    ) -> tuple[float, float]:
        """
        BUY:  tp = entry * (1 + TAKE_PROFIT_PCT)
              sl = entry * (1 - STOP_LOSS_PCT)
        SELL: tp = entry * (1 - TAKE_PROFIT_PCT)
              sl = entry * (1 + STOP_LOSS_PCT)
        Returns (take_profit, stop_loss)
        """
        if action == "BUY":
            tp = round(entry_price * (1 + settings.TAKE_PROFIT_PCT), 8)
            sl = round(entry_price * (1 - settings.STOP_LOSS_PCT), 8)
        else:
            tp = round(entry_price * (1 - settings.TAKE_PROFIT_PCT), 8)
            sl = round(entry_price * (1 + settings.STOP_LOSS_PCT), 8)

        logger.debug(f"TP={tp} | SL={sl} | action={action} | entry={entry_price}")
        return tp, sl


risk_manager = RiskManager()
