from oxyapp import app
# Import de tous les modules utiles
import os
from datetime import timedelta
from flask import abort, session, request, render_template, url_for, redirect, Response, send_from_directory
from flask import flash
# Fonctions persos
from oxyapp.database import getLocalisation, confirm_user
from oxyapp.database import add_user, delete_user_from_db, list_users, list_patient
from oxyapp.bdd_login import *
from oxyapp.utils import localisationUser
from oxyapp.utils_link import generate_charts, generate_data_health

# Configure les variables globales - A SUPPRIMER RAPIDEMENT
app.TOWN = ""
app.COUNTRY = ""
app.NAMEMANAGE = ""
app.PRENOMMANAGE = ""
app.IDMANAGE = ""


# A chaque requête on set la session a 1min et on modifie la session
# Le test peut être effectué en attendant 1 min dans une page autre que index pour qu'elle soit expirée
@app.before_request
def refresh_session():
    session.modified = True
    app.permanent_session_lifetime = timedelta(minutes=1)


# Page index
@app.route("/")
@app.route("/index")
def index():
    # Si on est pas connecté alors on retourne vers login
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        # Si la session a expiré alors on retourne vers login avec un message
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        # Sinon on affiche la page index
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank'],
                            'town': app.TOWN}
            return render_template('index.html', **templateData, title='Index', sidebar=0)


# Page de chargement avant index
@app.route('/preloader')
def preloader():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            # On execute la requête pour localiser
            row = getLocalisation(session['ID'])
            # Si on trouve des valeurs alors
            if row:
                # Définition de lat et lon
                lat = row[0]
                lon = row[1]
                # Si lat et lon sont à 0 car l'application reçoit 0 données alors on affiche sans la ville
                if lat == 0 and lon == 0:
                    app.TOWN = "null"
                    return render_template('preloader.html', title='Preloader')
                # Sinon on continue de chercher la localisation
                else:
                    app.TOWN = localisationUser(lat, lon)
                    return render_template('preloader.html', title='Preloader')
            # Sinon on ne fait rien et on affiche le preloader
            else:
                return render_template('preloader.html', title='Preloader')


# Page profil utilisateur - A FAIRE A LA FIN
@app.route('/user_profil')
def user_profil():
    if not session.get('logged_in'):
        flash('Votre session a expirée', 'warning')
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank'],
                            'patient': "Josh", 'age': 18}
            return render_template('user/user_profil.html', **templateData, title='Profil')


# Page pour fréquence cardiaque
@app.route('/charts_coeur')
def charts_coeur():
    if not session.get('logged_in'):
        flash('Votre session a expirée', 'warning')
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('user/charts_coeur.html', **templateData, title='Graphique coeur', sidebar=1)


# Page pour taux oxygène
@app.route('/charts_oxy')
def charts_oxy():
    if not session.get('logged_in'):
        flash('Votre session a expirée', 'warning')
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('user/charts_oxy.html', **templateData, title='Graphique oxygène', sidebar=2)


# Page localisation - modifier pour que ce soit plus efficace
@app.route('/localisation')
def page_localisation():
    if not session.get('logged_in'):
        flash('Votre session a expirée', 'warning')
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            # On execute la requête
            row = getLocalisation(session['ID'])
            # Affection des variables sur lat et lon
            if row:
                lat = row[0]
                lon = row[1]
            else:
                lat = 0
                lon = 0
            # Si lat et lon sur 0 alors on en cherche pas sa localisation et on affiche la page
            if lat == 0 and lon == 0:
                templateData = {'town': app.TOWN, 'prenom': session['prenom'], 'nom': session['nom'],
                                'rank': session['rank']}
                return render_template('user/localisation.html', **templateData, title='Localisation', loc=1, sidebar=3)
            # Sinon on cherche sa localisation avec localisationUser
            else:
                app.TOWN = localisationUser(lat, lon)
                templateData = {'lat': lat, 'lon': lon, 'town': app.TOWN, 'prenom': session['prenom'],
                                'nom': session['nom'], 'rank': session['rank']}
                return render_template('user/localisation.html', **templateData, title='Localisation', loc=0, sidebar=3)


# Page monitoring pour médecins MED - PROCHAINE MAJ
@app.route('/monitoring')
def monitoring():
    if not session.get('logged_in'):
        flash('Votre session a expirée', 'warning')
        return redirect(url_for('login'))
    if session.get('rank') != 3 and session.get('rank') != 2:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('med/monitoring.html', **templateData, title='Mono-Monitoring', sidebar=4)


# Page monitoring pour médecins MED - PROCHAINE MAJ
@app.route('/multimonitoring')
def multimonitoring():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3 and session.get('rank') != 2:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('med/multimonitoring.html', **templateData, title='Multi-Monitoring', sidebar=12)


