"""
charter_config
==============

Configurazione Charter centralizzata per il Trading Engine AI.

Contiene:
  - SETUPS: dict per-setup live (mask CD, size, leva, TP/SL, max_bars)
  - CHARTER: dict backtest (commission_pct Pine IMPLICITA 0.06%, slippage)
  - GLOBAL_CONSTANTS: costanti condivise (MAX_OPEN_TRADES, ENV_FILE, ecc.)
  - CLOSING_HOURS: schedule loop 4H [2,6,10,14,18,22] Europe/Rome
  - Helper: get_setup(name), get_charter()

FONTE DI VERITA' UNICA per il Charter. Qualsiasi modifica ai parametri
qui si propaga ai 3 sub-repo della famiglia (mavis, solver, verifier)
via import.

Documentazione completa: AGENTS.md (root workspace) + charter_core/AGENTS.md
"""

from pathlib import Path

# =====================================================================
# SETUPS per live (3 asset Charter primari: ZEC, AERO, DASH)
# Fonte originale: live_engine.py righe 59-93
# =====================================================================

SETUPS = [
    {
        "name": "ZEC_4H",
        "symbol_bybit": "ZECUSDT",
        "symbol_ccxt": "ZEC/USDT:USDT",
        "tf": "4h",
        "interval": 240,
        # 8-bit mask CD (bit LSB-first: 0=CLL, 1=CLS, 2=CSL, 3=CSS,
        # 4=DLL, 5=DLS, 6=DSL, 7=DSS). "10001011" attiva CLL+CLS+CSS+DSS.
        "mask": "10001011",
        # Indicatori (override per-setup se necessario)
        "bb_length": 55,
        "bb_mult": 1.0,
        "roc_length": 36,
        "atr_length": 16,
        # Position sizing
        "margin_usdt": 500.0,
        # TP/SL Charter (50/50 split)
        "tp1_pct": 0.03,
        "tp2_pct": 0.05,
        "sl_atr_mult": 2.0,
        "sl_clamp_min": -0.03,
        "sl_clamp_max": -0.03,
        "trailing_stop_pct": 0.0,  # 0 = no trailing
        # Time stop
        "max_bars": 5,
        "min_bars_between": 4,
        # Charter
        "leverage": 3,
        "is_primary": True,  # Charter primary: AI Enhancer NON riduce size
    },
    {
        "name": "AERO_4H",
        "symbol_bybit": "AEROUSDT",
        "symbol_ccxt": "AERO/USDT:USDT",
        "tf": "4h",
        "interval": 240,
        "mask": "01010101",
        "bb_length": 55,
        "bb_mult": 1.0,
        "roc_length": 36,
        "atr_length": 16,
        "margin_usdt": 250.0,
        "tp1_pct": 0.03,
        "tp2_pct": 0.05,
        "sl_atr_mult": 2.0,
        "sl_clamp_min": -0.03,
        "sl_clamp_max": -0.03,
        "trailing_stop_pct": 0.0,
        "max_bars": 5,
        "min_bars_between": 4,
        "leverage": 3,
        "is_primary": True,
    },
    {
        "name": "DASH_4H",
        "symbol_bybit": "DASHUSDT",
        "symbol_ccxt": "DASH/USDT:USDT",
        "tf": "4h",
        "interval": 240,
        "mask": "10000111",
        "bb_length": 55,
        "bb_mult": 1.0,
        "roc_length": 36,
        "atr_length": 16,
        "margin_usdt": 250.0,
        "tp1_pct": 0.03,
        "tp2_pct": 0.05,
        "sl_atr_mult": 2.0,
        "sl_clamp_min": -0.03,
        "sl_clamp_max": -0.03,
        "trailing_stop_pct": 0.0,
        "max_bars": 5,
        "min_bars_between": 4,
        "leverage": 3,
        "is_primary": True,
    },
]

# Indici di lookup rapidi
SETUPS_BY_NAME = {s["name"]: s for s in SETUPS}
SETUPS_BY_SYMBOL = {s["symbol_bybit"]: s for s in SETUPS}


def get_setup(name: str) -> dict:
    """Ritorna il dict SETUP per nome (es. 'ZEC_4H'). KeyError se non trovato."""
    return SETUPS_BY_NAME[name]


