import numpy as np
from sklearn.neural_network import MLPRegressor
from sklearn.ensemble import RandomForestRegressor

class SurrogateHandler:
    def __init__(self, model_type='mlp'):
        self.model_type = model_type
        self.is_trained = False
        self.data_X = []
        self.data_Y = []
        
        # Model choice
        if model_type == 'mlp':
            self.model = MLPRegressor(hidden_layer_sizes=(100, 50), max_iter=500, random_state=42)
        elif model_type == 'rf':
            # RandomForest is generaly more robust "out of the box"
            self.model = RandomForestRegressor(n_estimators=100, random_state=42)
        else:
            raise ValueError("Model type must be 'mlp' or 'rf'")

    def add_data(self, x_matrix, f2_value):
        # Flattening the position matrix to a 1 dimension vector
        flat_x = np.array(x_matrix).flatten()
        self.data_X.append(flat_x)
        self.data_Y.append(f2_value)

    def train(self):
        if len(self.data_X) < 20: # No training if their is too few data
            return
        
        X = np.array(self.data_X)
        y = np.array(self.data_Y)
        self.model.fit(X, y)
        self.is_trained = True

    def predict(self, x_matrix):
        if not self.is_trained:
            return None
        flat_x = np.array(x_matrix).flatten().reshape(1, -1)
        return self.model.predict(flat_x)[0]
