"""
Script para explorar la estructura de los datos HDF5 de HADACA3.
Ejecutar despues de download_data.py: python explore_data.py
"""
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 h5py
import numpy as np
import pandas as pd
from pathlib import Path

DATA_DIR = Path("data")

def explore_h5(filepath: Path):
    """Explora la estructura de un archivo HDF5."""
    print(f"\n{'='*60}")
    print(f"[FILE] {filepath.name}")
    print("="*60)
    
    with h5py.File(filepath, 'r') as f:
        def print_structure(name, obj):
            indent = "  " * name.count('/')
            if isinstance(obj, h5py.Dataset):
                print(f"{indent}[DATA] {name}: shape={obj.shape}, dtype={obj.dtype}")
            else:
                print(f"{indent}[DIR] {name}/")
        
        f.visititems(print_structure)
        
        # Mostrar las keys principales
        print(f"\nKeys principales: {list(f.keys())}")

def load_as_dataframe(filepath: Path, dataset_key: str) -> pd.DataFrame:
    """Carga un dataset HDF5 como DataFrame de pandas."""
    with h5py.File(filepath, 'r') as f:
        if dataset_key not in f:
            print(f"Key '{dataset_key}' no encontrada. Disponibles: {list(f.keys())}")
            return None
        
        data = f[dataset_key][:]
        
        # Intentar obtener row/column names si existen
        row_names = None
        col_names = None
        
        if f'{dataset_key}_rownames' in f:
            row_names = [x.decode() if isinstance(x, bytes) else x for x in f[f'{dataset_key}_rownames'][:]]
        if f'{dataset_key}_colnames' in f:
            col_names = [x.decode() if isinstance(x, bytes) else x for x in f[f'{dataset_key}_colnames'][:]]
        
        return pd.DataFrame(data, index=row_names, columns=col_names)

def main():
    print("HADACA3 - Exploración de Datos")
    
    # Verificar que existen datos
    if not DATA_DIR.exists():
        print("❌ Carpeta 'data' no encontrada. Ejecuta primero: python download_data.py")
        return
    
    h5_files = list(DATA_DIR.glob("*.h5"))
    if not h5_files:
        print("❌ No hay archivos .h5 en 'data'. Ejecuta primero: python download_data.py")
        return
    
    # Explorar cada archivo
    for h5_file in sorted(h5_files)[:3]:  # Limitar a 3 para no saturar
        explore_h5(h5_file)
    
    # Ejemplo de carga como DataFrame
    print("\n" + "="*60)
    print("[EXAMPLE] Cargando ref.h5 como DataFrame")
    print("="*60)
    
    ref_path = DATA_DIR / "ref.h5"
    if ref_path.exists():
        with h5py.File(ref_path, 'r') as f:
            print(f"Estructura de ref.h5: {list(f.keys())}")
            
            # Intenta cargar el primer dataset disponible
            for key in f.keys():
                if isinstance(f[key], h5py.Dataset):
                    arr = f[key][:]
                    print(f"\n'{key}': shape = {arr.shape}")
                    print(f"  Primeras 5 filas x 5 cols:\n{arr[:5, :5]}")
                    break

if __name__ == "__main__":
    main()
