import os
import sys

import numpy as np
import pandas as pd
import sklearn
from sklearn.datasets import load_iris
from sklearn.metrics import mean_absolute_error, median_absolute_error, r2_score
from sklearn.model_selection import train_test_split

file_path = os.path.abspath(__file__)
current_directory = os.path.dirname(file_path)
project_directory = os.path.dirname(current_directory)
sys.path.insert(0, project_directory)
from {{package_name}}.models import {{ project_name }}

######################################################################
# Load Data
######################################################################

# load data
iris = load_iris()
df = pd.concat(
    [
        pd.DataFrame(data=iris.data, columns=iris.feature_names),
        pd.DataFrame(data=iris.target, columns=['species'])
    ],
    axis=1
)

######################################################################
# Prepare Train/Test Dataset
######################################################################

# split train test, onehot encode, generate features and target
X = pd.concat(
    [
        df.drop(['species', 'sepal length (cm)'], axis=1),
        pd.get_dummies(df['species'])
    ],
    axis=1
)
y = df['sepal length (cm)']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=777)

######################################################################
# Train Model
######################################################################

# load model in training mode
model = {{ project_name }}()

# train model
model.fit_model(X_train, y_train)

######################################################################
# Validate Model
######################################################################

y_pred = model(X_test)
median_error = median_absolute_error(y_test, y_pred)
mean_error = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"{'r2:':<25} {r2}")
print(f"{'median absolute error:':<25} {median_error}")
print(f"{'mean absolute error:':<25} {mean_error}")

######################################################################
# Save Model
######################################################################

# save model
model_folder = os.path.join(
    os.path.dirname(
        os.path.dirname(
            os.path.realpath(__file__)
        )
    ),
    "saved_models"
)
model.save_model(os.path.join(model_folder, '{{ package_name }}'))