# Page table de tous les patients MED
@app.route('/patients')
def tables_patients():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3 and session.get('rank') != 2:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('med/tables_patients.html', **templateData, title='Table patients',
                                   accounts=list_patient(app.IDMANAGE), sidebar=5)


# Page pour modifier les différents utilisateurs ADMIN
@app.route('/utilisateurs')
def tables_admin():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('admin/tables_admin.html', **templateData, title='Table utilisateurs',
                                   accounts=list_users(), sidebar=8)


# Page manage utilisateur MED
@app.route('/user_manage')
def user_manage():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('admin/user_manage.html', **templateData, title='Gestion utilisateurs', sidebar=7)


# Page ajout utilisateur ADMIN
@app.route('/user_add')
def user_add():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3 and session.get('rank') != 2:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            if session.get('rank') == 2:
                templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
                return render_template('admin/user_add.html', **templateData, title='Ajout utilisateur', sidebar=9)
            else:
                templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
                return render_template('admin/user_add.html', **templateData, title='Ajout utilisateur', sidebar=6,
                                       admin_option=0)


# Page ajout utilisateur MED
@app.route('/user_delmed')
def user_delmed():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3 and session.get('rank') != 2:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('med/user_deletemed.html', **templateData, title='Suppression patients',
                                   accounts=list_patient(app.IDMANAGE), sidebar=10)


# Page suppression utilisateur ADMIN
@app.route('/user_del')
def user_del():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    if session.get('rank') != 3:
        abort(404)
    else:
        if session['prenom'] is None:
            flash('Votre session a expirée', 'warning')
            return redirect(url_for('login'))
        else:
            templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'rank': session['rank']}
            return render_template('admin/user_delete.html', **templateData, title='Suppression utilisateurs',
                                   accounts=list_users(), sidebar=11)


# Création données graphique au format json pour html
@app.route('/chart-data')
def chart_data():
    return Response(generate_charts(session['ID']), mimetype='text/event-stream')


# Création données pour la div index au format json pour html
@app.route('/data-health')
def data_health():
    return Response(generate_data_health(session['ID']), mimetype='text/event-stream')


# Fonction enregistrement des utilisateur ADMIN
@app.route('/user_addbdd', methods=['POST'])
def user_add_bdd():
    # On récupére les données POST
    POST_NAME = str(request.form['nom'])
    POST_PRENOM = str(request.form['prenom'])
    POST_NUMBER = str(request.form['number'])
    POST_PASSWORD = str(request.form['password'])
    POST_RANK = str(request.form['rank'])
    # On ajoute l'utilisateur grâce à add_user()
    result = add_user(POST_NAME, POST_PRENOM, POST_NUMBER, POST_PASSWORD, POST_RANK)
    # Si on réussi alors on affiche la page user_add avec un message succès
    if result:
        flash("L'utilisateur a été ajouté avec succès", 'success')
        return redirect(url_for('user_add'))
    # Sinon on affiche la page user_add avec un message erreur
    else:
        flash("L'utilisateur n'a pas pu être ajouté", 'danger')
        return redirect(url_for('user_add'))


# Fonction pour supprimer des utilisateurs dans la catégorie admin sur bdd ADMIN
@app.route('/user_deletebdd', methods=['POST'])
def user_delete_bdd():
    # On récupére les données POST
    POST_NAME = str(request.form['nom'])
    POST_PRENOM = str(request.form['prenom'])
    POST_ID = str(request.form['id'])
    # On vérifie que l'utilisateur existe
    result = confirm_user(POST_NAME, POST_PRENOM, POST_ID)
    # S'il existe alors ...
    if result:
        # On supprime l'utilisateur avec delete_user_from_db()
        delete_user_from_db(POST_ID)
        # On redirige vers user_del et on affiche message succès
        flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME + " a bien été supprimé", 'success')
        return redirect(url_for('user_del'))
    # Sinon on redirige vers user_del et on affiche message erreur
    else:
        flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME +
              " n'a pas été supprimé car les données ne correspondent pas ou n'existe pas", 'danger')
        return redirect(url_for('user_del'))


# Fonction pour supprimer des patients dans la catégorie médical sur bdd MED
@app.route('/user_deletemedbdd', methods=['POST'])
def user_deletemed_bdd():
    # On récupére les données POST
    POST_NAME = str(request.form['nom'])
    POST_PRENOM = str(request.form['prenom'])
    POST_ID = str(request.form['id'])
    # On vérifie que l'utilisateur existe
    result = confirm_user(POST_NAME, POST_PRENOM, POST_ID)
    # S'il existe alors ...
    if result:
        # On supprime l'utilisateur avec delete_user_from_db()
        delete_user_from_db(POST_ID)
        # On redirige vers user_del et on affiche message succès
        flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME + " a bien été supprimé", 'success')
        return redirect(url_for('user_delmed'))
    # Sinon on redirige vers user_del et on affiche message erreur
    else:
        flash("L'utilisateur " + POST_PRENOM + " " + POST_NAME +
              " n'a pas été supprimé car les données ne correspondent pas ou n'existe pas", 'danger')
        return redirect(url_for('user_delmed'))


