# Complex demo: Handle errors in file ops for AI data, read/write CSV with try/except, preprocess, visualize
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

def advanced_error_handling_demo():
    # Generate Iris data with feature
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['Target'] = iris.target
    df['Feature_Engineered'] = df['petal length (cm)'] / (df['petal width (cm)'] + 1e-5)
    # Write to CSV with error handling
    try:
        df.to_csv('iris_data.csv', index=False)
    except PermissionError as e:
        print(f"Permission Error writing CSV: {e}")
        raise ValueError("Cannot write CSV due to permissions")
    except Exception as e:
        print(f"Error writing CSV: {e}")
        raise ValueError("CSV write failed")
    # Read CSV with error handling
    try:
        df_read = pd.read_csv('iris_data.csv')
    except FileNotFoundError:
        print("CSV file not found")
        raise FileNotFoundError("Missing iris_data.csv")
    except pd.errors.EmptyDataError:
        print("Empty CSV file")
        raise ValueError("CSV is empty")
    # Preprocess and visualize
    try:
        df_read = df_read.dropna()
        scaler = StandardScaler()
        X_scaled = scaler.fit_transform(df_read.drop('Target', axis=1))
        df_scaled = pd.DataFrame(X_scaled, columns=df_read.drop('Target', axis=1).columns)
        df_scaled['Target'] = df_read['Target']
        plt.scatter(df_scaled['petal length (cm)'], df_scaled['petal width (cm)'], c=df_scaled['Target'], cmap='viridis')
        plt.title('Preprocessed Iris Data from CSV')
        plt.xlabel('Scaled Petal Length')
        plt.ylabel('Scaled Petal Width')
        plt.annotate('Cluster Center', xy=(0, 0), xytext=(1, 1), arrowprops=dict(facecolor='black', shrink=0.05))
        plt.show()
    except Exception as e:
        print(f"Error in preprocessing/visualization: {e}")
        raise ValueError("Preprocessing failed")
    # Write preprocessed with error handling
    try:
        df_scaled.to_csv('preprocessed_iris.csv', index=False)
        print("Preprocessed data saved to 'preprocessed_iris.csv'")
    except Exception as e:
        print(f"Error writing preprocessed CSV: {e}")
        raise ValueError("Preprocessed CSV write failed")

advanced_error_handling_demo()