from sklearn.tree import _tree

def extract_single_rule(tree, feature_names, class_to_extract=1):
    """
    Extrahiert eine einzelne Regel aus einem Decision Tree für eine bestimmte Klasse.
    
    Parameters:
    -----------
    tree : DecisionTreeClassifier
        Der trainierte Entscheidungsbaum
    feature_names : list
        Liste der Feature-Namen
    class_to_extract : int, default=1
        Die Klasse, für die eine Regel extrahiert werden soll (0=≤50K, 1=>50K)
    
    Returns:
    --------
    rule : str
        Eine lesbare Regel als String
    """
    tree_ = tree.tree_
    
    # Funktion zum rekursiven Extrahieren einer Regel
    def tree_to_rule(node, depth, conditions):
        # Wenn wir einen Blattknoten erreicht haben
        if tree_.children_left[node] == _tree.TREE_LEAF:
            # Prüfe, ob dieser Blattknoten die gewünschte Klasse vorhersagt
            if np.argmax(tree_.value[node][0]) == class_to_extract:
                # Formatiere die Bedingungen als Regel
                if conditions:
                    rule = " UND ".join(conditions)
                    return rule
                else:
                    return "Keine Bedingungen (Wurzelklasse)"
            return None
            
        # Feature und Schwellenwert am aktuellen Knoten
        feature = feature_names[tree_.feature[node]]
        threshold = tree_.threshold[node]
        
        # Linkspfad (≤)
        left_conditions = conditions + [f"{feature} ≤ {threshold:.2f}"]
        left_rule = tree_to_rule(tree_.children_left[node], depth + 1, left_conditions)
        if left_rule is not None:
            return left_rule
            
        # Rechtspfad (>)
        right_conditions = conditions + [f"{feature} > {threshold:.2f}"]
        right_rule = tree_to_rule(tree_.children_right[node], depth + 1, right_conditions)
        if right_rule is not None:
            return right_rule
            
        # Keine passende Regel gefunden
        return None
    
    # Starte die Suche vom Wurzelknoten
    rule = tree_to_rule(0, 1, [])
    
    # Formatiere die Ausgabe
    class_name = "Einkommen > 50K" if class_to_extract == 1 else "Einkommen ≤ 50K"
    if rule:
        return f"WENN {rule} DANN {class_name}"
    else:
        return f"Keine Regel für {class_name} gefunden."

# Anwendung für die Extraktion einer Regel für hohes Einkommen (Klasse 1)
single_rule = extract_single_rule(surrogate_tree, X_train.columns.tolist(), class_to_extract=1)
print("Einzelne Regel aus dem Surrogate-Modell:")
print(single_rule)