import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense

# 1. LOAD DATASET

df = pd.read_csv("StudentPerformanceFactors.csv")

print(df.head())
print("Missing Values:\n", df.isnull().sum())

# CREATE PASS/FAIL TARGET
# 0 = Fail, 1 = Pass (70 is our example cutoff)

df["Pass"] = (df["Exam_Score"] >= 70).astype(int)

print("Pass/Fail Distribution:\n", df["Pass"].value_counts())

# 2. SELECT FEATURES AND ENCODE

features = ["Hours_Studied", "Attendance",
            "Previous_Scores", "Motivation_Level"]

df = df.dropna(subset=features + ["Exam_Score"])

X = df[features]
y = df["Pass"]

X = pd.get_dummies(X, dtype=int)

# 3. TRAIN-TEST SPLIT

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 4. STANDARDIZATION

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 5. BUILD ANN

model = Sequential([
    Input(shape=(X_train.shape[1],)),
    Dense(16, activation="relu"),
    Dense(8, activation="relu"),
    Dense(1, activation="sigmoid")
])

model.compile(optimizer="adam",
              loss="binary_crossentropy",
              metrics=["accuracy"])

model.fit(X_train, y_train, epochs=20, batch_size=32)

# 6. PREDICT AND EVALUATE

y_pred = (model.predict(X_test) > 0.5).astype(int).ravel()

print("Accuracy:", accuracy_score(y_test, y_pred))
print("Precision:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
