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

import datetime
from flask import render_template, request, Blueprint, jsonify
from modules.database_modules import db_connect
from functions.date_time_functions import upload_time
from functions.notification_function import fcmPushNotification
from htmlmin.minify import html_minify

user_webview_direct = Blueprint("user_webview_direct", __name__, static_folder="static",
                                template_folder="templates")


def sessionAuth(function):
    def wrapper(*args, **kwargs):
        header = request.headers
        authKey = header.get('Authorization')
        serverAuth = '88d464b2c2f13bcd7d1d648126e0e8aa5abeb5b1a209639f4e53d994696a422587b403fd69e1baa27b21deb03c2020fd3303e5cdc3ded8e0bc686b5dbbcd37ae'
        if authKey == serverAuth:
            return function()
        else:
            return jsonify({'message': 'unauthorized access'}), 401

    wrapper.__name__ = function.__name__
    return wrapper


@user_webview_direct.route("/", methods=['GET'])
@sessionAuth
def directView():
    header = request.headers
    userID = header.get('xtenId')
    # userID = 1
    # qtype = request.arg.get('qtype')
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    # email = 'phyowaiyantungamc@gmail.com'
    userReqData = None
    cur.execute('select name from user_account where id=%s', (userID,))
    userData = cur.fetchone()
    if userData != None:
        userName = userData['name']
        cur.execute(
            'select birth_date, gender from user_info where user_id=%s', (userID,))
        userInfo = cur.fetchone()
        if userInfo != None:
            birthDate = userInfo['birth_date']
            gender = userInfo['gender']
            userReqData = {'id': userID, 'name': userName,
                           'birth_date': birthDate, 'gender': gender}
        cur.execute('select * from booking_session')
        sessionTime = cur.fetchall()
        cur.execute('select * from payment_provider')
        paymentProvider = cur.fetchall()
    return html_minify(render_template('direct_webview_port.html', centerTitle='Direct Contact', userReqData=userReqData, sessionTime=sessionTime, paymentProvider=paymentProvider))


@user_webview_direct.route("/get-payment", methods=['POST'])
def paymentType():
    if request.method == 'POST':
        providerID = request.form['providerID']
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        cur.execute(
            'select id, provider_id, account_name, phone from payment_account where provider_id=%s and status=%s', (providerID, '1'))
        accountInfo = cur.fetchone()
        con.disconnect()
        return jsonify(accountInfo), 200


@user_webview_direct.route("/get-price", methods=['GET'])
def paymentPrice():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    cur.execute('select * from product_baydin where id=%s', (1,))
    bayDinPrice = cur.fetchall()
    con.disconnect()

    return jsonify(bayDinPrice), 200


@user_webview_direct.route("/get-yadaya-price", methods=['GET'])
def yadayaPrice():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    cur.execute('select * from product_baydin where id=%s', (2,))
    bayDinPrice = cur.fetchall()
    con.disconnect()
    return jsonify(bayDinPrice), 200


@user_webview_direct.route('/get-myself-data')
def getMyselfData():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    userID = request.args.get('userID')
    userReqData = None
    cur.execute('select name from user_account where id=%s', (userID,))
    userData = cur.fetchone()
    if userData != None:
        userName = userData['name']
        cur.execute(
            'select birth_date, gender from user_info where user_id=%s', (userID,))
        userInfo = cur.fetchone()
        if userInfo != None:
            birthDate = userInfo['birth_date']
            gender = userInfo['gender']
            userReqData = {'id': userID, 'name': userName,
                           'birth_date': birthDate, 'gender': gender}
    con.disconnect()
    return jsonify(userReqData), 200


@user_webview_direct.route("/get-close-session", methods=['POST'])
def closeSession():
    if request.method == 'POST':
        date = request.form['date']
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        cur.execute(
            'select session_id from booking_list where date=%s ', (date,))
        sessionInfo = cur.fetchall()
        cur.execute(
            'select session_id, block_type from booking_block where date=%s', (date,))
        blockSessions = cur.fetchall()
        for x in blockSessions:
            if x['block_type'] == '0':
                sessionInfo = []
                y = 1
                while y < 7:
                    sessionInfo.append({'session_id': str(y)})
                    y += 1
                break
            else:
                sessionInfo.append({'session_id': x['session_id']})
        con.disconnect()
        return jsonify(sessionInfo), 200


