from flask import Flask, redirect, url_for, request, render_template, send_from_directory
import urllib.request
import numpy as np
from PIL import Image
import requests
from predict import predict_image, load_model_h5, get_class_names
import json, io ,gc, random
import sys, os, cv2
from flask_caching import Cache
from flask_cors import CORS
from authhelper import *
api = Flask(__name__)
api.debug = True
CORS(api)

import keras
import tensorflow as tf

#collected = gc.collect() 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
global graph, model 
graph = tf.get_default_graph()

def get_session_class():
    config = tf.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 0.6
    config.gpu_options.allow_growth = True
    return tf.Session(config=config)
    
keras.backend.tensorflow_backend.set_session(get_session_class())

model = load_model_h5('/var/www/models/model1/Concat_VGG16_64_100_0_224_adam_0.0001.h5')
class_names = get_class_names('/var/www/models/model1/class_names.csv')

api.route('/')
def start():
   return "Started"

@api.route('/healthcheck')
def ping():
   return "ping"

@api.route('/upload')
def upload():
   return '<!DOCTYPE html><html><body><form action="/api" method="post" enctype="multipart/form-data">Select image to upload:<input type="file" name="image" id="image"><input type="submit" value="Upload Image" name="submit"></form></body></html>'
   
@api.route('/echo', methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])
def api_echo():
    if request.method == 'GET':
        return "ECHO: GET\n"

    elif request.method == 'POST':
        return "ECHO: POST\n"

    elif request.method == 'PATCH':
        return "ECHO: PACTH\n"

    elif request.method == 'PUT':
        return "ECHO: PUT\n"

    elif request.method == 'DELETE':
        return "ECHO: DELETE"


@api.route('/api',  methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])
@checktoken
def predict():
    img = Image.open(request.files['image'].stream)
    img = img.convert('RGB')
    prediction = predict_image(model, class_names, img)
    return  json.dumps(prediction)

@api.route('/class')
def render():
    with graph.as_default():
        sess = tf.Session()
        if 'filename' in request.args:
            image_url = request.args.get('filename')
            '''
            user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'
            headers = {'User-Agent':user_agent,}
            request_image = urllib.request.Request(image_url,None,headers)
            response_data = urllib.request.urlopen(request_image)
            img = Image.open(response_data)
            '''
            response = requests.get(image_url, stream=True).raw
            image_data = np.asarray(bytearray(response.read()), dtype="uint8")
            img = cv2.imdecode(image_data, -1)
            img = img.convert('RGB')

            prediction = predict_image(model, class_names, img)
            return json.dumps(prediction)
        sess.close()
		
@api.route('/login', methods=['GET', 'POST'])
def login_user():
    auth = request.get_json()
    print(auth)
    return loginhelper(auth)
	

    
if __name__ == '__main__':
    api.run('0.0.0.0', os.environ.get('PORT', 5000),debug=True, use_reloader=True)
    