def get_setup_by_symbol(bybit_symbol: str) -> dict:
    """Ritorna il dict SETUP per simbolo Bybit (es. 'ZECUSDT'). KeyError se non trovato."""
    return SETUPS_BY_SYMBOL[bybit_symbol]


# =====================================================================
# CHARTER per backtest (parametri replicati su tutti i setup)
# Fonte originale: web_solver_v6.py CHARTER dict (righe 30-37)
# =====================================================================

CHARTER = {
    # Capitale
    "initial_capital": 3000.0,
    "margin_usdt": 500.0,
    # TP/SL (identici ai SETUPS, ma globali per il backtest)
    "tp1_pct": 0.03,
    "tp2_pct": 0.05,
    "sl_atr_mult": 2.0,
    "sl_clamp_min": -0.05,
    "sl_clamp_max": -0.03,
    # Fee Pine IMPLICITA (scoperta BUG_003 chiusura 16:20)
    # NB: NON 0.1% Bybit standard, NON 0.075% taker ridotto.
    # 0.0006 = 0.06% per lato (Pine Script replica Mattia)
    "commission_pct": 0.0006,
    "slippage_pct": 0.0005,
    # Time stop
    "max_bars": 5,
    # Indicatori
    "bb_length": 55,
    "bb_mult": 1.0,
    "roc_length": 36,
    "atr_length": 16,
    # NAIVE backtest override (per confronto con Charter-compliant)
    "naive_fee_pct": 0.0010,  # 0.1% Bybit std (worst case)
    "naive_max_exit": 3,
}


def get_charter() -> dict:
    """Ritorna il dict CHARTER (backtest)."""
    return CHARTER


# =====================================================================
# GLOBAL_CONSTANTS (costanti cross-cutting)
# Fonte originale: live_engine.py (varie posizioni)
# =====================================================================

# Deroga Mattia 12/07: MAX_OPEN_TRADES_PORTFOLIO da 3 (regola base) a 5 (per Charter)
MAX_OPEN_TRADES_PORTFOLIO = 5

# Schedule loop 4H in ora Europe/Rome (UTC+2 ora legale, UTC+1 ora solare)
# NB: in ora solare sarebbe [1,5,9,13,17,21]
CLOSING_HOURS = [2, 6, 10, 14, 18, 22]

# Path file runtime (risolti al momento dell'import, funzionano sia da
# workspace root che da sub-repo)
WORKSPACE_ROOT = Path(__file__).resolve().parent.parent
LIVE_DEPLOY_DIR = WORKSPACE_ROOT / "live_deploy"
MARKET_INTEL_DIR = WORKSPACE_ROOT / "market_intelligence"
WEB_SOLVER_DIR = WORKSPACE_ROOT / "web_solver"

# File persistenti
STATE_FILE_NAME = "state_live.json"
LOG_FILE_NAME = "trades_log_live.csv"
ENV_FILE_PATH = WORKSPACE_ROOT / "Bybit_new.env"  # API keys (escluso da git)
MIL_REPORT_PATH = MARKET_INTEL_DIR / "mil_report_latest.json"

# bybit_demo endpoint (custom REST client bypassa bug ccxt)
BYBIT_DEMO_BASE = "https://api-demo.bybit.com"
BYBIT_RECV_WINDOW = "5000"
BYBIT_API_VERSION = "v5"

GLOBAL_CONSTANTS = {
    "MAX_OPEN_TRADES_PORTFOLIO": MAX_OPEN_TRADES_PORTFOLIO,
    "CLOSING_HOURS": CLOSING_HOURS,
    "WORKSPACE_ROOT": WORKSPACE_ROOT,
    "LIVE_DEPLOY_DIR": LIVE_DEPLOY_DIR,
    "MARKET_INTEL_DIR": MARKET_INTEL_DIR,
    "WEB_SOLVER_DIR": WEB_SOLVER_DIR,
    "STATE_FILE_NAME": STATE_FILE_NAME,
    "LOG_FILE_NAME": LOG_FILE_NAME,
    "ENV_FILE_PATH": ENV_FILE_PATH,
    "MIL_REPORT_PATH": MIL_REPORT_PATH,
    "BYBIT_DEMO_BASE": BYBIT_DEMO_BASE,
    "BYBIT_RECV_WINDOW": BYBIT_RECV_WINDOW,
    "BYBIT_API_VERSION": BYBIT_API_VERSION,
}
