"""
Utility functions for safe Qt object access.

This module provides helper functions to safely access Qt objects that might
have been destroyed, preventing crashes and RuntimeError exceptions.
"""

try:
    from qgis.PyQt import sip
    SIP_AVAILABLE = True
except ImportError:
    try:
        from PyQt6 import sip
        SIP_AVAILABLE = True
    except ImportError:
        SIP_AVAILABLE = False


def is_qt_object_deleted(obj) -> bool:
    """
    Verifica se un oggetto Qt è stato distrutto.
    
    Args:
        obj: Oggetto Qt da verificare
        
    Returns:
        True se l'oggetto è None o è stato distrutto, False altrimenti
    """
    if obj is None:
        return True
    
    if not SIP_AVAILABLE:
        # Fallback: prova ad accedere a un attributo per vedere se genera RuntimeError
        try:
            _ = obj.__class__
            return False
        except RuntimeError:
            return True
    
    try:
        return sip.isdeleted(obj)
    except (RuntimeError, AttributeError, TypeError):
        return True


def safe_qt_access(obj, callback, default=None):
    """
    Esegue una callback su un oggetto Qt solo se esiste e non è stato distrutto.
    
    Args:
        obj: Oggetto Qt da accedere
        callback: Funzione da chiamare con obj come argomento
        default: Valore di ritorno se l'oggetto è distrutto o None
        
    Returns:
        Risultato della callback o default se l'oggetto non è accessibile
    """
    if is_qt_object_deleted(obj):
        return default
    
    try:
        return callback(obj)
    except (RuntimeError, AttributeError, TypeError):
        return default


def safe_disconnect_signal(signal, slot):
    """
    Disconnette un segnale da uno slot in modo sicuro.
    
    Args:
        signal: Il segnale da disconnettere
        slot: Lo slot da disconnettere
        
    Returns:
        True se la disconnessione è riuscita, False altrimenti
    """
    if signal is None or slot is None:
        return False
    
    try:
        signal.disconnect(slot)
        return True
    except (TypeError, RuntimeError):
        # Segnale non connesso o oggetto distrutto
        return False
