# -*- coding: utf-8 -*-
"""
Created on Thu Mar 19 00:36:17 2026

@author: scige
"""
import h5py
import numpy as np
from datetime import datetime

# Nome del file da creare
nome_file = "dati_scientifici.h5"

print(f"Creazione del file {nome_file}...")

# Apriamo il file in modalità scrittura ('w').
# L'uso di 'with' garantisce la chiusura corretta del file.
with h5py.File(nome_file, 'w') as f:
    
    # --- 1. METADATI GLOBALI (Attributi del file Root '/') ---
    f.attrs['descrizione'] = 'Esempio di dati scientifici strutturati'
    f.attrs['data_creazione'] = datetime.now().isoformat()
    f.attrs['autore'] = 'Corso Pratico Python'

    # --- 2. CREAZIONE DI GRUPPI (come cartelle) ---
    # Creiamo un gruppo per un ipotetico esperimento
    gruppo_exp1 = f.create_group('esperimento_alfa')
    
    # Aggiungiamo metadati al gruppo
    gruppo_exp1.attrs['luogo'] = 'Laboratorio Centrale'
    gruppo_exp1.attrs['responsabile'] = 'Dr. Rossi'

    # --- 3. CREAZIONE DI DATASET (i dati veri e propri) ---
    
    # Esempio A: Un dataset di numeri interi (es. ID sensori)
    dati_sensori_id = np.array([101, 102, 103, 104, 105])
    ds_id = gruppo_exp1.create_dataset('id_sensori', data=dati_sensori_id)
    # Aggiungiamo metadati specifici al dataset
    ds_id.attrs['unita'] = 'N/A (identificativi)'

    # Esempio B: Un dataset multidimensionale di numeri floating point
    # Simuliamo letture di temperatura (2D: 4 ore x 3 sensori)
    data_temp = np.array([
        [22.5, 22.7, 22.4],
        [23.0, 23.2, 22.9],
        [23.5, 23.8, 23.6],
        [22.8, 23.0, 22.7]
    ])
    # Creiamo il dataset nel gruppo, specificando il tipo di dato (float32)
    ds_temp = gruppo_exp1.create_dataset('temperature', data=data_temp, dtype='float32')
    
    # Aggiungiamo metadati vitali per l'interpretazione scientifica
    ds_temp.attrs['unita'] = 'Gradi Celsius'
    ds_temp.attrs['descrizione'] = 'Letture orarie da 3 sensori diversi'
    ds_temp.attrs['frequenza_campionamento'] = '1 ora'

    # Esempio C: Un dataset strutturato nidificato (un sottogruppo)
    sottogruppo_meteo = gruppo_exp1.create_group('meteo_ausiliario')
    umidita = np.array([60, 62, 65, 58])
    ds_umi = sottogruppo_meteo.create_dataset('umidita_relativa', data=umidita)
    ds_umi.attrs['unita'] = 'Percentuale'

print(f"File {nome_file} creato con successo!")
print("-" * 30)
print("Per verificare il contenuto, puoi usare questo script di lettura:")
print("-" * 30)

# --- BONUS: SCRIPT RAPIDO DI LETTURA ---
def leggi_file_hdf5(nome_file):
    print(f"\nLettura del file {nome_file}:")
    with h5py.File(nome_file, 'r') as f:
        # Leggi attributi globali
        print("\n--- Attributi Globali ---")
        for chiave, valore in f.attrs.items():
            print(f"  {chiave}: {valore}")

        # Funzione ricorsiva per esplorare la struttura
        def esplora(name, obj):
            livello = name.count('/')
            indentazione = "  " * livello
            tipo = "Gruppo" if isinstance(obj, h5py.Group) else "Dataset"
            
            print(f"\n{indentazione}[{tipo}] {name}")
            
            # Stampa attributi dell'oggetto (se presenti)
            if obj.attrs:
                print(f"{indentazione}  -> Metadati:")
                for chiave, valore in obj.attrs.items():
                    print(f"{indentazione}     - {chiave}: {valore}")
            
            # Se è un dataset, stampa la forma e il tipo
            if isinstance(obj, h5py.Dataset):
                print(f"{indentazione}  -> Shape: {obj.shape}, Tipo: {obj.dtype}")
                # Mostra i primi dati se non è troppo grande
                if obj.size < 20:
                    print(f"{indentazione}  -> Dati: {obj[:]}")

        # Avvia l'esplorazione ricorsiva
        f.visititems(esplora)

leggi_file_hdf5(nome_file)