
# !page: admin_livehawml_block
# !latest updated: 17Oct2021

from flask import render_template, request, session, redirect, url_for, flash, Blueprint, jsonify
from modules.database_modules import db_connect
from htmlmin.minify import html_minify


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


@admin_livehawml_transition.route('/')
def transitionTable():
    if 'innerSession' in session:
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        listType = request.args.get('Ltype')
        if listType == '0':
            cur.execute(
                'select id, user_id, date, session_id, status from booking_list order by id desc')
            bookingList = cur.fetchall()
        elif listType == '1':
            cur.execute(
                'select id, user_id, date, session_id, status from booking_list where status=%s order by id desc', ('0',))
            bookingList = cur.fetchall()
        elif listType == '2':
            cur.execute(
                'select id, user_id, date, session_id, status from booking_list where status=%s order by id desc', ('1',))
            bookingList = cur.fetchall()
        elif listType == '3':
            cur.execute(
                'select id, user_id, date, session_id, status from booking_list where status=%s order by id desc', ('2',))
            bookingList = cur.fetchall()
        bookData = []
        for b in bookingList:
            cur.execute(
                'select id, payment_account_id, amount, transition_num, status from payment_transition where booking_id=%s', (b['id'],))
            paymentData = cur.fetchone()
            cur.execute(
                'select start_session, end_session from booking_session where id=%s', (b['session_id'],))
            sessionData = cur.fetchone()
            cur.execute(
                'select id, name, email, phone from user_account where id=%s', (b['user_id'],))
            userInfo = cur.fetchone()
            cur.execute('select provider_id, account_name, phone from payment_account where id=%s',
                        (paymentData['payment_account_id'],))
            paymentProvider = cur.fetchone()
            cur.execute('select provider_name from payment_provider where id=%s',
                        (paymentProvider['provider_id'],))
            providerName = cur.fetchone()
            rawData = {'booking_id': b['id'],
                       'book_status': b['status'],
                       'appointment': {'date': b['date'], 'session': {'start': sessionData['start_session'], 'end': sessionData['end_session']}},
                       'user_data': {'id': userInfo['id'], 'name': userInfo['name'], 'email': userInfo['email'], 'phone': userInfo['phone']},
                       'tran': {'id': paymentData['id'], 'amount': paymentData['amount'], 'tran_num': paymentData['transition_num'], 'tran_status': paymentData['status'], },
                       'payment': {'provider': providerName['provider_name'], 'account': paymentProvider['account_name'], 'phone': paymentProvider['phone']},
                       }

            bookData.append(rawData)
        return html_minify(render_template('admin_livehawml_transition.html', bookData=bookData, listType=listType))
    return redirect(url_for('admin_login.adminLogin'))


@admin_livehawml_transition.route('/confirm', methods=['POST'])
def transitionConfirm():
    if 'innerSession' in session:
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        bookingID = request.form['bookingID']
        tranID = request.form['tranID']
        userID = request.form['uID']
        cur.execute(
            'update booking_list set status=%s where id=%s and user_id=%s', ('1', bookingID, userID))
        cur.execute('update payment_transition set status=%s where id=%s and booking_id=%s and user_id=%s',
                    ('1', tranID, bookingID, userID))
        con.commit()
        flash('Booking transition status changed to CONFIRMED.', 'success')
        notiData = {
            'user_id': userID,
            'channel': 'appointment',
            'title': 'Appointment Notice',
            'message': 'Your appointment booking is CONFIRMED. Click here for more details.',
            'route': 'appointment_history_detail',
            'url': f'/webview/direct/appointment-history-detail?userID={userID}&bookID={bookingID}'
        }
        from functions.notification_function import fcmPushNotification
        fcmPushNotification(notiData)
        return jsonify({'status': 'success', 'message': 'success'}), 200
    return jsonify({'status': 'failed', 'message': 'unauthorized access'}), 403


@admin_livehawml_transition.route('/cancel', methods=['POST'])
def transitionCancel():
    if 'innerSession' in session:
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        bookingID = request.form['bookingID']
        tranID = request.form['tranID']
        userID = request.form['uID']
        cur.execute(
            'update booking_list set status=%s where id=%s and user_id=%s', ('2', bookingID, userID))
        cur.execute('update payment_transition set status=%s where id=%s and booking_id=%s and user_id=%s',
                    ('2', tranID, bookingID, userID))
        con.commit()
        flash('Booking transition status changed to CANCELED.', 'success')
        notiData = {
            'user_id': userID,
            'channel': 'appointment',
            'title': 'Appointment Notice',
            'message': 'Your appointment booking is CANCELED. Click here for more details.',
            'route': 'appointment_history_detail',
            'url': f'/webview/direct/appointment-history-detail?userID={userID}&bookID={bookingID}'
        }
        from functions.notification_function import fcmPushNotification
        fcmPushNotification(notiData)
        return jsonify({'status': 'success', 'message': 'success'}), 200
    return jsonify({'status': 'failed', 'message': 'unauthorized access'}), 403


@admin_livehawml_transition.route('/pending', methods=['POST'])
def transitionPending():
    if 'innerSession' in session:
        con = db_connect()
        cur = con.cursor(dictionary=True, buffered=True)
        bookingID = request.form['bookingID']
        tranID = request.form['tranID']
        userID = request.form['uID']
        cur.execute(
            'update booking_list set status=%s where id=%s and user_id=%s', ('0', bookingID, userID))
        cur.execute('update payment_transition set status=%s where id=%s and booking_id=%s and user_id=%s',
                    ('0', tranID, bookingID, userID))
        con.commit()
        flash('Booking transition status changed to PENDING.', 'success')
        notiData = {
            'user_id': userID,
            'channel': 'appointment',
            'title': 'Appointment Notice',
            'message': 'Your appointment booking is under reprocessing. Click here for more details.',
            'route': 'appointment_history_detail',
            'url': f'/webview/direct/appointment-history-detail?userID={userID}&bookID={bookingID}'
        }
        from functions.notification_function import fcmPushNotification
        fcmPushNotification(notiData)
        return jsonify({'status': 'success', 'message': 'success'}), 200
    return jsonify({'status': 'failed', 'message': 'unauthorized access'}), 403
