"""
Config centralizzata per il webhook VPTR3 (TradingView → Bybit demo).

VPTR3 (Pine Script su TradingView) e Rettangolo (Python locale) sono 2 FLUSSI
SEPARATI. Questo modulo contiene SOLO i parametri del webhook Pine VPTR3,
NON condivisi con rettangolo_config.

Vincoli architetturali:
  - TradingView VPTR3 → webhook_receiver.py → Bybit
  - Rettangolo Python → motore Rettangolo → Bybit
  - ZERO contaminazione tra i 2 flussi

Parametri MANIFESTO (16/07/2026):
  - ZEC 4H mask 10001011: 500 USD margin, leva 3x = 1500 USD nozionale
  - AERO 4H mask 01010101: 250 USD margin, leva 3x = 750 USD nozionale
  - DASH 4H mask 10000111: 250 USD margin, leva 3x = 750 USD nozionale
  - PYTH 3H × 3 mask: 500 USD margin, leva 3x = 1500 USD nozionale

Per semplicità MANIFESTO_ORDER_VALUE_USD è 500 (il massimo per singolo ordine).
Avere 500 è il CAP: ordini più grandi vengono troncati a 500 USD margin.
"""
import logging
import sys

# === MANIFESTO VPTR3 (costanti nominate) ===
MANIFESTO_ORDER_VALUE_USD = 500.0   # USD margin massimo per ordine (nozionale = 500 * leva)
MANIFESTO_MAX_OPEN_POSITIONS = 5     # Safety cap globale (era 3 regola base, 5 deroga Mattia)
MANIFESTO_LEVERAGE = 3               # Leva fissa per tutti gli asset Charter
MANIFESTO_STRATEGY_NAME = "VPTR3"    # Identificativo strategia (per logging/CSV)

# === Logging standard (per log_config) ===
logging.basicConfig(
    level=logging.INFO,
    format="[%(asctime)s] [%(levelname)s] %(name)s: %(message)s",
    datefmt="%Y-%m-%dT%H:%M:%S%z",
    stream=sys.stdout,
)
_log = logging.getLogger("webhook_config")


def validate_config():
    """Validazione early-exit all'avvio. Crash con AssertionError se parametri invalidi,
    così si evita casino silenzioso a mercato aperto."""
    assert MANIFESTO_ORDER_VALUE_USD > 0, (
        f"MANIFESTO_ORDER_VALUE_USD deve essere > 0, got {MANIFESTO_ORDER_VALUE_USD}"
    )
    assert MANIFESTO_MAX_OPEN_POSITIONS > 0, (
        f"MANIFESTO_MAX_OPEN_POSITIONS deve essere > 0, got {MANIFESTO_MAX_OPEN_POSITIONS}"
    )
    assert 1 <= MANIFESTO_LEVERAGE <= 100, (
        f"MANIFESTO_LEVERAGE deve essere 1..100, got {MANIFESTO_LEVERAGE}"
    )
    assert isinstance(MANIFESTO_STRATEGY_NAME, str) and MANIFESTO_STRATEGY_NAME, (
        "MANIFESTO_STRATEGY_NAME deve essere una stringa non vuota"
    )


def log_config():
    """Log esplicito delle costanti all'avvio, così dai log sai subito con che config è partito."""
    _log.info(
        "webhook_config: strategy=%s leverage=%s order_value_usd=%s max_positions=%s",
        MANIFESTO_STRATEGY_NAME,
        MANIFESTO_LEVERAGE,
        MANIFESTO_ORDER_VALUE_USD,
        MANIFESTO_MAX_OPEN_POSITIONS,
    )


def max_qty_for_order_value(current_price):
    """Calcola la qty massima che mantiene l'order value entro MANIFESTO_ORDER_VALUE_USD.
    Return float. NON side-specific (LONG e SHORT usano la stessa size).

    Esempio: MANIFESTO_ORDER_VALUE_USD=500, price=555.4 (ZEC) -> qty=0.9 (= 500/555.4)
    Con leva 3x Bybit: nozionale = 0.9*555.4 = 500 USD, margin = 500/3 = ~167 USD.
    """
    if not current_price or current_price <= 0:
        return 0.0
    return MANIFESTO_ORDER_VALUE_USD / float(current_price)


# Validazione import-time: crash SUBITO se parametri invalidi (prima di accettare webhook)
validate_config()
