"""
HADACA3 - Evaluación de Modelo Guardado
========================================
Evalúa un modelo previamente entrenado con el dataset actual.
Útil para comparar modelos con diferentes hiperparámetros.
"""
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1] / "src"))
sys.path.append(str(Path(__file__).resolve().parents[1]))


import time
import pickle
import numpy as np
import pandas as pd
from pathlib import Path

# Local imports
from data_loader import get_or_load_dataset, get_training_data
from xgb_deconvolution import XGBDeconvolutionModel, analyze_class_distribution


def evaluate_saved_model(
    model_path: Path,
    dataset=None,
    verbose: bool = True
):
    """
    Evalúa un modelo guardado contra el dataset actual.
    """
    start_time = time.time()
    
    print("=" * 60)
    print("📊 EVALUACIÓN DE MODELO GUARDADO")
    print("=" * 60)
    
    # Cargar modelo
    print(f"\n📂 Cargando modelo: {model_path.name}")
    with open(model_path, 'rb') as f:
        model = pickle.load(f)
    print(f"   ✓ Modelo cargado")
    print(f"   Tipos celulares: {model.cell_types}")
    print(f"   Features: {len(model.feature_names):,}")
    
    # Cargar dataset
    if dataset is None:
        dataset = get_or_load_dataset()
    
    # Combinar todos los datos
    all_rna = []
    all_met = []
    all_y = []
    
    for mix_name in dataset.mixes.keys():
        X_rna, X_met, y = get_training_data(dataset, mix_name)
        all_rna.append(X_rna)
        all_met.append(X_met)
        all_y.append(y)
    
    X_rna_all = pd.concat(all_rna, axis=0)
    X_met_all = pd.concat(all_met, axis=0)
    y_all = pd.concat(all_y, axis=0)
    
    print(f"\n📊 Dataset actual: {len(y_all)} muestras")
    print(f"   Mixes: {list(dataset.mixes.keys())}")
    
    # Análisis de distribución
    analyze_class_distribution(y_all, verbose=True)
    
    # Evaluar
    print("\n" + "=" * 60)
    print("🔍 EVALUACIÓN EN TODO EL DATASET")
    print("=" * 60)
    metrics = model.evaluate(X_rna_all, X_met_all, y_all, verbose=True)
    
    # Cross-validation
    print("\n" + "=" * 60)
    print("🔄 VALIDACIÓN CRUZADA (10 folds)")
    print("=" * 60)
    cv_results = model.cross_validate(X_rna_all, X_met_all, y_all, n_folds=10)
    
    # Tiempo
    elapsed = time.time() - start_time
    print(f"\n⏱️  Tiempo de evaluación: {elapsed:.2f}s")
    
    return model, metrics, cv_results


if __name__ == "__main__":
    import sys
    
    # Modelo por defecto o especificado por argumento
    if len(sys.argv) > 1:
        model_path = Path(sys.argv[1])
    else:
        model_path = Path(__file__).parent / "models" / "xgb_deconvolution_model1.pkl"
    
    if not model_path.exists():
        print(f"❌ Modelo no encontrado: {model_path}")
        sys.exit(1)
    
    model, metrics, cv_results = evaluate_saved_model(model_path)
