import sys
import logging
from datetime import datetime, timedelta

# =================================================================
# 1. CONFIGURAZIONE LOGGING (Il "log4python")
# =================================================================
# Configuriamo un logger che scrive sia su file che su stderr
logger = logging.getLogger("DemoI_O")
logger.setLevel(logging.DEBUG)

# Handler per file (scrive tutto il dettaglio)
f_handler = logging.FileHandler("esecuzione.log", mode="w", encoding="utf-8")
f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
f_handler.setFormatter(f_format)
logger.addHandler(f_handler)

# Handler per stderr (mostra solo avvisi importanti in console)
c_handler = logging.StreamHandler(sys.stderr)
c_handler.setLevel(logging.WARNING)
logger.addHandler(c_handler)

# =================================================================
# 2. I/O BINARIO E STANDARD STREAMS (4.1.1 / 5.6)
# =================================================================
def demo_io_base():
    logger.info("Inizio demo I/O Base")
    
    # Esempio dati binari (b'') ed Esadecimali (hex)
    dati_binari = b'\x48\x65\x6c\x6c\x6f\xff' # "Hello" + un byte 255
    print(f"Dati Binari Raw: {dati_binari}")
    print(f"Rappresentazione Hex: {dati_binari.hex()}")

    # Uso avanzato di print (sep, end, file)
    with open("output_test.txt", "w", encoding="utf-8") as f:
        print("Valore1", "Valore2", "Valore3", sep=" | ", end=" [EOF]\n", file=f)
    
    logger.info("Scrittura file completata con successo")

# =================================================================
# 3. FORMATTING (4.1.2)
# =================================================================
def demo_formatting():
    nome = "Python User"
    versione = 3.12
    prezzo = 150.756
    
    # F-Strings: il modo moderno e potente
    messaggio = f"Utente: {nome} | Versione: {versione:.1f} | Prezzo: {prezzo:,.2f}€"
    print("\n--- Formattazione ---")
    print(messaggio)
    
    # Esempio di allineamento
    print(f"{'ID':<5} | {'Stato':^10} | {'Progress':>8}")
    print(f"{1:0>5} | {'ATTIVO':^10} | {75.5}%")

# =================================================================
# 4. DATE TIME (4.1.3)
# =================================================================
def demo_datetime():
    print("\n--- Gestione Tempo ---")
    adesso = datetime.now()
    
    # Formattazione (strftime)
    print(f"Data corrente: {adesso.strftime('%d/%m/%Y %H:%M:%S')}")
    
    # Calcolo intervalli (timedelta)
    ieri = adesso - timedelta(days=1)
    print(f"Ieri a quest'ora: {ieri.strftime('%A, %d %B %Y')}")
    
    # Parsing da stringa (strptime)
    scadenza_str = "2026-12-25"
    scadenza_obj = datetime.strptime(scadenza_str, "%Y-%m-%d")
    print(f"Giorni a Natale 2026: {(scadenza_obj - adesso).days}")

# =================================================================
# 5. LETTURA DA STDIN
# =================================================================
def demo_stdin():
    print("\n--- Input Standard (Premi Invio per continuare o scrivi qualcosa) ---")
    # Leggiamo da stdin senza usare input() per mostrare sys
    linea = sys.stdin.readline()
    if not linea.strip():
        logger.warning("L'utente ha inviato una riga vuota")
    else:
        print(f"Hai scritto: {linea.upper()}")

# =================================================================
# ESECUZIONE PRINCIPALE
# =================================================================
if __name__ == "__main__":
    try:
        demo_io_base()
        demo_formatting()
        demo_datetime()
        demo_stdin()
        
        # Esempio di log di errore
        print("\nSimulazione errore nel log...")
        1 / 0
    except ZeroDivisionError:
        logger.error("Errore matematico rilevato!", exc_info=True)
    finally:
        print("\nEsecuzione terminata. Controlla 'esecuzione.log' e 'output_test.txt'.")
        