@user_webview_direct.route("/appointment", methods=['POST'])
def appointmentBook():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    qType = request.form['questionerType']
    userID = request.form['userID']
    yadayabox = '1' if request.form['yadayabox'] == 'true' else '0'
    promobox = '1' if request.form['promobox'] == 'true' else '0'
    # promoCode = request.form['promoCode'] if request.form['promobox'] == 'true' else None
    appDate = request.form['appDate']
    appTimeID = request.form['appTimeID']
    payableAmount = request.form['payableAmount']
    paymentMethod = request.form['paymentMethod']
    paymentAccount = request.form['paymentAccount']
    paymentTran = request.form['paymentTran']
    promotionAmount = request.form['promotionAmount']
    curDate = upload_time()
    if qType == '2' or 2:
        userName = request.form['userName']
        birthDate = request.form['birthDate']
        gender = request.form['gender']
        cur.execute("insert into booking_other_user (user_id, book_user_name, book_birth_date, book_gender, upload_datetime) values (%s,%s,%s,%s,%s)",
                    (userID, userName, birthDate, gender, curDate))
        con.commit()
        cur.execute(
            'select id from booking_other_user where user_id=%s order by id desc limit 1', (userID,))
        b_o_u_id = cur.fetchone()['id']
        cur.execute('insert into booking_list (user_id, date, session_id, datetime, yadaya, promo, other_user_id, questioner) values (%s,%s,%s,%s,%s,%s,%s,%s)',
                    (userID, appDate, appTimeID, curDate, yadayabox, promobox, b_o_u_id, qType))
        con.commit()
    else:
        cur.execute('insert into booking_list (user_id, date, session_id, datetime, yadaya, promo) values (%s,%s,%s,%s,%s,%s)',
                    (userID, appDate, appTimeID, curDate, yadayabox, promobox))
        con.commit()
    cur.execute(
        'select id from booking_list where user_id=%s order by id desc limit 1', (userID,))
    bookingID = cur.fetchone()
    if bookingID != None:
        bookingID = bookingID['id']
    if promobox == '0':
        cur.execute(
            'insert into payment_transition (user_id, booking_id, payment_account_id, amount, transition_num, datetime) values (%s,%s,%s,%s,%s,%s)', (userID, bookingID, paymentAccount, payableAmount,  paymentTran, curDate))

    else:
        cur.execute(
            'insert into payment_transition (user_id, booking_id, payment_account_id, amount, discount_amount, transition_num, datetime) values (%s,%s,%s,%s,%s,%s,%s)', (userID, bookingID, paymentAccount, payableAmount, promotionAmount, paymentTran, curDate))
    con.commit()
    con.disconnect()
    return jsonify({'message': 'Appointment successfully booked.', 'status': 'success'}), 200


@user_webview_direct.route("/appointment-success", methods=['GET'])
def appointmentSuccess():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    userID = request.args.get('userID')
    cur.execute(
        'select amount, transition_num, datetime from payment_transition where user_id=%s order by id desc limit 1 ', (userID,))
    tranData = cur.fetchone()
    cur.execute(
        'select date, session_id from booking_list where user_id=%s order by id desc limit 1 ', (userID,))
    bookData = cur.fetchone()
    cur.execute('select start_session, end_session from booking_session where id=%s',
                (bookData['session_id'],))
    curSession = cur.fetchone()
    notiData = {
        'user_id': userID,
        'channel': 'appointment',
        'title': 'Appointment Notice',
        'message': 'Appointment is booked successfully.',
        'route': 'appointment_history',
        'url': ''
    }
    fcmPushNotification(notiData)
    return html_minify(render_template('direct_webview_success.html', scriptTitle='Payment Success', tranData=tranData, bookData=bookData, curSession=curSession))


