#!/usr/bin/env python3
"""
live_scan_config.py

Lädt und verwaltet die Konfiguration für das
"Kleine Elite Trading – Live-Scan v1" System.

- Pfad:   /kleiner/backend/live_scan/live_scan_config.py
- Config: /kleiner/data/live_scan/live_scan_config.json

Beim ersten Aufruf wird eine Default-Konfiguration geschrieben,
falls noch keine JSON-Datei existiert.
"""

from __future__ import annotations

import json
import logging
from pathlib import Path
from typing import Any, Dict

logger = logging.getLogger(__name__)

# ROOT zeigt auf das Projekt-Root /kleiner/
ROOT = Path(__file__).resolve().parents[2]
CONFIG_DIR = ROOT / "data" / "live_scan"
CONFIG_PATH = CONFIG_DIR / "live_scan_config.json"


# Default-Konfiguration gemäss Pflichtenheft v1
DEFAULT_CONFIG: Dict[str, Any] = {
    "version": "1.0",
    "description": "Konfiguration für Live-Scan v1 (Daytrading-Signale, 20 Ticker).",
    "score": {
        # 6.2 Score-Schwellen
        "min_signal": 85.0,     # Mindestscore für ein Signal
        "min_premium": 93.0,    # Schwelle für A+-Signal
    },
    "filters": {
        # 4.1 Kursbereich
        "price_min": 5.0,
        "price_max": 500.0,
        # 4.2 Liquidität
        "avg_volume_min": 1_000_000,  # AvgVol20 >= 1 Mio
        "rvol_min": 1.3,              # RVOL >= 1.3
        # 4.3 Volatilität (ATR%)
        "atr_percent_min": 2.0,
        "atr_percent_max": 8.0,
        # 4.6 Datenqualität: Pflichtfilter
        "require_clean_data": True,
        # 4.5 Gaps – v1 aktiv, Details in Scoring/Setups
        "allow_gaps": True,
        # optional: harte Gap-Grenzen (werden v1 nur vorbereitet)
        "gap_hard_limit_pct": 15.0,
        "gap_defensive_limit_pct": 10.0,
    },
    "crv": {
        # 6.3 CRV (TP1)
        "min_tp1": 1.5,  # Kein Signal, wenn CRV(TP1) < 1.5
    },
    "timing": {
        # 3.2 Handelszeiten / Zeitfenster
        "min_minutes_after_open": 5,     # keine Signale in ersten 5 Min
        "min_minutes_before_close": 30,  # keine neuen Signale in letzter halben Stunde
        "warning_minutes_to_close": 60,  # Hinweis "Markt schliesst in X Min" bei <= 60 Min
        # 7.3 Entry-Gültigkeit (Variante B – empfohlen 45 Min)
        "entry_valid_minutes": 45,
    },
    "limits": {
        # 7.4 Cooldown pro Ticker
        "cooldown_minutes_per_ticker": 30,
        # 7.5 Signal-Limitierung pro Run
        "per_run_max_long": 3,
        "per_run_max_short": 3,
        # 7.5 Signal-Limitierung pro Tag (Soft-Limit)
        "per_day_soft_limit": 20,
    },
}


def load_config() -> Dict[str, Any]:
    """
    Lädt die Live-Scan-Konfiguration aus JSON.

    - Existiert die Datei nicht, wird sie mit DEFAULT_CONFIG erzeugt.
    - Bei defekter JSON wird ein Fallback auf DEFAULT_CONFIG verwendet
      (und im Log vermerkt).
    """
    CONFIG_DIR.mkdir(parents=True, exist_ok=True)

    if not CONFIG_PATH.exists():
        try:
            CONFIG_PATH.write_text(
                json.dumps(DEFAULT_CONFIG, indent=2),
                encoding="utf-8",
            )
            logger.info("Live-Scan-Config nicht gefunden – Default-Konfiguration erstellt: %s", CONFIG_PATH)
        except Exception:
            # Falls Schreiben fehlschlägt, trotzdem mit Defaults weiterarbeiten
            logger.exception("Konnte Default-Config nicht schreiben, verwende In-Memory-Defaults.")
            return DEFAULT_CONFIG.copy()

    try:
        raw = CONFIG_PATH.read_text(encoding="utf-8")
        data = json.loads(raw)
    except Exception:
        logger.exception("Fehler beim Lesen/Parsen der Live-Scan-Config, verwende Defaults.")
        return DEFAULT_CONFIG.copy()

    # Einfache Versionierung/Backwards-Compatibility-Hook
    if "version" not in data:
        data["version"] = DEFAULT_CONFIG["version"]

    return data  # type: ignore[return-value]


if __name__ == "__main__":
    # Kleiner Selbsttest beim direkten Aufruf
    logging.basicConfig(level=logging.INFO, format="[%(asctime)s] %(levelname)s %(name)s: %(message)s")
    cfg = load_config()
    print(json.dumps(cfg, indent=2))
