
# !page: admin_register
# !latest updated: 09Jul2021

from flask import Flask, render_template, request, session, redirect, url_for, flash, Blueprint, jsonify
from functions.form_validation_functions import emailExistReverseValidation, emailExistValidation
from functions.mail_functions import otpMail
from modules.database_modules import db_connect
import secrets
from functions.date_time_functions import upload_time
from functions.code_generat_functions import otpGenerate
from passlib.hash import pbkdf2_sha256  # for password encrytipn


# ? export blueprint section #################################################################################################################################

user_login_email = Blueprint("user_login_register", __name__, static_folder="static",
                             template_folder="templates")

# ! Data base connection ######################################################################################################################
# * Copy the following three lines into all of the database connection required py files


# * function section #########################################################################################################################################


# * route section *******************************************************************************************************************************************
@user_login_email.route("/", methods=['POST'])
def emailRegister():
    header = request.headers
    authKey = header.get('Authorization')
    serverAuth = '88d464b2c2f13bcd7d1d648126e0e8aa5abeb5b1a209639f4e53d994696a422587b403fd69e1baa27b21deb03c2020fd3303e5cdc3ded8e0bc686b5dbbcd37ae'
    if request.method == 'POST' and authKey == serverAuth:
        con = db_connect()
        cur = con.cursor()
        email = request.form['email']
        password = request.form['password']

        emailValidate = emailExistReverseValidation(email)

        if emailValidate == True:
            cur.execute(
                'select password from user_account where email=%s', (email,))
            ePassword = cur.fetchone()[0]
            if pbkdf2_sha256.verify(password, ePassword):
                cur.execute(
                    'select id from user_account where email=%s', (email,))
                userID = cur.fetchone()
                if userID != None:
                    cur.execute(
                        'select id, type from user_otp where user_id=%s', (userID[0],))
                    otpExist = cur.fetchone()
                    if otpExist != None:
                        if otpExist[1] == '1':
                            con.disconnect()
                            return jsonify({'email': email, 'message': 'OTP required', 'status': 'otp_req'}), 401
                con.disconnect()
                return jsonify({'userID': userID[0], 'message': 'OTP Request', 'status': 'success'}), 200
            return jsonify({'email': email, 'message': 'Wrong Password', 'status': 'fail'}), 403
        return jsonify({'email': email, 'message': 'Email does not exist', 'status': 'fail'}), 409
    return jsonify({'message': 'unauthorized access'}), 401


@user_login_email.route("/otp-verify", methods=['POST'])
def emailOTPVerify():
    header = request.headers
    authKey = header.get('Authorization')
    serverAuth = '88d464b2c2f13bcd7d1d648126e0e8aa5abeb5b1a209639f4e53d994696a422587b403fd69e1baa27b21deb03c2020fd3303e5cdc3ded8e0bc686b5dbbcd37ae'
    if request.method == 'POST' and authKey == serverAuth:
        con = db_connect()
        cur = con.cursor()
        email = request.form['email']
        incoming_otp = int(request.form['otpCode'])
        cur.execute('select id from user_account where email=%s', (email,))
        userID = cur.fetchone()

        if userID != None:
            cur.execute(
                'select otp, datetime from user_otp where user_id=%s and type=%s', (userID[0], '1'))
            otpData = cur.fetchone()
            if otpData != None:
                if otpData[0] == incoming_otp:
                    cur.execute(
                        'delete from user_otp where user_id=%s', (userID[0],))
                    con.commit()
                    con.disconnect()
                    return jsonify({'userID': userID[0], 'message': 'successfully login', 'status': 'success'}), 200
    return jsonify({'message': 'unauthorized access'}), 401
# *************************************************************************************************************************************************