@user_webview_direct.route('/appointment-history')
@sessionAuth
def appointmentHistory():
    header = request.headers
    userID = header.get('xtenId')
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    # userID = request.args.get('userID')
    cur.execute(
        'select id,date,session_id, status from booking_list where user_id=%s order by id desc', (userID,))
    bookingInfo = cur.fetchall()
    bookingData = []
    for b in bookingInfo:
        cur.execute(
            'select start_session, end_session from booking_session where id=%s', (b['session_id'],))
        sessionInfo = cur.fetchone()
        gg = {'id': b['id'], 'date': b['date'],
              'session': sessionInfo, 'status': b['status']}
        bookingData.append(gg)
    return html_minify(render_template('direct_webview_history.html', scriptTitle='Appointment History', bookingData=bookingData, userID=userID))


@user_webview_direct.route('/appointment-history-detail')
def appointmentHistoryDetail():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    userID = request.args.get('userID')
    bookID = request.args.get('bookID')
    today = datetime.date.today()
    nextDay = today + datetime.timedelta(days=2)
    cur.execute(
        'select amount, transition_num, datetime from payment_transition where user_id=%s and booking_id=%s ', (userID, bookID))
    tranData = cur.fetchone()
    cur.execute(
        'select id, date, session_id, status, reschedule from booking_list where user_id=%s and id=%s', (userID, bookID))
    bookData = cur.fetchone()
    cur.execute('select start_session, end_session from booking_session where id=%s',
                (bookData['session_id'],))
    curSession = cur.fetchone()
    cur.execute('select * from booking_session')
    sessionTime = cur.fetchall()
    return html_minify(render_template('direct_webview_history_detail.html', scriptTitle='Appointment History', tranData=tranData, bookData=bookData, curSession=curSession, nextDay=nextDay, sessionTime=sessionTime))


@user_webview_direct.route('/change-appointment', methods=['POST'])
def changeAppointment():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    bookID = request.form['bookID']
    resDate = request.form['resDate']
    resTime = request.form['resTime']
    cur.execute('update booking_list set date=%s , session_id=%s, reschedule=%s where id=%s',
                (resDate, resTime, 1, bookID))
    con.commit()
    cur.execute(
        'select user_id from booking_list where id=%s order by id desc', (bookID,))
    user_id = cur.fetchone()['user_id']
    notiData = {
        'user_id': user_id,
        'channel': 'appointment',
        'title': 'Appointment Notice',
        'message': 'Appointment reschedule is successful',
        'route': 'appointment_history',
        'url': ''
    }
    fcmPushNotification(notiData)
    return jsonify({'status': 'success', 'msg': 'successfully updated'}), 200


@user_webview_direct.route('/check-promo', methods=['POST'])
def checkPromo():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    userID = request.form['userID']
    promoCode = (request.form['promoCode']).lower()
    todayDate = upload_time()
    cur.execute(
        'select id,type,amount,percentage from product_promo where code=%s and start_date < %s and expire_date > %s', (promoCode, todayDate, todayDate))
    promoData = cur.fetchone()

    if promoData != None:
        cur.execute("select id from promo_list where promo_id=%s and user_id=%s",
                    (promoData['id'], userID))
        codeUsed = cur.fetchone()
        if codeUsed != None:
            con.disconnect()
            return jsonify({'status': 'fail', 'msg': 'Code already used'}), 200
        con.disconnect()

        return jsonify({'status': 'success', 'msg': 'success', 'data': promoData}), 200
    con.disconnect()
    return jsonify({'status': 'fail', 'msg': 'Data not found'}), 200


@user_webview_direct.route('/get-promo-price', methods=['POST'])
def getPromoPrice():
    con = db_connect()
    cur = con.cursor(dictionary=True, buffered=True)
    promoID = request.form['promoID']
    cur.execute(
        'select type,amount,percentage from product_promo where id=%s', (promoID,))
    promoData = cur.fetchone()

    if promoData != None:
        con.disconnect()
        return jsonify({'status': 'success', 'msg': 'Promo Data', 'data': promoData}), 200
    return jsonify({'status': 'fail', 'msg': 'No data available'}), 200
