from __future__ import annotations

from loguru import logger

from config import config


def calculate_position_size(
    capital: float, risk_pct: float, entry: float, sl: float, side: str = "long"
) -> int:
    if entry <= 0 or sl <= 0 or entry == sl:
        logger.warning("Invalid entry or SL price")
        return 0

    risk_amount = capital * risk_pct

    commission = config.get("COMMISSION_PCT", 0.001)
    slippage = config.get("SLIPPAGE_PCT", 0.0005)

    if side.lower() == "short":
        adjusted_entry = entry * (1 - commission - slippage)
        adjusted_sl = sl * (1 + commission + slippage)
    else:
        adjusted_entry = entry * (1 + commission + slippage)
        adjusted_sl = sl * (1 - commission - slippage)

    actual_risk = abs(adjusted_entry - adjusted_sl)
    if actual_risk <= 0:
        return 0

    size = risk_amount / actual_risk
    size = int(size)

    max_capital_usage = capital * 0.20
    position_value = size * entry
    if position_value > max_capital_usage:
        size = int(max_capital_usage / entry)

    logger.debug(
        f"Position size: {size} lots (risk={risk_pct*100}%, "
        f"entry={entry}, sl={sl}, risk_amount={risk_amount}, side={side})"
    )
    return size