# Fonction gestion accès utilisateur pour obtenir tableau des patients ADMIN - A MODIFIER VRAIMENT RAPIDEMENT
@app.route('/user_manageinput', methods=['POST'])
def user_manage_input():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            return render_template('auth/login.html')
        else:
            row = []
            app.NAMEMANAGE = str(request.form['nom'])
            app.PRENOMMANAGE = str(request.form['prenom'])
            # Requête SQL
            var = "SELECT id, nom, prenom, privilege FROM users WHERE nom = '" + app.NAMEMANAGE + "' AND prenom = '" \
                  + app.PRENOMMANAGE + "'"
            try:
                cur = bdd_login()
            except pymysql.Error as e:
                return abort(e)
            result = cur.execute(var)
            for row in cur:
                print(row)
            app.IDMANAGE = row[0]
            app.PRENOMMANAGE = row[2]
            app.NAMEMANAGE = row[1]
            RANK = row[3]
            cur.close()
            if RANK != 'proche':
                templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
                return render_template('admin/user_manage.html', **templateData, sidebar=7, usermanage_div=3)
            else:
                if result:
                    templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                    'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
                    return render_template('admin/user_manage.html', **templateData,
                                           accounts=list_patient(app.IDMANAGE), sidebar=7,
                                           datatable=1)
                else:
                    templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                    'prenom_user': app.PRENOMMANAGE, 'rank': session['rank']}
                    return render_template('admin/user_manage.html', **templateData,
                                           accounts=list_patient(app.IDMANAGE), sidebar=7,
                                           usermanage_div=2)


# Fonction pour gérer les accès de proches à patients ADMIN - A MODIFIER VRAIMENT RAPIDEMENT
@app.route('/user_manageaccount', methods=['POST'])
def user_manage_account():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    else:
        if session['prenom'] is None:
            return render_template('auth/login.html')
        else:
            POST_NAME = str(request.form['nom'])
            POST_PRENOM = str(request.form['prenom'])
            POST_ID = str(request.form['id'])
            # Requête SQL
            var = "SELECT id, nom, prenom FROM users WHERE nom = '" + POST_NAME + "' AND prenom = '" \
                  + POST_PRENOM + "' AND id = '" + POST_ID + "'"
            try:
                cur = bdd_login()
            except pymysql.Error as e:
                return abort(e)
            result = cur.execute(var)
            print(result)
            if result:
                if request.form['askDelete'] == "Oui":
                    var = "DELETE FROM `access` WHERE `access`.`UserAccess` = '" + str(
                        app.IDMANAGE) + "' AND `access`.`AccessedUser` = '" + str(POST_ID) + "'"
                    print(var)
                    result = cur.execute(var)
                    if result:
                        templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                        'prenom_user': app.PRENOMMANAGE,
                                        'rank': session['rank']}
                        return render_template('admin/user_manage.html', **templateData,
                                               accounts=list_patient(app.IDMANAGE),
                                               sidebar=7,
                                               usermanage_div=0)
                    else:
                        return 'error'
                else:
                    var = "INSERT INTO `access` (`ID`, `UserAccess`, `AccessedUser`) VALUES (NULL, '" + str(
                        app.IDMANAGE) + "', '" + str(POST_ID) + "');"
                    result = cur.execute(var)
                    if result:
                        templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                        'prenom_user': app.PRENOMMANAGE,
                                        'rank': session['rank']}
                        return render_template('admin/user_manage.html', **templateData,
                                               accounts=list_patient(app.IDMANAGE),
                                               sidebar=7,
                                               usermanage_div=0)
                    else:
                        return 'error'
            else:
                templateData = {'prenom': session['prenom'], 'nom': session['nom'], 'name_user': app.NAMEMANAGE,
                                'prenom_user': app.PRENOMMANAGE,
                                'rank': session['rank']}
                return render_template('admin/user_manage.html', **templateData, accounts=list_patient(app.IDMANAGE),
                                       sidebar=7,
                                       usermanage_div=2)


# Route pour ico qui génère une erreur - FIX mais régler erreur est mieux
@app.route('/favicon.ico')
def favicon():
    return send_from_directory(os.path.join(app.root_path, 'static/img'),
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')
