# src/monitoring/monitor.py
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from pathlib import Path
from sklearn.metrics import roc_auc_score

from config import MONITOR_CSV, PLOTS_DIR, PATIENCE, DEFAULT_PROB_THRESHOLD, DEFAULT_RR_RATIO
from src.data.loader import fetch_ohlcv
from src.data.features import engineer_features


def monitor_summary() -> None:
    """Вывод агрегированной статистики."""
    if not os.path.exists(MONITOR_CSV):
        print("Файл мониторинга не найден.")
        return

    mon = pd.read_csv(MONITOR_CSV)
    resolved = mon[mon['status'] == 'RESOLVED'].dropna(subset=['actual_outcome'])
    print(f"\n📈 ОНЛАЙН МОНИТОРИНГ | Всего прогнозов: {len(mon)} | Разрешено: {len(resolved)}")

    if resolved.empty:
        print("Нет разрешённых сделок для оценки.")
        return

    mask = ~np.isnan(resolved['actual_outcome'])
    preds = resolved['predicted_prob'][mask].values
    labels = resolved['actual_outcome'][mask].values

    if len(set(labels)) > 1:
        auc = roc_auc_score(labels, preds)
        print(f"Rolling AUC   : {auc:.3f}")
    else:
        print("Rolling AUC   : N/A (один класс)")

    win_rate = np.mean((preds >= DEFAULT_PROB_THRESHOLD) == (labels == 1.0))
    print(f"Win Rate @ {DEFAULT_PROB_THRESHOLD:.2f}: {win_rate:.1%}")
    # Additional metrics if present in CSV
    if 'val_loss' in resolved.columns:
        mean_val = resolved['val_loss'].mean()
        print(f"Mean Val Loss: {mean_val:.4f}")
    if 'AUC' in resolved.columns:
        mean_auc = resolved['AUC'].mean()
        print(f"Mean AUC: {mean_auc:.4f}")
    # Training patience config
    print(f"Training patience config: {PATIENCE}")


def visualize(instrument: str, timeframe: str) -> None:
    """Graphs of indicator distributions."""
    df = fetch_ohlcv(instrument, timeframe)

    df = engineer_features(df, window=20, rr_ratio=DEFAULT_RR_RATIO)

    Path(PLOTS_DIR).mkdir(exist_ok=True)
    fig, axes = plt.subplots(2, 2, figsize=(12, 8))
    cols = ['Ret_1', 'Vol_Ratio', 'ADX_14', 'BB_Width']

    for ax, col in zip(axes.flatten(), cols):
        if col in df.columns:
            sns.kdeplot(df[col].dropna(), ax=ax, fill=True, alpha=0.6)
            ax.set_title(f"Распределение: {col}")
            ax.axvline(0, color='gray', linestyle='--', linewidth=0.8)
    plt.tight_layout()
    out_path = f"{PLOTS_DIR}/{instrument}_{timeframe}_regime.png"
    plt.savefig(out_path, dpi=150)
    plt.close('all')
    print(f"📊 Графики сохранены: {out_path}")
