# -*- coding: utf-8 -*-
from flask import Flask, render_template, request
from gpiozero import LED, MotionSensor, Buzzer
from datetime import datetime
import MySQLdb
from threading import Thread
import sys
import RPi.GPIO as GPIO
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import logging
from picamera import PiCamera
import time
import os
from flask import Flask, Response, request, abort, render_template_string, send_from_directory, render_template
from PIL import Image
import StringIO

camera = PiCamera()

logging.basicConfig()

app = Flask(__name__)

host = "a2be3h2y6o06rl.iot.us-west-2.amazonaws.com"
rootCAPath = "rootca.pem"
certificatePath = "certificate.pem.crt"
privateKeyPath = "private.pem.key"

my_rpi = AWSIoTMQTTClient("baaijhjcPubSub")
my_rpi.configureEndpoint(host, 8883)
my_rpi.configureCredentials(rootCAPath, privateKeyPath, certificatePath)

my_rpi.configureOfflinePublishQueueing(-1)  # Infinite offline Publish queueing
my_rpi.configureDrainingFrequency(2)  # Draining: 2 Hz
my_rpi.configureConnectDisconnectTimeout(10)  # 10 sec
my_rpi.configureMQTTOperationTimeout(30)  # 30 sec

my_rpi.connect()

#pir = MotionSensor(26, threshold=0.8)
#bz = Buzzer(5)
#led = LED(18)
check = "0"
WIDTH = 1280
HEIGHT = 720

def rpi_func(method=""):
	if method == "selfPublish":
		print("[Flask] Publishing...")
		my_rpi.subscribe("sensors/rfid", 1, selfPublish)
		print("[Flask] Published state.")
	else:
		print("[Flask] Getting status from AWS...")
		my_rpi.subscribe("sensors/rfid", 1, getStatus)
	return True

def selfPublish(client, userdata, message):
	global check
	check = str(message.payload)
	print("[Flask] Status from AWS: " + check)
	if check == "1":
		check = "0"
		print("[Flask] Changing state to: " + check)
		my_rpi.publish("sensors/rfid", str(check), 1)
	else:
		check = "1"
		my_rpi.publish("sensors/rfid", str(check), 1)
	return True

def getStatus(client, userdata, message):
	global check
	check = str(message.payload)
	print("[Flask] Status from AWS: " + check)

@app.route("/", methods=["GET", "POST"])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] == "admin" and request.form['userpw']=="password":
            return render_template('home.html', route="/home", title="Smart Lock")
        else:
            error = 'Invalid username/password'

    return render_template('login.html', route="/", title="Login")

@app.route("/home", methods=["GET", "POST"])
def home():
	global check
	if request.method == "POST":
		timestring = time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime())
		camera.capture('/home/pi/Desktop/assignment/camera/cctv_'+timestring+'.jpg')
	return render_template('home.html', route="/home", title="Smart Lock")

@app.route("/history")
def history():
	motion_triggered_data = []
	query = "SELECT COUNT(datetime_value) Count, DATE(datetime_value) DateOnly FROM motion GROUP BY DateOnly"
	curs.execute(query)
	for (Count, DateOnly) in curs:
		d = []
		d.append(Count)
		d.append(DateOnly)
		motion_triggered_data.append(d)

	on_off_data = []
	query = "SELECT datetime_value, status FROM on_off LIMIT 10"
	curs.execute(query)
	for (datetime_value, status) in curs:
		d = []
		d.append(datetime_value)
		d.append(status)
		on_off_data.append(d)
	
	return render_template('history.html', route="/history", title="Door Lock", motion_triggered_data=motion_triggered_data, on_off_data=on_off_data)

@app.route('/<path:filename>')
def image(filename):
    try:
        w = int(request.args['w'])
        h = int(request.args['h'])
    except (KeyError, ValueError):
        return send_from_directory('.', filename)

    try:
        im = Image.open(filename)
        im.thumbnail((w, h), Image.ANTIALIAS)
        io = StringIO.StringIO()
        im.save(io, format='JPEG')
        return Response(io.getvalue(), mimetype='image/jpeg')

    except IOError:
        abort(404)

    return send_from_directory('.', filename)

@app.route('/capture')
def index():
    images = []
    for root, dirs, files in os.walk('.'):
        for filename in [os.path.join(root, name) for name in files]:
            if not filename.endswith('.jpg'):
                continue
            im = Image.open(filename)
            w, h = im.size
            aspect = 1.0*w/h
            if aspect > 1.0*WIDTH/HEIGHT:
                width = min(w, WIDTH)
                height = width/aspect
            else:
                height = min(h, HEIGHT)
                width = height*aspect
            images.append({
                'width': int(width),
                'height': int(height),
                'src': filename
            })

            templateData = {'images' : images}

    return render_template('capture.html', **templateData)

#======Start of Program==========#

try:
	db = MySQLdb.connect("localhost", "root", "dmitiot", "iotCAone")
	curs = db.cursor()
	print("Successfully connected to database!")

	#led_thread = LEDController()
	#led_thread.daemon = True
	#led_thread.start()
	#print("Started LED Controller")

	print("Running Flask server...")
	app.run(debug=False,host='0.0.0.0')
except KeyboardInterrupt, SystemExit:
	sys.exit()
	bz.off()
except MySQLdb.Error:
	print("Error connection to mySQL database")
finally:
	curs.close()
	db.close()