
# !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 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_register_email = Blueprint("user_email_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_register_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 = pbkdf2_sha256.hash(request.form['password'])
        datetime = upload_time()

        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':
                    return jsonify({'email': email, 'message': 'OTP required', 'status': 'otp_req'}), 401
        emailValidate = emailExistValidation(email)
        if emailValidate == True:
            cur.execute('insert into user_account (email, password, create_date, account_type) values (%s,%s,%s,%s)',
                        (email, password, datetime, 'email'))
            con.commit()
            cur.execute('select id from user_account where email=%s', (email,))
            userID = cur.fetchone()
            if userID != None:
                otp = otpGenerate()
                cur.execute(
                    'insert into user_otp (user_id, otp, type, datetime) values (%s,%s,%s,%s)', (userID[0], otp, '1', datetime))
                con.commit()
                otpMail(otp, email)
                return jsonify({'email': email, 'message': 'OTP Request', 'status': 'otp_req'}), 200
            con.disconnect()

        return jsonify({'email': email, 'message': 'Email already exist', 'status': 'fail'}), 409
    return jsonify({'message': 'unauthorized access'}), 401


@user_register_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()
                    my_secret = secrets.token_hex(nbytes=128)
                    return jsonify({'userID': userID[0], 'session_token': my_secret, 'message': 'successfully login', 'status': 'success'}), 200
    return jsonify({'message': 'unauthorized access'}), 401
# *************************************************************************************************************************************************
