import os

import numpy as np
from azureml.monitoring import ModelDataCollector
from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType
from inference_schema.schema_decorators import input_schema, output_schema
from sklearn.externals import joblib


def init():
    global model
    global inputs_dc
    inputs_dc = ModelDataCollector('elevation-regression-model.pkl', designation='inputs',
                                   feature_names=['latitude', 'longitude', 'temperature', 'windAngle', 'windSpeed'])
    # note here "elevation-regression-model.pkl" is the name of the model registered under
    # this is a different behavior than before when the code is run locally, even though the code is the same.
    # AZUREML_MODEL_DIR is an environment variable created during deployment.
    # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
    # For multiple models, it points to the folder containing all deployed models (./azureml-models)
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'elevation-regression-model.pkl')
    model = joblib.load(model_path)


input_sample = np.array([[30, -85, 21, 150, 6]])
output_sample = np.array([8.995])


@input_schema('data', NumpyParameterType(input_sample))
@output_schema(NumpyParameterType(output_sample))
def run(data):
    try:
        inputs_dc.collect(data)
        result = model.predict(data)
        # you can return any datatype as long as it is JSON-serializable
        return result.tolist()
    except Exception as e:
        error = str(e)
        return error
