import math


def _safe(val, default=0.0):
    return default if val is None else val


def calc_trend_score(
    smooth_ratio: float,
    buy_ratio: float,
    cvd_value: float,
    whale_usd: float,
    f_mempool: float,
    f_fee: float,
    f_block: float,
) -> float:
    """
    ציון טרנד 0–100.
    בנוי כך:
    - בסיס 50
    - buy_ratio (כמה צד הקונים דומיננטי)
    - smooth (כמה התנועה “נקייה” ולא רועשת)
    - CVD (לחץ נטו)
    - whale (עסקאות גדולות)
    - onchain (ממפול/עמוס רשת)
    """

    smooth_ratio = _safe(smooth_ratio)
    buy_ratio = _safe(buy_ratio)
    cvd_value = _safe(cvd_value)
    whale_usd = _safe(whale_usd)
    f_mempool = _safe(f_mempool)
    f_fee = _safe(f_fee)
    f_block = _safe(f_block)

    # בסיס
    score = 50.0

    # קונים: 0.50 → ניטרלי, מעל זה → פלוס, מתחת → מינוס
    buy_term = (buy_ratio - 0.5) * 80.0  # 0.62 → ~+9.6
    buy_term = max(-20.0, min(20.0, buy_term))
    score += buy_term

    # smooth: נחשב כמו “כוח טרנד” – ככל שגדול יותר, נותן תוספת
    # smooth בין 0–8 → נמתח ל־0–15
    smooth_term = math.tanh(smooth_ratio / 4.0) * 15.0
    score += smooth_term

    # CVD: נניח ש־|cvd|~40 זה מקס’ אפקט → tanh
    cvd_term = math.tanh(cvd_value / 40.0) * 15.0
    score += cvd_term

    # לוויתנים
    whale_term = math.tanh(whale_usd / 2_000_000.0) * 10.0
    score += whale_term

    # onchain: ממפול עמוס + הרבה tx בבלוק = תוספת
    onchain_raw = (f_mempool * 0.6 + f_block * 0.6 - f_fee * 0.3) * 10.0
    onchain_term = max(-8.0, min(8.0, onchain_raw))
    score += onchain_term

    # קליפ סופי
    return max(0.0, min(100.0, score))


def calc_net_bias(
    buy_ratio: float,
    depth_ratio: float,
    best_level_ratio: float,
    whale_usd: float,
    cvd_value: float,
    f_mempool: float,
    f_fee: float,
    f_block: float,
) -> float:
    """
    Bias – "למי השוק נותן יתרון":
    - חיובי → קונים שולטים
    - שלילי → מוכרים שולטים
    סקאלה בערך -10..+10
    """

    buy_ratio = _safe(buy_ratio, 0.5)
    depth_ratio = _safe(depth_ratio, 1.0)
    best_level_ratio = _safe(best_level_ratio, 1.0)
    whale_usd = _safe(whale_usd, 0.0)
    cvd_value = _safe(cvd_value, 0.0)
    f_mempool = _safe(f_mempool, 0.0)
    f_fee = _safe(f_fee, 0.0)
    f_block = _safe(f_block, 0.0)

    bias = 0.0

    # קונים לפי buy_ratio
    bias += (buy_ratio - 0.5) * 30.0  # 0.62 → ~+3.6

    # עומק
    # depth_ratio ~1 → ניטרלי, >1.5 → פלוס
    depth_term = math.tanh((depth_ratio - 1.0) / 1.0) * 3.0
    bias += depth_term

    # best level – רמות קרובות, עוצמה
    best_term = math.tanh((best_level_ratio - 1.0) / 2.0) * 4.0
    bias += best_term

    # CVD
    cvd_term = math.tanh(cvd_value / 40.0) * 3.0
    bias += cvd_term

    # לוויתנים
    whale_term = math.tanh(whale_usd / 2_000_000.0) * 3.0
    bias += whale_term

    # onchain: זרימה חיובית
    onchain_term = (f_mempool + f_block - f_fee) * 2.0
    bias += onchain_term

    # קליפ ריאלי
    return max(-10.0, min(10.0, bias))
