#!/usr/bin/env python3
# Flask auth with HTTP '$ pip install flask_httpauth'
# For https '$ pip install Flask-SSLify'

from flask import Flask, jsonify, make_response, request, url_for, abort
from flask_httpauth import HTTPBasicAuth
from json import loads, dumps

from werkzeug.security import generate_password_hash, \
	check_password_hash

from diskusage import diskUsage
from uptime import timeSinceBoot

app = Flask(__name__, static_url_path = "")
auth = HTTPBasicAuth()

# Hardcoded users, the password is hashed with salt used by wekzeug
users = {
	"kevin": "9f6c79bbb3b8bbc4e6aab32314afaf3c812df66b",
	"apollo": "BerryTree",
	"test": "test"
}

# Flask function for checking password sent with http request
# @auth.verify_password
# def verify_password(email, password):
#     return verifyHash(password)

# # Costum function for hashing and verifying the sent password.
# # TODO Read if ok to send in cleartext like this if use https
# def verifyHash(pw):
# 	pw_hash = generate_password_hash(pw)
# 	return check_password_hash(pw_hash, pw)

# Flask function for getting password matching username sent by http request
@auth.get_password
def get_pw(username):
    if username in users:
        return users.get(username)
    return None

# Flasks own error handler that makes and returns error 401 if creds
# to not match.
@auth.error_handler
def unauthorized():
	return make_response(jsonify({'error': 'Unauthorized access'}), 401)

# This would be replaced with a database, but single process and thread
# can use local data like this for simplicity.


# Want all return data to be JSON so create custom error response
@app.errorhandler(404)
def not_found(error):
	return make_response(jsonify({'error': 'Not found'}), 404)
@app.errorhandler(400)
def bad_request(error):
	return make_response(jsonify({'error': 'Bad request'}), 400)


# --- Apollo Activity --- #

@app.route('/api/v1/disks', methods=['GET'])
@auth.login_required
def get_diskUsage():
	try:
		returningDiskUsage = diskUsage(request.args.get('dir'))
		return jsonify(returningDiskUsage)
	except:
		abort(404)


@app.route('/api/v1/uptimes', methods=['GET'])
@auth.login_required
def get_uptimes():
	try:
		return jsonify({ 'uptime': timeSinceBoot() })
	except:
		abort(404)


@app.route('/api/v1/uptimes/duration', methods=['GET'])
@auth.login_required
def get_uptimesDuration():
	up = uptime.uptime()
	return jsonify( {'Duration': up.duration} )

@app.route('/api/v1/uptimes/users', methods=['GET'])
@auth.login_required
def get_uptimesUsers():
	up = uptime.uptime()
	return jsonify( {'Users': up.users} )

@app.route('/api/v1/uptimes/load', methods=['GET'])
@auth.login_required
def get_uptimesLoad():
	up = uptime.uptime()
	return jsonify( {'Load': up.load} )



if __name__ == '__main__':
	app.run(host='0.0.0.0', port=63588)
