from io import StringIO

import numpy as np
from h5py import File
from keras.models import load_model as keras_load_model
from PIL import Image, ImageOps


def predict(image, model):
    # Create the array of the right shape to feed into the keras model
    # The 'length' or number of images you can put into the array is
    # determined by the first position in the shape tuple, in this case 1.
    data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
    # Replace this with the path to your image
    image = Image.open(image)
    # resize the image to a 224x224 with the same strategy as in TM2:
    # resizing the image to be at least 224x224 and then cropping from the center
    size = (224, 224)
    image = ImageOps.fit(image, size, Image.ANTIALIAS)

    # turn the image into a numpy array
    image_array = np.asarray(image)
    # Normalize the image
    normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1
    # Load the image into the array
    data[0] = normalized_image_array

    # run the inference
    prediction = model.predict(data)
    return prediction[0]


def read_labels(labels_file):
    labels = []
    lines = StringIO(labels_file.getvalue().decode()).readlines()
    for line in lines:
        _, *remaining = line.split()
        label = " ".join(remaining).strip()
        labels.append(label)
    return labels


def load_model(model_file):
    return keras_load_model(File(model_file))

[(13, 'numpy.ndarray', 'np.ndarray', True, 'import numpy as np\n'), (15, 'PIL.Image.open', 'Image.open', False, 'from PIL import Image, ImageOps\n'), (19, 'PIL.ImageOps.fit', 'ImageOps.fit', False, 'from PIL import Image, ImageOps\n'), (22, 'numpy.asarray', 'np.asarray', True, 'import numpy as np\n'), (44, 'h5py.File', 'File', False, 'from h5py import File\n')]