"""
Script para descargar los datos de HADACA3 Bootcamp.
Ejecutar: python download_data.py
"""
import os
import urllib.request
from pathlib import Path

BASE_URL = "http://epimed.univ-grenoble-alpes.fr/downloads/dmzfch/hadaca3_framework/data/"

# Crear carpetas
DATA_DIR = Path("data")
DATA_DIR.mkdir(exist_ok=True)

# Datasets disponibles
DATASETS = {
    "VITR": "invitro",
    "VIVO": "invivo",
    "SBN5": "insilicopseudobulk",
    "SDN5": "insilicodirichletNoDep",
    "SDN4": "insilicodirichletNoDep4CTsource",
    # "SDN6": "insilicodirichletNoDep6CTsource",
    # "SDE5": "insilicodirichletEMFA",
    # "SDEL": "insilicodirichletEMFAImmuneLowProp",
    # "SDC5": "insilicodirichletCopule",
}

def download_file(url: str, dest: Path):
    """Descarga un archivo si no existe."""
    if dest.exists():
        print(f"  [SKIP] {dest.name} ya existe")
        return
    print(f"  [DOWNLOADING] {dest.name}...")
    try:
        urllib.request.urlretrieve(url, dest)
        print(f"  [OK] {dest.name}")
    except Exception as e:
        print(f"  [ERROR] {dest.name}: {e}")

def main():
    print("=" * 60)
    print("HADACA3 Bootcamp - Descarga de Datos")
    print("=" * 60)
    
    # 1. Descargar referencia
    print("\n[1/3] Descargando archivo de referencia...")
    download_file(f"{BASE_URL}ref.h5", DATA_DIR / "ref.h5")
    
    # 2. Descargar mezclas (mixes) - Fase 1 (entrenamiento)
    print("\n[2/3] Descargando mezclas (mixes1_*)...")
    for short, full in DATASETS.items():
        filename = f"mixes1_{full}_pdac.h5"
        download_file(f"{BASE_URL}{filename}", DATA_DIR / filename)
    
    # 3. Descargar ground truth - Fase 1 (para validar)
    print("\n[3/3] Descargando ground truth (groundtruth1_*)...")
    for short, full in DATASETS.items():
        filename = f"groundtruth1_{full}_pdac.h5"
        download_file(f"{BASE_URL}{filename}", DATA_DIR / filename)
    
    print("\n" + "=" * 60)
    print("✅ Descarga completada. Archivos en:", DATA_DIR.absolute())
    print("=" * 60)
    
    # Mostrar lo descargado
    print("\nArchivos disponibles:")
    for f in sorted(DATA_DIR.iterdir()):
        size_mb = f.stat().st_size / (1024 * 1024)
        print(f"  - {f.name} ({size_mb:.1f} MB)")

if __name__ == "__main__":
    main()
