"""
indicators
==========

Parametri e helper per gli indicatori tecnici usati dal Charter.

Indicatori Charter (parametri FISSI per TUTTI i setup attivi):
  - Bollinger Bands:   length=55, mult=1.0
  - Rate of Change:    length=36
  - Average True Range: length=16 (Wilder RMA)
  - EMA 50:            span=50
  - ADX:               period=14

Per ogni indicatore, questo modulo fornisce:
  - I parametri (dict Python) come single source of truth
  - Helper di import che re-esporta compute_cd_from_row da cd_types

NB: il calcolo vero e proprio degli indicatori (con pandas) resta nei
sub-repo (live_deploy/live_engine.py e web_solver/web_solver_v6.py).
Questo modulo centralizza SOLO i parametri, in modo che se un domani
Mattia decide di passare da BB(55, 1.0) a BB(40, 1.5), basta modificare
BB_PARAMS qui e tutti i sub-repo sono allineati.

Fonte: charter_bot_report.html (sezione 3) - parametri Pine-faithful.
"""

from .cd_types import compute_cd_from_row  # re-export


# =====================================================================
# Parametri Charter
# =====================================================================

BB_PARAMS = {
    "length": 55,
    "mult": 1.0,
    # Output del calcolo (per convenzione):
    #   bb_plus  = SMA(close, length) + mult * std
    #   bb_minus = SMA(close, length) - mult * std
    #   bb_mid   = SMA(close, length)
    "outputs": ("bb_plus", "bb_minus", "bb_mid"),
}

ROC_PARAMS = {
    "length": 36,
    # Formula Pine-faithful:
    #   roc = (close - close.shift(length)) / close.shift(length) * 100
    "formula": "pct_change",
    "lookback": 36,
}

ATR_PARAMS = {
    "length": 16,
    # Wilder RMA (non SMA semplice) - usato per SL dinamico
    "method": "wilder_rma",
    # Charter: SL = entry_price * (1 + max(-sl_atr_mult * atr / entry_price, sl_clamp_min))
    "sl_atr_mult": 2.0,  # moltiplicatore ATR per il calcolo SL
    "sl_clamp_min": -0.03,  # SL non puo' essere piu' vicino del -3%
    "sl_clamp_max": -0.03,  # SL non puo' essere piu' lontano del -3% (Charter hard)
}

EMA50_PARAMS = {
    "span": 50,
    # Regime filter Pine-faithful:
    #   LONG: richiede close[-2] > EMA50[-2]
    #   SHORT: richiede close[-2] < EMA50[-2]
    "regime_filter_side": {
        "LONG": "above",  # close > EMA50
        "SHORT": "below",  # close < EMA50
    },
}

ADX_PARAMS = {
    "period": 14,
    # Regime filter Pine-faithful: ADX > 20 obbligatorio per entrare
    "min_threshold": 20.0,
    # Sotto 20 = no trend, mercato laterale, whipsaw risk
}


# =====================================================================
# Lookup helpers
# =====================================================================

ALL_PARAMS = {
    "BB": BB_PARAMS,
    "ROC": ROC_PARAMS,
    "ATR": ATR_PARAMS,
    "EMA50": EMA50_PARAMS,
    "ADX": ADX_PARAMS,
}


def get_indicator_params(name: str) -> dict:
    """Ritorna i parametri dell'indicatore dato il nome ('BB', 'ROC', ecc.)."""
    return ALL_PARAMS[name.upper()]
