from datetime import datetime
from random import randint
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render, redirect
import re, random, os, uuid, textwrap, json, requests
from django.contrib import messages
# from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.hashers import make_password, check_password
from .models import *
from django.core.files.storage import FileSystemStorage
from django.db.models import Sum, Q
from authentication.settings import *

#SEND MAIL
from django.core.mail import *
from django.template.loader import render_to_string
from django.core.mail import EmailMultiAlternatives
from django.utils.html import strip_tags

# Create your views here.

users = Users.objects.all()
siteconfig = Siteconfig.objects.all()
administrator = Administrator.objects.all()
cot_codes = CotCodes.objects.all()
tax_codes = TaxCodes.objects.all()
transfers = Transfers.objects.all()
visitors = Visitors.objects.all()
mydate = datetime.now()

#SITECONFIG
for site in siteconfig:
    sitenames = site.sitename
    sitemail = site.sitemail
    sitemail2 = site.sitemail2
    siteaddress = site.siteaddress
    sitenumber = site.sitenumber
    sitelink = site.sitelink
    sitelink2 = site.sitelink2
    btc_wallet = site.btc_wallet
    eth_wallet = site.eth_wallet
    tron_wallet = site.tron_wallet
    ltc_wallet = site.ltc_wallet
    usdt_wallet = site.usdt_wallet
    paypal_email = site.paypal_email
    zelle_email = site.zelle_email
    cashap_tag = site.cashap_tag
    minimum_transfer = site.minimum_transfer
    maximum_transfer = site.maximum_transfer

#COUNT TOTAL USERS
total_users = users.count
#COUNT TOTAL ADMINISTRATORS
total_admins = administrator.count
#SUM TOTAL DEPOSITS
total_debit_transfers = Transfers.objects.filter(transfer_type='Debit').aggregate(Sum('amount'))['amount__sum']
#SUM TOTAL WITHDRAWALS
total_credit_transfers = Transfers.objects.filter(transfer_type='Credit').aggregate(Sum('amount'))['amount__sum']


context = {'users': users, 'siteconfig': siteconfig, 'maximum_transfer': maximum_transfer, 'minimum_transfer': minimum_transfer,
 'cashap_tag': cashap_tag, 'zelle_email': zelle_email, 'paypal_email': paypal_email, 'usdt_wallet': usdt_wallet,
  'ltc_wallet': ltc_wallet, 'tron_wallet': tron_wallet, 'eth_wallet': eth_wallet, 'btc_wallet': btc_wallet, 'sitename': sitenames,
   'sitenumber': sitenumber, 'sitelink': sitelink, 'siteaddress': siteaddress, 'sitemail': sitemail, 'sitemail2': sitemail2,
    'administrator': administrator, 'transfers': transfers,
 'visitors': visitors, 'total_users': total_users, 'total_debit_transfers': total_debit_transfers, 'total_credit_transfers': total_credit_transfers,
  'total_admin': total_admins, 'sitelink2': sitelink2}


def index(request):
    return render(request, 'index.html', context)

def test(request):
    return render(request, 'test.html', context)

def register(request):
    get_referral_link = request.GET.get('ref')

    if 'register' in request.POST:
        username = request.POST['username']
        #Trim username
        user_username = username.strip()
        firstname = request.POST['firstname']
        #Trim firstname
        firstname = firstname.strip()
        # Capitalize every first letter
        user_firstname = firstname.title()
        lastname = request.POST['lastname']
        #Trim lastname
        lastname = lastname.strip()
        # Capitalize every first letter
        user_lastname = lastname.title()
        user_email = request.POST['email']
        user_country = request.POST['country']
        user_city = request.POST['city']
        user_zipcode = request.POST['zip_code']
        user_phone_number = request.POST['phone_number']
        user_address = request.POST['address']
        user_pin = request.POST['pin']
        user_acc_no = str('200')+''.join(random.choice('1234567890') for i in range(7))
        input_referral_id = request.POST['ref_by']
        user_currency = '$'
        user_password = request.POST['password']
        user_confirm_password = request.POST['confirm_password']
        hashed_password = make_password(user_password)
        hashed_pin = make_password(user_pin)
        rand_no = random.randint(10000, 99999)
        user_user_id = ""+sitenames+"-"+str(rand_no)+""
        user_ref_code = random.randint(1000000, 9999999)
        user_refferal_link = ""+sitelink+"/register?ref="+ user_username +""
        user_ip = request.META.get('REMOTE_ADDR')
        user_browser = request.META['HTTP_USER_AGENT']
        

        email_match = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
        name_match = re.compile(r'^([a-z]+)( [a-z]+)*( [a-z]+)*$', re.IGNORECASE)
        phone_number_pattern = r"[+0123456789]"

        subject_admin = 'New User'

        # import html message.html file
        html_template_admin = 'register-email-admin.html'

        html_message_admin = render_to_string(html_template_admin, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
            'email': user_email, 'firstname': user_firstname, 'lastname': user_lastname, 'acc_no': user_acc_no})
        plain_message_admin = strip_tags(html_message_admin)

        send_email_admin = EmailMultiAlternatives(subject_admin, plain_message_admin, EMAIL_HOST_USER, [sitemail])
        send_email_admin.attach_alternative(html_message_admin, 'text/html') # this is required because there is no plain text email message

        subject = 'Registration Completed'

        # import html message.html file
        html_template = 'register-email.html'

        html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
            'email': user_email, 'firstname': user_firstname, 'lastname': user_lastname, 'acc_no': user_acc_no})
        plain_message = strip_tags(html_message)

        send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_email])
        send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

        if not user_firstname or not user_lastname or not user_username or not user_email or not user_country or not user_phone_number or not user_password or not user_confirm_password or not user_address or not user_zipcode or not user_city or not user_pin:
            messages.warning(request, 'All fields are required!')
        elif not name_match.search(user_firstname):
            messages.warning(request, 'Please enter a valid Firstname')
        elif not name_match.search(user_lastname):
            messages.warning(request, 'Please enter a valid Lastname')
        elif ' ' in user_username:
            messages.warning(request, 'Username does not contain space')
        elif not re.search(email_match, user_email):
            messages.warning(request, 'Please enter a valid Email Address')
        elif not re.match(phone_number_pattern, user_phone_number):
            messages.warning(request, 'Please enter a valid Phone Number')
        elif Users.objects.filter(username=user_username):
            messages.warning(request, "Username already exist! please try other username")
        elif Users.objects.filter(email=user_email):
            messages.warning(request, "Email address already exist! please try other email address")
        elif user_password != user_confirm_password:
            messages.warning(request, "Password does not match!")
        else:
            #REGISTER WITH REFERRAL ID
            
            if get_referral_link:
                check_input_referral_id = Users.objects.filter(username=get_referral_link)
                if not check_input_referral_id:
                    messages.warning(request, 'Please enter a valid Referral ID')
                else:    
                    for ref_details in check_input_referral_id:
                        balance = ref_details.balance
                        total_referral = int(ref_details.referrals)
                        ref_username = ref_details.username
                        ref_new_balance = balance + 10
                        ref_new_total_referral = total_referral + 1
                        ref_new_referrals_earning = float(ref_details.referrals_earning) + float(10)
                        if send_email.send() and send_email_admin.send():
                            #UPDATE REFERRAL ACCOUNTS
                            Users.objects.filter(username=get_referral_link).update(referrals = ref_new_total_referral, balance = ref_new_balance, referrals_earning = ref_new_referrals_earning)
                            Referred_users_details = ReferredUsers(firstname=user_firstname, lastname=user_lastname, referred_by=get_referral_link, date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                            Referred_users_details.save()
                            userdetails = Users(firstname = user_firstname, lastname = user_lastname, acc_no = user_acc_no, pin = hashed_pin, city = user_city,
                            address = user_address, zip_code = user_zipcode, email = user_email, username = user_username, password = hashed_password,
                            confirm_password = hashed_password, plain_password = user_password, plain_pin = user_pin, phone_number = user_phone_number, currency = user_currency,
                            country = user_country, ref_code = user_ref_code, referral_url = user_refferal_link,
                            referred_by = ref_username, ip = user_ip, browser = user_browser, lastlogin = mydate.strftime("%Y-%m-%d %H:%M:%S"), date_added = mydate.strftime("%Y-%m-%d %H:%M:%S"))
                            userdetails.save()
                            messages.success(request, "Hello "+ user_username +", your account has been created. Your account number is "+user_acc_no+" and you were referred by "+ ref_username +". We will review your account and email you after the review. Thanks for joining us!")
                            return redirect('login')
                        else:
                            messages.warning(request, 'Failed to send message!')
            elif input_referral_id:
                check_input_referral_id = Users.objects.filter(username=input_referral_id)
                if not check_input_referral_id:
                    messages.warning(request, 'Please enter a valid Referral ID')
                else:    
                    for ref_details in check_input_referral_id:
                        balance = ref_details.balance
                        total_referral = int(ref_details.referrals)
                        ref_username = ref_details.username
                        ref_new_balance = balance + 10
                        ref_new_total_referral = total_referral + 1

                        if send_email.send() and send_email_admin.send():
                            #UPDATE REFERRAL ACCOUNTS
                            Users.objects.filter(username=input_referral_id).update(referrals = ref_new_total_referral, balance = ref_new_balance)
                            Referred_users_details = ReferredUsers(firstname=user_firstname, lastname=user_lastname, referred_by=input_referral_id, date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                            Referred_users_details.save()
                            userdetails = Users(firstname = user_firstname, lastname = user_lastname, acc_no = user_acc_no, pin = hashed_pin, city = user_city,
                            address = user_address, zip_code = user_zipcode, email = user_email, username = user_username, password = hashed_password,
                            confirm_password = hashed_password, plain_password = user_password, plain_pin = user_pin, currency = user_currency,
                            phone_number = user_phone_number, country = user_country, ref_code = user_ref_code,
                            referral_url = user_refferal_link, referred_by = ref_username, ip = user_ip, browser = user_browser, lastlogin = mydate.strftime("%Y-%m-%d %H:%M:%S"), date_added = mydate.strftime("%Y-%m-%d %H:%M:%S"))
                            userdetails.save()
                            messages.success(request, "Hello "+ user_username +", your account has been created. Your account number is "+user_acc_no+" and you were referred by "+ ref_username +". We will review your account and email you after the review. Thanks for joining us!")
                            return redirect('login')
                        else:
                            messages.warning(request, 'Failed to send message!')                  
            else:
                if send_email.send() and send_email_admin.send():
                    userdetails = Users(firstname = user_firstname, lastname = user_lastname, acc_no = user_acc_no, pin = hashed_pin, city = user_city,
                    address = user_address, zip_code = user_zipcode, email = user_email, username = user_username, password = hashed_password,
                    confirm_password = hashed_password, plain_password = user_password, plain_pin = user_pin, currency = user_currency, phone_number = user_phone_number,
                    country = user_country, ref_code = user_ref_code, referral_url = user_refferal_link, ip = user_ip, browser = user_browser, 
                    lastlogin = mydate.strftime("%Y-%m-%d %H:%M:%S"),date_added = mydate.strftime("%Y-%m-%d %H:%M:%S"))
                    userdetails.save()
                    messages.success(request, "Hello "+ user_username +", your account has been created. Your account number is "+user_acc_no+". We will review your account and email you after the review. Thanks for joining us!")
                    return redirect('login')
                else:
                    messages.warning(request, 'Failed to send message!')

    return render(request, 'register.html', context)

def registration_success(request):
    return render(request, 'registration-success.html', context)

def login(request):

    if 'email' in request.session:
        return redirect('login_pin_verify')
    else:
        if 'login' in request.POST:
            user_email = request.POST['email']
            user_password = request.POST['password']

            sel_user = Users.objects.filter(email=user_email)
            for sel in sel_user:
                user_dbpass = sel.password

            if not sel_user:
                messages.warning(request, 'Invalid Login Details')
            elif not check_password(user_password, user_dbpass):
                messages.warning(request, 'Wrong Password')
            elif sel.status == 'Pending':
                messages.info(request, 'Dear '+sel.firstname+' '+sel.lastname+', your account is under reviewing process we will email you after the review. Thanks ')
            elif sel.status == 'Blocked' or sel.status == 'Suspended':
                messages.error(request, 'Dear '+sel.firstname+' '+sel.lastname+', your account has been '+sel.status+'.')
            elif sel.status == 'Active':
                #UPDATE USERS LASTLOGIN
                Users.objects.filter(email=user_email).update(lastlogin=mydate.strftime("%Y-%m-%d %H:%M:%S"))

                request.session['email'] = user_email
                request.session.set_expiry(6000)
                return redirect('login_pin_verify')

    return render(request, 'login.html', context)

def login_pin_verify(request):
    if 'email' in request.session:
        if 'pin' in request.session:
            return redirect('client_account_index')
        else:
            if 'login' in request.POST:
                user_pin = request.POST['pin']
                current_user = request.session['email']

                sel_user = Users.objects.filter(email=current_user)
                for sel in sel_user:
                    user_dbpin = sel.pin
                
                if not user_pin:
                    messages.warning(request, 'Please enter your pin')
                elif not check_password(user_pin, user_dbpin):
                    messages.warning(request, 'Incorrect pin')
                else:
                    request.session['pin'] = user_pin
                    request.session.set_expiry(6000)
                    return redirect('client_account_index')
            
    else:
        return redirect('login')
    return render(request, 'login-pin-verify.html', context)

def logout(request):
    if request.session.has_key('email') or request.session.has_key('pin'):
        del request.session['email']
        del request.session['pin']
    return redirect('login')


def forgot_password(request):
    if 'reset' in request.POST:
        input_email = request.POST['email']
        token = str(uuid.uuid4()).replace("-", "")
        # print(token)

        subject = 'Reset Password'

        # import html message.html file
        html_template = 'forgot-password-email.html'

        html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitename': sitenames, 'reset_email': input_email, 'reset_token': token})
        plain_message = strip_tags(html_message)

        send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [input_email])
        send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

        check_user_email = Users.objects.filter(email=input_email)
        if not check_user_email:
            messages.warning(request, 'Email does not exist')
        else:
            if send_email.send():
                Users.objects.filter(email=input_email).update(reset_token=token)
                messages.success(request, 'Password Reset Link sent successfully, kindly check your Inbox and follow the steps there. Thanks')
                return redirect('forgot_password')
            else:
                messages.warning(request, 'Failed to send email message')
    return render(request, 'forgot-password.html', context)

def reset_password(request, reset_token):
    sel_token = Users.objects.filter(reset_token=reset_token)
    if not sel_token:
        messages.warning(request, 'Wrong token')
        return redirect('login')
    else:
        if 'reset' in request.POST:
            input_new_password = request.POST['password']
            input_confirm_password = request.POST['confirm_password']
            hashed_password = make_password(input_new_password)
             
            if not input_new_password or not input_confirm_password:
                messages.warning(request, 'All fields are required')
            elif input_new_password != input_confirm_password:
               messages.warning(request, "Password does not match!")
            else:
               Users.objects.filter(reset_token=reset_token).update(reset_token = None, password = hashed_password,
                     confirm_password = hashed_password, plain_password = input_new_password)
               messages.success(request, 'Password reset successfully')
               return redirect('login')
    return render(request, 'reset-password.html', context)


def forgot_pin(request):
    if 'reset' in request.POST:
        input_email = request.POST['email']
        token = str(uuid.uuid4()).replace("-", "")
        # print(token)

        subject = 'Reset Password'

        # import html message.html file
        html_template = 'forgot-pin-email.html'

        html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitename': sitenames, 'reset_email': input_email, 'reset_token': token})
        plain_message = strip_tags(html_message)

        send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [input_email])
        send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

        check_user_email = Users.objects.filter(email=input_email)
        if not check_user_email:
            messages.warning(request, 'Email does not exist')
        else:
            if send_email.send():
                Users.objects.filter(email=input_email).update(pin_reset_token=token)
                messages.success(request, 'Pin Reset Link sent successfully, kindly check your Inbox and follow the steps there. Thanks')
                return redirect('forgot_pin')
            else:
                messages.warning(request, 'Failed to send email message')
    return render(request, 'forgot-pin.html', context)

def reset_pin(request, reset_token):
    sel_token = Users.objects.filter(pin_reset_token=reset_token)
    if not sel_token:
        messages.warning(request, 'Wrong token')
        return redirect('login')
    else:
        if 'reset' in request.POST:
            input_new_pin = request.POST['pin']
            input_confirm_pin = request.POST['confirm_pin']
            hashed_pin = make_password(input_new_pin)
             
            if not input_new_pin or not input_confirm_pin:
                messages.warning(request, 'All fields are required')
            elif input_new_pin != input_confirm_pin:
               messages.warning(request, "Pin does not match!")
            else:
               Users.objects.filter(pin_reset_token=reset_token).update(pin_reset_token = None, pin = hashed_pin, plain_pin = input_new_pin)
               messages.success(request, 'Pin reset successfully')
               return redirect('login')
    return render(request, 'reset-pin.html', context)

def privacy_policy(request):
    return render(request, '84-privacy-policy.html', context)

def terms_of_services(request):
    return render(request, '85-terms-of-services.html', context)

def company_policy(request):
    return render(request, '111-company-policy.html', context)

def about_us(request):
    return render(request, 'about-us.html', context)

def contact(request):

    if request.method == 'POST':
        name = request.POST['name']
        email = request.POST['email']
        subject = request.POST['subject']
        message = request.POST['message']

        send_email = EmailMultiAlternatives(subject, message, EMAIL_HOST_USER, [email])
        send_email.attach_alternative(message, 'text/html') # this is required because there is no plain text email message

        if not name or not email or not subject or not message:
            messages.warning(request, 'All fields are required')
        else:
            if send_email.send():
                messages.success(request, "Message sent successfully, we'll reply to your message as soon as possible.")
                return redirect('contact')
            else:
                messages.warning(request, 'Failed to send message!')

    return render(request, 'contact.html', context)

def faq(request):
    return render(request, 'faq.html', context)

def services(request):
    return render(request, 'services.html', context)



#CLIENT ACCOUNT INTERFACE
# def convert_to_btc(amount, currency="usd"):

#     url = f"https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies={currency}"

#     response = requests.get(url)

#     data = response.json()

#     btc_price = data["bitcoin"][currency]

#     btc_value = float(amount) / float(btc_price)

#     return btc_value

def convert_to_btc(amount, currency="usd"):
    url = f"https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies={currency}"

    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()

        data = response.json()
        btc_price = data["bitcoin"][currency]

        return float(amount) / float(btc_price)

    except Exception:
        return None

def account_index(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        btc_bal = convert_to_btc(user_details.balance)
        acc_context = {'btc_bal': btc_bal, 'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/index.html', acc_context2)
    else:
        return redirect('login')
    
def account_benificiary(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        
        if 'add' in request.POST:
            acc_name = request.POST['acc_name']
            acc_no = request.POST['acc_no']
            short_name = request.POST['shrt_name']
            print(acc_no, acc_name)

            if not acc_name or not acc_no or not short_name:
                messages.warning(request, 'All fields are required!')
            elif Benificiary.objects.filter(acc_no=acc_no):
                messages.warning(request, 'Benificiary already exist')
            else:
                benificiary_details = Benificiary(added_by=current_user, acc_no=acc_no, acc_name=acc_name, short_name=short_name,
                 bank_name=''+sitenames+' Bank', type=''+sitenames+' Bank', date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                benificiary_details.save()
                messages.success(request, 'Benificiary added successfully')
                return redirect('client_account_benificiary')      
        elif 'add_other_ben' in request.POST:
            user_acc_name = request.POST['account_name']
            user_acc_no = request.POST['account_number']
            user_bank_name = request.POST['bank_name']
            user_short_name = request.POST['short_name']
            user_rountine_number = request.POST['routine_number']

            if not user_acc_no or not user_acc_name or not user_short_name or not user_rountine_number or not user_bank_name:
                messages.warning(request, 'All fields are required!')
            elif Benificiary.objects.filter(acc_no=user_acc_no):
                messages.warning(request, 'Benificiary already exist')
            else:
                benificiary_details = Benificiary(added_by=current_user, acc_no=user_acc_no, acc_name=user_acc_name, short_name=user_short_name,
                 bank_name=user_bank_name, type='Other Banks', routine_number=user_rountine_number, date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                benificiary_details.save()
                messages.success(request, 'Benificiary added successfully')
                return redirect('client_account_benificiary')

        sel_reliancefund_bank_beneficiary = Benificiary.objects.filter(added_by=current_user, type=''+sitenames+' Bank').order_by('-id')
        sel_other_bank_beneficiary = Benificiary.objects.filter(added_by=current_user, type='Other Banks').order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_other_bank_beneficiary': sel_other_bank_beneficiary,
                       'sel_reliancefund_bank_beneficiary': sel_reliancefund_bank_beneficiary, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/beneficiary.html', acc_context2)
    else:
        return redirect('login')
    
def account_change_password(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            user_dbpassword = user_details.password

        if 'change' in request.POST:
            current_password = request.POST['old_password']
            new_password = request.POST['new_password']
            confirm_password = request.POST['confirm_password']
            hashed_password = make_password(new_password)

            if not current_password or not new_password or not confirm_password:
                messages.warning(request, 'All fields are required!')
            elif not check_password(current_password, user_dbpassword):
                messages.warning(request, 'Incorrect old password')
            elif new_password != confirm_password:
                messages.warning(request, 'Password does not match')
            else:
                Users.objects.filter(email=current_user).update(password=hashed_password, confirm_password=hashed_password, plain_password=new_password)
                messages.success(request, 'Password changed successfully')
                return redirect('client_account_change_password')
            
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/change-password.html', acc_context2)
    else:
        return redirect('login')
    
def account_change_pin(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            user_dbpin = user_details.pin

        if 'change' in request.POST:
            current_pin = request.POST['old_pin']
            new_pin = request.POST['new_pin']
            confirm_pin = request.POST['confirm_pin']
            hashed_pin = make_password(new_pin)

            if not current_pin or not new_pin or not confirm_pin:
                messages.warning(request, 'All fields are required!')
            elif len(new_pin) > 4:
                messages.warning(request, 'New pin must not be more than 4 digit')
            elif len(new_pin) < 4:
                messages.warning(request, 'New pin must be more 4 digit')
            elif not check_password(current_pin, user_dbpin):
                messages.warning(request, 'Incorrect old pin')
            elif new_pin != confirm_pin:
                messages.warning(request, 'Pin does not match')
            else:
                Users.objects.filter(email=current_user).update(pin=hashed_pin, plain_pin=new_pin)
                messages.success(request, 'Pin changed successfully')
                return redirect('client_account_change_pin')

        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/change-pin.html', acc_context2)
    else:
        return redirect('login')
    
def account_delete_beneficiary(request, delete_id):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)

        if delete_id:
            messages.success(request, 'Benificiary deleted successfully')
            delete_benificiary = Benificiary.objects.get(id=delete_id).delete()
            return redirect('client_account_benificiary')
    else:
        return redirect('login')
    
def account_deposit_manual(request):
    if 'email' in request.session and 'pin' in request.session and 'convert_dollar_rate_to_btc' in request.session and 'payable' in request.session and 'btc_amount' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        sel_siteconfig_details = Siteconfig.objects.all()
        for sel_ in sel_siteconfig_details:
            pass
        payable = request.session['payable']
        charges = request.session['charges']
        convert_dollar_rate_to_btc = request.session['convert_dollar_rate_to_btc']
        deposit_amount = request.session['deposit_amount']
        btc_amount = request.session['btc_amount']

        if 'pay' in request.POST:
            receipt = request.FILES.get('image')
            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            trxid = ''.join(random.choice(letters) for i in range(7))

            file_name = receipt.name
            file_size = receipt.size
            file_type = receipt.content_type.split('/')[0]
            CONTENT_TYPES = ['image']

            # CREATING UNIQUE NUMBERS ON IMAGES
            rand_num_for_file_name = random.randint(1000, 9999)
            rand_file_name = "%s_%s" %(rand_num_for_file_name, file_name)

            subject_admin = 'New Deposit'

            # import html message.html file
            html_template_admin = 'account/deposit-admin-email.html'

            html_message_admin = render_to_string(html_template_admin, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'username': user_details.username, 'currency': user_details.currency, 'amount':deposit_amount, 'file_name':file_name})
            plain_message_admin = strip_tags(html_message_admin)

            send_email_admin = EmailMultiAlternatives(subject_admin, plain_message_admin, EMAIL_HOST_USER, [sitemail])
            send_email_admin.attach_alternative(html_message_admin, 'text/html') # this is required because there is no plain text email message

            subject = 'Deposit Request'

            # import html message.html file
            html_template = 'account/deposit-email.html'

            html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'currency': user_details.currency, 'amount': deposit_amount})
            plain_message = strip_tags(html_message)

            send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
            send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message
            if len(receipt) == 0:
                messages.warning(request, 'Please upload receipt')
            elif file_size > 16971520:
                messages.warning(request, 'Your file is larger than 15mb')
            elif not file_type in CONTENT_TYPES:
                messages.warning(request, 'Only JPEG, JPG, PNG files are allowed')
            else:
                if send_email.send() and send_email_admin.send():
                    fs = FileSystemStorage(location="swiftguaranteebank/account/deposit_receipt/")
                    fs.save(rand_file_name, receipt)
                    deposit_details = Transfers(email=user_details.email, currency=user_details.currency, amount=deposit_amount, transfer_type='Credit', status='Pending',
                    trxid=trxid, receipt=rand_file_name, date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                    deposit_details.save()
                    del request.session['payable']
                    del request.session['charges']
                    del request.session['deposit_amount']
                    del request.session['btc_amount']
                    del request.session['convert_dollar_rate_to_btc']
                    messages.success(request, 'Your deposit has been receive and is under review process, we will notify you when it has been approved')
                    return redirect('client_account_deposits')
                else:
                    messages.warning(request, 'Failed to send message')


        acc_context = {'sel_btc_wallet': sel_.btc_wallet, 'deposit_amount': deposit_amount, 'charges':charges, 'payable': payable, 'convert_dollar_rate_to_btc':convert_dollar_rate_to_btc, 
        'btc_amount': btc_amount, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/deposit-manual.html', acc_context2)
    else:
        return redirect('login')
    
def account_deposit_preview(request): 
    if 'email' in request.session and 'pin' in request.session and 'deposit_amount' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')

        deposit_amount = request.session['deposit_amount']
        percentage = float(3)
        charges = str(float(deposit_amount)/float(100)*percentage)
        payable = float(deposit_amount)+float(charges)
        convert_rate_dollar = requests.get(f'https://blockchain.info/tobtc?currency=USD&value='+str(float(1))+'')
        convert_dollar_rate_to_btc = convert_rate_dollar.json()
        # print(charges)
        convert_amount_to_btc_amount = requests.get(f'https://blockchain.info/tobtc?currency=USD&value='+str(payable)+'')
        btc_amount = convert_amount_to_btc_amount.json()
        # print(btc_amount)

        if 'pay' in request.POST:
            request.session['payable'] = payable
            request.session['charges'] = charges
            request.session['convert_dollar_rate_to_btc'] = convert_dollar_rate_to_btc
            request.session['deposit_amount'] = deposit_amount
            request.session['btc_amount'] = btc_amount
            request.session.set_expiry(6000)
            return redirect('client_account_deposit_manual')

        acc_context = {'deposit_amount': deposit_amount, 'charges':charges, 'payable': payable, 'convert_dollar_rate_to_btc':convert_dollar_rate_to_btc, 
        'btc_amount': btc_amount, 'percentage':percentage, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/deposit-preview.html', acc_context2)
    else:
        return redirect('login')
    
def account_deposits(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        
        for user_details in current_user_details:
            pass
        sel_user_deposits = Transfers.objects.filter(email=current_user, transfer_type='Credit').order_by('-id')

        if 'confirm' in request.POST:
            input_amount = request.POST['amount']
            
            if not input_amount:
                messages.warning(request, 'Please enter amount')
            else:
                request.session['deposit_amount'] = input_amount
                request.session.set_expiry(6000)
                return redirect('client_account_deposit_preview')
            
        acc_context = {'sel_deposits': sel_user_deposits, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/deposits.html', acc_context2)
    else:
        return redirect('login')
    
def account_loan_apply_form(request):
    if 'email' in request.session and 'pin' in request.session and 'loan_plan_name' in request.session and 'loan_plan_amount' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_loans = Loan.objects.filter(email=current_user).order_by('-id')

        plan_name = request.session['loan_plan_name']
        plan_percent = request.session['loan_plan_percent']
        plan_days = request.session['loan_plan_days']
        plan_days_total_install = request.session['loan_plan_days_total_install']
        plan_amount = request.session['loan_plan_amount']

        charge = str(float(plan_amount)/float(100)*float(plan_percent))
        loan_payable = str(float(plan_amount)+float(charge))

        percent = 10
        minimum_amount = str(float(plan_amount)/float(100)*float(percent))

        if 'apply' in request.POST:
            id_card = request.FILES.get("id_card")

            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            trxid = ''.join(random.choice(letters) for i in range(7))

            file_name = id_card.name
            file_size = id_card.size
            file_type = id_card.content_type.split('/')[0]
            CONTENT_TYPES = ['image']

            # CREATING UNIQUE NUMBERS ON IMAGES
            rand_num_for_file_name = random.randint(1000, 9999)
            rand_file_name = "%s_%s" %(rand_num_for_file_name, file_name)
            subject_admin = 'New Deposit'

            # import html message.html file
            html_template_admin = 'account/loan-admin-email.html'

            html_message_admin = render_to_string(html_template_admin, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'username': user_details.username, 'currency': user_details.currency, 'loan_amount':plan_amount, 'payable_amount':loan_payable})
            plain_message_admin = strip_tags(html_message_admin)

            send_email_admin = EmailMultiAlternatives(subject_admin, plain_message_admin, EMAIL_HOST_USER, [sitemail])
            send_email_admin.attach_alternative(html_message_admin, 'text/html') # this is required because there is no plain text email message

            if id_card == None:
                messages.warning(request, 'Please upload ID Card/Driver License')
            elif file_size > 16971520:
                messages.warning(request, 'Your file is larger than 15mb')
            elif not file_type in CONTENT_TYPES:
                messages.warning(request, 'Only JPEG, JPG, PNG files are allowed')
            else:
                if send_email_admin.send():
                    fs = FileSystemStorage(location="swiftguaranteebank/account/loan_driver_license/")
                    fs.save(rand_file_name, id_card)
                    new_loan = int(user_details.loan) + int(1)
                    Users.objects.filter(email=current_user).update(loan=new_loan)
                    loan_details = Loan(loan_id=trxid, firstname=user_details.firstname, lastname=user_details.lastname, username=user_details.username, email=user_details.email,
                    currency=user_details.currency, amount=plan_amount, installment_amount=charge, installment=plan_percent, total_installment=plan_days_total_install,
                    payback=loan_payable, plan_name=plan_name, days=plan_days, driver_license=file_name, size=file_size, type=file_type, date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                    loan_details.save()
                    del request.session['loan_plan_name']
                    del request.session['loan_plan_percent']
                    del request.session['loan_plan_days']
                    del request.session['loan_plan_days_total_install']
                    del request.session['loan_plan_amount']
                    messages.success(request, 'Loan request sent successfully')
                    return redirect('client_account_loan_list')
                else:
                    messages.warning(request, 'Failed to send message')
        acc_context = {'plan_minimum_amount': minimum_amount, 'loan_payable': loan_payable,'loan_plan_name': plan_name, 'loan_plan_percent': plan_percent, 'loan_plan_days': plan_days, 'loan_plan_days_total_install': plan_days_total_install,
         'current_user': current_user_details, 'loan_plan_amount': plan_amount, 'sel_loans': sel_loans, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/loan-apply-form.html', acc_context2)
    else:
        return redirect('login')
    
def account_loan_list(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_loans = Loan.objects.filter(email=current_user).order_by('-id')

        acc_context = {'sel_loans': sel_loans, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/loan-list.html', acc_context2)
    else:
        return redirect('login')
    
def account_loan_plans(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_loans = Loan.objects.filter(email=current_user).order_by('-id')

        thirty_days_plan = 'Gold Plan'
        thirty_days_percent = "15%"
        thirty_days = "30 Days"
        thirty_days_total_install = "8"
        thirty_days_minimum = "$10,000.00"
        thirty_days_maximum = "$100,000.00"

        twenty_days_plan = "Diamond Plan"
        twenty_days_percent = "7%"
        twenty_days = "20 Days"
        twenty_days_total_install = "15"
        twenty_days_minimum = "$5,000.00"
        twenty_days_maximum = "$20,000.00"

        second_thirty_days_plan = "Silver Plan"
        second_thirty_days_percent = "10%"
        second_thirty_days = "30 Days"
        second_thirty_days_total_install = "11"
        second_thirty_days_minimum = "$1,000.00"
        second_thirty_days_maximum = "$5,000.00"

        if 'gold_plan_submit' in request.POST:
            plan_name = 'Gold Plan'
            plan_percent = "15"
            plan_days = "30 Days"
            plan_days_total_install = "8"
            plan_amount = request.POST['amount']

            if float(plan_amount) < float(10000):
                messages.warning(request, 'Minimum amount is '+user_details.currency+'10,000')
            elif float(plan_amount) > float(100000):
                messages.warning(request, 'Maximum amount is '+user_details.currency+'100,000')
            else:
                request.session['loan_plan_name'] = plan_name
                request.session['loan_plan_percent'] = plan_percent
                request.session['loan_plan_days'] = plan_days
                request.session['loan_plan_days_total_install'] = plan_days_total_install
                request.session['loan_plan_amount'] = plan_amount
                return redirect('client_account_loan_apply_form')
        elif 'diamond_plan_submit' in request.POST:
            plan_name = 'Diamond Plan'
            plan_percent = "7"
            plan_days = "20 Days"
            plan_days_total_install = "15"
            plan_amount = request.POST['amount']

            if float(plan_amount) < float(5000):
                messages.warning(request, 'Minimum amount is '+user_details.currency+'5,000')
            elif float(plan_amount) > float(20000):
                messages.warning(request, 'Maximum amount is '+user_details.currency+'20,000')
            else:
                request.session['loan_plan_name'] = plan_name
                request.session['loan_plan_percent'] = plan_percent
                request.session['loan_plan_days'] = plan_days
                request.session['loan_plan_days_total_install'] = plan_days_total_install
                request.session['loan_plan_amount'] = plan_amount
                return redirect('client_account_loan_apply_form')
        elif 'silver_plan_submit' in request.POST:
            plan_name = 'Silver Plan'
            plan_percent = "10"
            plan_days = "30 Days"
            plan_days_total_install = "11"
            plan_amount = request.POST['amount']

            if float(plan_amount) < float(1000):
                messages.warning(request, 'Minimum amount is '+user_details.currency+'1,000')
            elif float(plan_amount) > float(50000):
                messages.warning(request, 'Maximum amount is '+user_details.currency+'5,000')
            else:
                request.session['loan_plan_name'] = plan_name
                request.session['loan_plan_percent'] = plan_percent
                request.session['loan_plan_days'] = plan_days
                request.session['loan_plan_days_total_install'] = plan_days_total_install
                request.session['loan_plan_amount'] = plan_amount
                return redirect('client_account_loan_apply_form')

        acc_context = {'sel_loans': sel_loans, 'user_details': user_details, 'thirty_days_plan': thirty_days_plan, 'thirty_days_percent': thirty_days_percent,
        'thirty_days': thirty_days, 'thirty_days_total_install': thirty_days_total_install, 'thirty_days_minimum': thirty_days_minimum,
        'thirty_days_maximum': thirty_days_maximum, 'twenty_days_plan': twenty_days_plan, 'twenty_days_percent': twenty_days_percent,
         'twenty_days': twenty_days, 'twenty_days_total_install': twenty_days_total_install, 'twenty_days_minimum': twenty_days_minimum,
          'twenty_days_maximum': twenty_days_maximum, 'second_thirty_days_plan': second_thirty_days_plan, 'second_thirty_days_percent': second_thirty_days_percent,
           'second_thirty_days': second_thirty_days, 'second_thirty_days_total_install': second_thirty_days_total_install,
            'second_thirty_days_minimum': second_thirty_days_minimum, 'second_thirty_days_maximum': second_thirty_days_maximum}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/loan-plans.html', acc_context2)
    else:
        return redirect('login')
    
def account_new_ticket(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/new-ticket.html', acc_context2)
    else:
        return redirect('login')
    
def account_profile(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')

        if 'update' in request.POST:
            input_firstname = request.POST['firstname']
            input_lastname = request.POST['lastname']
            input_phone_number = request.POST['phone_number']
            input_country = request.POST['country']
            input_city = request.POST['city']
            input_zip_code = request.POST['zip_code']
            input_address = request.POST['address']
            new_profile_img = request.FILES.get('image')

            phone_number_pattern = r"[+0123456789]"

            if new_profile_img == None:
                if not re.match(phone_number_pattern, input_phone_number):
                    messages.warning(request, 'Please enter a valid Phone Number')
                else:
                    Users.objects.filter(email=current_user).update(firstname=input_firstname, lastname=input_lastname, phone_number=input_phone_number,
                    country=input_country, city=input_city, zip_code=input_zip_code, address=input_address)
                    messages.success(request, 'Profile updated successfully')
                    return redirect('client_account_profile')
            else:
                file_name = new_profile_img.name
                file_size = new_profile_img.size
                file_type = new_profile_img.content_type.split('/')[0]
                CONTENT_TYPES = ['image']

                # CREATING UNIQUE NUMBERS ON IMAGES
                rand_num_for_file_name = random.randint(1000, 9999)
                rand_file_name = "%s_%s" %(rand_num_for_file_name, file_name)
                if file_size > 10971520:
                    messages.warning(request, 'Your file is larger than 10mb')
                elif not file_type in CONTENT_TYPES:
                    messages.warning(request, 'Only JPEG, JPG, PNG files are allowed')
                else:
                    Users.objects.filter(email=current_user).update(profile_img=rand_file_name, size=file_size, type=file_type)
                    if user_details.profile_img is not None:
                        img_directory = 'swiftguaranteebank/account/passport/'
                        path_dir = os.path.join(img_directory, user_details.profile_img)
                        os.remove(path_dir)
                        fs = FileSystemStorage(location="swiftguaranteebank/account/passport/")
                        fs.save(rand_file_name, new_profile_img)
                        messages.success(request, 'Profile Updated Successfully')
                        return redirect('client_account_profile')
                    else:
                        fs = FileSystemStorage(location="swiftguaranteebank/account/passport/")
                        fs.save(rand_file_name, new_profile_img)
                        messages.success(request, 'Profile Updated Successfully')
                        return redirect('client_account_profile')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/profile.html', acc_context2)
    else:
        return redirect('login')
    
def account_support(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/support.html', acc_context2)
    else:
        return redirect('login')
    
def account_transactions(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transactions.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_cotcode_authenticate(request):
    if 'email' in request.session and 'pin' in request.session and 'transfer_amount' in request.session and 'transfer_acc_no' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')

        if user_details.cot_code == 'off':
            return redirect('client_account_transfer_taxcode_authenticate')

        if 'submit' in request.POST:
            input_cot_code = request.POST['cot_code']

            if not input_cot_code:
                messages.warning(request, 'Please enter your cot code')
            elif not CotCodes.objects.filter(cot_code=input_cot_code, status='Active'):
                messages.warning(request, 'Incorrect/Expired cot code')
            elif user_details.tax_code == 'on':
                request.session['transfer_cot_code'] = input_cot_code
                return redirect('client_account_transfer_taxcode_authenticate')
            elif user_details.tax_code == 'off':
                
                otp = ''.join(random.choice('1234567890') for i in range(6))

                subject = 'Transfer Authentication'

                # import html message.html file
                html_template = 'account/otp-email.html'

                html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'firstname': user_details.firstname, 'lastname': user_details.lastname, 'otp': otp})
                plain_message = strip_tags(html_message)

                send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                Users.objects.filter(email=current_user).update(otp=otp)
                if send_email.send():
                    messages.success(request, 'An OTP code has been sent to your Email Address to verify your transfer request')
                    request.session['transfer_cot_code'] = input_cot_code
                    return redirect('client_account_transfer_otp_authenticate')
                else:
                    messages.warning(request, 'Failed to send message')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-cotcode-authenticate.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_history(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-history.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_money(request):
    get_acc_no = request.GET.get('acc_no')
    get_other_acc_no = request.GET.get('acc_number')
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass

        total_transfers = Transfers.objects.filter(Q(transfer_type='Debit') | Q(transfer_type='Credit')).count()
        # print(total_transfers)
        sel_other_ben = Benificiary.objects.filter(acc_no=get_other_acc_no)
        for sel_other_ben_details in sel_other_ben:
            pass
        sel_ben = Benificiary.objects.filter(acc_no=get_acc_no)
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        sel_site_config = Siteconfig.objects.all()
        for sel_site_details in sel_site_config:
            pass
        
        if sel_ben:
            for sel_acc_details in sel_ben:
                pass

            if 'send' in request.POST:
                acc_no = request.POST['acc_no']
                acc_name = request.POST['acc_name']
                bank_name = request.POST['bank_name']
                # bank_address = request.POST['bank_address']
                # routine_number = request.POST['routine_no']
                amount = request.POST['amount']
                description = request.POST['reason']
                pin = request.POST['pin']

                if not acc_no or not acc_name or not bank_name or not amount or not description or not pin:
                    messages.warning(request, 'All fields are required')
                elif float(amount) > float(user_details.balance):
                    messages.warning(request, 'Insufficient funds!')
                elif float(amount) < float(sel_site_details.minimum_transfer):
                    messages.warning(request, 'Minimum transfer is '+user_details.currency+''+sel_site_details.minimum_transfer+'')
                elif float(amount) > float(user_details.max_transfer_limit):
                    messages.warning(request, 'Maximum single transfer is '+user_details.currency+''+user_details.max_transfer_limit+'')
                elif user_details.status == 'Inactive':
                    messages.warning(request, 'Your account is inactive please contact support for more info.')
                elif not check_password(pin, user_details.pin):
                    messages.warning(request, 'Incorrect pin')
                elif user_details.billing_status == 'on':
                    messages.warning(request, ''+user_details.billing_title+'; '+user_details.billing_message+'')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    # request.session['transfer_bank_address'] = bank_address
                    # request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.tax_code == 'on' and user_details.cot_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    # request.session['transfer_bank_address'] = bank_address
                    # request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_taxcode_authenticate')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'on':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    # request.session['transfer_bank_address'] = bank_address
                    # request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.cot_code == 'off' and user_details.tax_code == 'off':
                    otp = ''.join(random.choice('1234567890') for i in range(6))

                    subject = 'Transfer Authentication'

                    # import html message.html file
                    html_template = 'account/otp-email.html'

                    html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                    'firstname': user_details.firstname, 'lastname': user_details.lastname, 'otp': otp})
                    plain_message = strip_tags(html_message)

                    send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                    send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                    Users.objects.filter(email=current_user).update(otp=otp)
                    if send_email.send():
                        request.session['transfer_acc_no'] = acc_no
                        request.session['transfer_acc_name'] = acc_name
                        request.session['transfer_bank_name'] = bank_name
                        # request.session['transfer_bank_address'] = bank_address
                        # request.session['transfer_routine_no'] = routine_number
                        request.session['transfer_amount'] = amount
                        request.session['transfer_description'] = description
                        messages.success(request, 'An OTP code has been sent to your Email Address to verify your transfer request')
                        return redirect('client_account_transfer_otp_authenticate')
                    else:
                        messages.warning(request, 'Failed to send message')
                    
            
            acc_context = {'total_transfer_count':total_transfers, 'acc_no':sel_acc_details.acc_no, 'acc_name': sel_acc_details.acc_name, 'bank_name': sel_acc_details.bank_name,
            'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
            acc_context2 = {**context, **acc_context}
            return render(request, 'account/transfer-money.html', acc_context2)
        elif sel_other_ben:
            if 'send' in request.POST:
                acc_no = request.POST['acc_no']
                acc_name = request.POST['acc_name']
                bank_name = request.POST['bank_name']
                bank_address = request.POST['bank_address']
                routine_number = request.POST['routine_no']
                amount = request.POST['amount']
                description = request.POST['reason']
                pin = request.POST['pin']
                
                if not acc_no or not acc_name or not bank_name or not bank_address or not routine_number or not amount or not description or not pin:
                    messages.warning(request, 'All fields are required')
                elif float(amount) > float(user_details.balance):
                    messages.warning(request, 'Insufficient funds!')
                elif float(amount) < float(sel_site_details.minimum_transfer):
                    messages.warning(request, 'Minimum transfer is '+user_details.currency+''+sel_site_details.minimum_transfer+'')
                elif float(amount) > float(user_details.max_transfer_limit):
                    messages.warning(request, 'Maximum single transfer is '+user_details.currency+''+user_details.max_transfer_limit+'')
                elif user_details.status == 'Inactive':
                    messages.warning(request, 'Your account is inactive please contact support for more info.')
                elif not check_password(pin, user_details.pin):
                    messages.warning(request, 'Incorrect pin')
                elif user_details.billing_status == 'on':
                    messages.warning(request, ''+user_details.billing_title+'; '+user_details.billing_message+'')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.tax_code == 'on' and user_details.cot_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_taxcode_authenticate')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'on':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.cot_code == 'off' and user_details.tax_code == 'off':
                    otp = ''.join(random.choice('1234567890') for i in range(6))

                    subject = 'Transfer Authentication'

                    # import html message.html file
                    html_template = 'account/otp-email.html'

                    html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                    'firstname': user_details.firstname, 'lastname': user_details.lastname, 'otp': otp})
                    plain_message = strip_tags(html_message)

                    send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                    send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                    Users.objects.filter(email=current_user).update(otp=otp)
                    if send_email.send():
                        request.session['transfer_acc_no'] = acc_no
                        request.session['transfer_acc_name'] = acc_name
                        request.session['transfer_bank_name'] = bank_name
                        request.session['transfer_bank_address'] = bank_address
                        request.session['transfer_routine_no'] = routine_number
                        request.session['transfer_amount'] = amount
                        request.session['transfer_description'] = description
                        messages.success(request, 'An OTP code has been sent to your Email Address to verify your transfer request')
                        return redirect('client_account_transfer_otp_authenticate')
                    else:
                        messages.warning(request, 'Failed to send message')
                
            acc_context = {'acc_no': sel_other_ben_details.acc_no, 'acc_name': sel_other_ben_details.acc_name, 'bank_name': sel_other_ben_details.bank_name,
             'routine_number': sel_other_ben_details.routine_number, 'current_user': current_user_details, 'sel_transfers': sel_user_transfers,
               'user_details': user_details}
            acc_context2 = {**context, **acc_context}
            return render(request, 'account/transfer-money.html', acc_context2)
        else:
            if 'send' in request.POST:
                acc_no = request.POST['acc_no']
                acc_name = request.POST['acc_name']
                bank_name = request.POST['bank_name']
                bank_address = request.POST['bank_address']
                routine_number = request.POST['routine_no']
                amount = request.POST['amount']
                description = request.POST['reason']
                pin = request.POST['pin']
                
                
                if not acc_no or not acc_name or not bank_name or not bank_address or not amount or not description or not pin:
                    messages.warning(request, 'All fields are required')
                elif float(amount) > float(user_details.balance):
                    messages.warning(request, 'Insufficient funds!')
                elif float(amount) < float(sel_site_details.minimum_transfer):
                    messages.warning(request, 'Minimum transfer is '+user_details.currency+''+sel_site_details.minimum_transfer+'')
                elif float(amount) > float(user_details.max_transfer_limit):
                    messages.warning(request, 'Maximum transfer is '+user_details.currency+''+user_details.max_transfer_limit+'')
                elif user_details.status == 'Inactive':
                    messages.warning(request, 'Your account is inactive please contact support for more info.')
                elif not check_password(pin, user_details.pin):
                    messages.warning(request, 'Incorrect pin')
                elif user_details.billing_status == 'on':
                    messages.warning(request, ''+user_details.billing_title+'; '+user_details.billing_message+'')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.tax_code == 'on' and user_details.cot_code == 'off':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_taxcode_authenticate')
                elif user_details.cot_code == 'on' and user_details.tax_code == 'on':
                    request.session['transfer_acc_no'] = acc_no
                    request.session['transfer_acc_name'] = acc_name
                    request.session['transfer_bank_name'] = bank_name
                    request.session['transfer_bank_address'] = bank_address
                    request.session['transfer_routine_no'] = routine_number
                    request.session['transfer_amount'] = amount
                    request.session['transfer_description'] = description
                    return redirect('client_account_transfer_cotcode_authenticate')
                elif user_details.cot_code == 'off' and user_details.tax_code == 'off':
                    otp = ''.join(random.choice('1234567890') for i in range(6))

                    subject = 'Transfer Authentication'

                    # import html message.html file
                    html_template = 'account/otp-email.html'

                    html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                    'firstname': user_details.firstname, 'lastname': user_details.lastname, 'otp': otp})
                    plain_message = strip_tags(html_message)

                    send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                    send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                    Users.objects.filter(email=current_user).update(otp=otp)
                    if send_email.send():
                        request.session['transfer_acc_no'] = acc_no
                        request.session['transfer_acc_name'] = acc_name
                        request.session['transfer_bank_name'] = bank_name
                        request.session['transfer_bank_address'] = bank_address
                        request.session['transfer_routine_no'] = routine_number
                        request.session['transfer_amount'] = amount
                        request.session['transfer_description'] = description
                        messages.success(request, 'An OTP code has been sent to your Email Address to verify your transfer request')
                        return redirect('client_account_transfer_otp_authenticate')
                    else:
                        messages.warning(request, 'Failed to send message')
                
            acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers,
               'user_details': user_details}
            acc_context2 = {**context, **acc_context}
            return render(request, 'account/transfer-money.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_other(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_benificiary = Benificiary.objects.filter(added_by=current_user, type='Other Banks').order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_benificiary': sel_user_benificiary, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-other.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_otp_authenticate(request):
    if 'email' in request.session and 'pin' in request.session and 'transfer_amount' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')

        if not 'transfer_cot_code' in request.session and user_details.cot_code == 'on':
            return redirect('client_account_transfer_cotcode_authenticate')
        elif not 'transfer_tax_code' in request.session and user_details.tax_code == 'on':
            return redirect('client_account_transfer_taxcode_authenticate')

        if 'submit' in request.POST:
            input_otp_code = request.POST['otp_code']

            if not input_otp_code:
                messages.warning(request, 'Please enter your otp code')
            elif not Users.objects.filter(otp=input_otp_code):
                messages.warning(request, 'Incorrect/Expired otp code')
            else:
                if 'transfer_routine_no' in request.session:
                    acc_no = request.session['transfer_acc_no']
                    acc_name = request.session['transfer_acc_name']
                    bank_name = request.session['transfer_bank_name']
                    bank_address = request.session['transfer_bank_address']
                    amount = request.session['transfer_amount']
                    routine_number = request.session['transfer_routine_no']
                    description = request.session['transfer_description']
                    letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
                    trxid = ''.join(random.choice('1234567890') for i in range(7))

                    subject = 'Transaction Notification'

                    # import html message.html file
                    html_template = 'account/transfer-other-success-email.html'

                    html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                    'firstname': user_details.firstname, 'lastname': user_details.lastname, 'currency': user_details.currency, 'amount': amount,
                    'acc_no': acc_no, 'acc_name': acc_name, 'bank_name': bank_name, 'bank_address': bank_address, 'trxid': trxid,
                    'date': mydate.strftime("%Y-%m-%d %H:%M:%S")})
                    plain_message = strip_tags(html_message)

                    send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                    send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                    if send_email.send():
                        prev_bal = user_details.balance
                        new_bal = float(user_details.balance) - float(amount)
                        new_transaction = float(user_details.transactions) + float(1)
                        Users.objects.filter(email=current_user).update(otp=None, balance=new_bal, transactions=new_transaction)
                        transfer_details = Transfers(receiver_fullname=acc_name, acc_no=acc_no, receiver_bank_name=bank_name, receiver_bank_address=bank_address, iban=routine_number,
                        currency=user_details.currency, amount=amount, prev_bal=prev_bal, new_bal=new_bal, description=description, transfer_type='Debit', stat='Other Transfer',
                        email=current_user, sender_acc_no=user_details.acc_no, trxid=trxid, status='Pending', date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                        transfer_details.save()

                        if user_details.tax_code == 'on' and user_details.cot_code == 'on':
                            cot_code = request.session['transfer_cot_code']
                            tax_code = request.session['transfer_tax_code']
                            TaxCodes.objects.filter(tax_code=tax_code).update(status='Expired', used_by=current_user)
                            CotCodes.objects.filter(cot_code=cot_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_bank_address']
                            del request.session['transfer_routine_no']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_cot_code']
                            del request.session['transfer_tax_code']
                        elif user_details.tax_code == 'on' and user_details.cot_code == 'off':
                            tax_code = request.session['transfer_tax_code']
                            TaxCodes.objects.filter(tax_code=tax_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_bank_address']
                            del request.session['transfer_routine_no']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_tax_code']
                        elif user_details.cot_code == 'on' and user_details.tax_code == 'off':
                            cot_code = request.session['transfer_cot_code']
                            CotCodes.objects.filter(cot_code=cot_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_bank_address']
                            del request.session['transfer_routine_no']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_cot_code']
                        else:
                            request.session['sitenames_used'] = sitenames
                            request.session['transfer_acc_no']
                            request.session['transfer_acc_name']
                            request.session['transfer_bank_name']
                            request.session['transfer_bank_address']
                            request.session['transfer_amount']
                            request.session['transfer_routine_no']
                            request.session['transfer_description']
                            request.session['trxid'] = trxid
                            request.session['date'] = mydate.strftime("%Y-%m-%d %H:%M:%S")

                        return redirect('client_account_transfer_success')
                    else:
                        messages.warning(request, 'Failed to send message')
                else:
                    acc_no = request.session['transfer_acc_no']
                    acc_name = request.session['transfer_acc_name']
                    bank_name = request.session['transfer_bank_name']
                    amount = request.session['transfer_amount']
                    description = request.session['transfer_description']
                    letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
                    trxid = ''.join(random.choice(letters) for i in range(7))

                    subject = 'Transaction Notification'

                    # import html message.html file
                    html_template = 'account/transfer-withinbank-success-email.html'

                    html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                    'firstname': user_details.firstname, 'lastname': user_details.lastname, 'currency': user_details.currency, 'amount': amount,
                    'acc_no': acc_no, 'acc_name': acc_name, 'bank_name': bank_name, 'trxid': trxid, 'date': mydate.strftime("%Y-%m-%d %H:%M:%S")})
                    plain_message = strip_tags(html_message)

                    send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
                    send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                    if send_email.send():
                        prev_bal = user_details.balance
                        new_bal = float(user_details.balance) - float(amount)
                        new_transaction = float(user_details.transactions) + float(1)
                        Users.objects.filter(email=current_user).update(otp=None, balance=new_bal, transactions=new_transaction)
                        transfer_details = Transfers(receiver_fullname=acc_name, acc_no=acc_no, receiver_bank_name=bank_name, stat=''+sitenames+' Transfer',
                        currency=user_details.currency, amount=amount, prev_bal=prev_bal, new_bal=new_bal, description=description, transfer_type='Debit', email=current_user,
                        sender_acc_no=user_details.acc_no, trxid=trxid, status='Pending', date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                        transfer_details.save()
                        if user_details.tax_code == 'on' and user_details.cot_code == 'on':
                            cot_code = request.session['transfer_cot_code']
                            tax_code = request.session['transfer_tax_code']
                            TaxCodes.objects.filter(tax_code=tax_code).update(status='Expired', used_by=current_user)
                            CotCodes.objects.filter(cot_code=cot_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_cot_code']
                            del request.session['transfer_tax_code']
                        elif user_details.tax_code == 'on' and user_details.cot_code == 'off':
                            tax_code = request.session['transfer_tax_code']
                            TaxCodes.objects.filter(tax_code=tax_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_tax_code']
                        elif user_details.cot_code == 'on' and user_details.tax_code == 'off':
                            cot_code = request.session['transfer_cot_code']
                            CotCodes.objects.filter(cot_code=cot_code).update(status='Expired', used_by=current_user)
                            del request.session['transfer_acc_no']
                            del request.session['transfer_acc_name']
                            del request.session['transfer_bank_name']
                            del request.session['transfer_amount']
                            del request.session['transfer_description']
                            del request.session['transfer_cot_code']
                        else:
                            #del request.session['transfer_acc_no']
                            #del request.session['transfer_acc_name']
                            #del request.session['transfer_bank_name']
                            #del request.session['transfer_amount']
                            #del request.session['transfer_description']

                            request.session['sitenames_used'] = sitenames
                            request.session['transfer_acc_no']
                            request.session['transfer_acc_name']
                            request.session['transfer_bank_name']
                            request.session['transfer_bank_address'] = sitenames
                            request.session['transfer_amount']
                            #request.session['transfer_routine_no']
                            request.session['transfer_description']
                            request.session['trxid'] = trxid
                            request.session['date'] = mydate.strftime("%Y-%m-%d %H:%M:%S")

                        #request.session['transfer_acc_no']
                        return redirect('client_account_transfer_success')
                    else:
                        messages.warning(request, 'Failed to send message')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/otp-authenticate.html', acc_context2)
    else:
        return redirect('login')

def account_transfer_receipt(request):
    get_trans_id = request.GET.get('trans_id')
    if 'email' in request.session and 'pin' in request.session:
       
        sel_trans = Transfers.objects.filter(id=get_trans_id)
        
        sel_site_config = Siteconfig.objects.all()
        for sel_site_details in sel_site_config:
            pass
        if sel_trans:
            for sel_trans_details in sel_trans:
                pass
        acc_context = {'acc_no':sel_trans_details.acc_no, 'acc_name': sel_trans_details.receiver_fullname, 'bank_name': sel_trans_details.receiver_bank_name,
        'bank_address': sel_trans_details.receiver_bank_address, 'amount': sel_trans_details.amount, 'routine_no': sel_trans_details.iban,
          'description': sel_trans_details.description, 'trxid': sel_trans_details.trxid, 'date': sel_trans_details.date_added, 'sitenames_used':sel_site_details.sitename}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-receipt.html', acc_context2)


def account_transfer_own(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_benificiary = Benificiary.objects.filter(added_by=current_user, type=''+sitenames+' Bank').order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_benificiary': sel_user_benificiary, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-own.html', acc_context2)
    else:
        return redirect('login')
    
def account_transfer_success(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)

        transfer_acc_no = request.session['transfer_acc_no']


        acc_no = request.session['transfer_acc_no']
        acc_name = request.session['transfer_acc_name']
        bank_name = request.session['transfer_bank_name']
        bank_address = request.session.get('transfer_bank_address')
        amount = request.session['transfer_amount']
        sitenames_used = request.session.get('sitenames_used')
        description = request.session['transfer_description']
        trxid = request.session.get('trxid') 
        date = request.session.get('date')


        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')

        if 'transfer_routine_no' in request.session:
            routine_no = request.session['transfer_routine_no']
            acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details, 'routine_no': routine_no, 'acc_no': acc_no, 'acc_name': acc_name, 'bank_name': bank_name, 'bank_address': bank_address, 'amount': amount, 'description': description, 'trxid': trxid, 'date': date, 'sitenames_used': sitenames_used}
            acc_context2 = {**context, **acc_context}
        else:
            acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details, 'acc_no': acc_no, 'acc_name': acc_name, 'bank_name': bank_name, 'bank_address': bank_address, 'amount': amount, 'description': description, 'trxid': trxid, 'date': date, 'sitenames_used': sitenames_used}
            acc_context2 = {**context, **acc_context}

        if 'home_btn' in request.POST:
            if 'transfer_routine_no' in request.session:

                del request.session['sitenames_used']
                del request.session['transfer_acc_no']
                del request.session['transfer_acc_name']
                del request.session['transfer_bank_name']
                del request.session['transfer_bank_address']
                del request.session['transfer_amount']
                del request.session['transfer_routine_no']
                del request.session['transfer_description']
                del request.session['trxid']
                del request.session['date']
            else:
                del request.session['sitenames_used']
                del request.session['transfer_acc_no']
                del request.session['transfer_acc_name']
                del request.session['transfer_bank_name']
                del request.session['transfer_bank_address']
                del request.session['transfer_amount']
                del request.session['transfer_description']
                del request.session['trxid']
                del request.session['date']

            return redirect('client_account_index')
        
        return render(request, 'account/transfer-success.html', acc_context2)
    
    

def account_transfer_taxcode_authenticate(request):
    if 'email' in request.session and 'pin' in request.session and 'transfer_amount' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass

        if user_details.tax_code == 'off':
            return redirect('client_account_transfer_otp_authenticate')

        if 'submit' in request.POST:
            input_tax_code = request.POST['tax_code']
            otp = random.randint(100000, 999999)

            subject = 'Transfer Authentication'

            # import html message.html file
            html_template = 'account/otp-email.html'

            html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
            'firstname': user_details.firstname, 'lastname': user_details.lastname, 'otp': otp})
            plain_message = strip_tags(html_message)

            send_email = EmailMultiAlternatives(subject, plain_message, EMAIL_HOST_USER, [user_details.email])
            send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

            if not input_tax_code:
                messages.warning(request, 'Please enter your tax code')
            elif not TaxCodes.objects.filter(tax_code=input_tax_code, status='Active'):
                messages.warning(request, 'Incorrect/Expired tax code')
            else:
                Users.objects.filter(email=current_user).update(otp=otp)
                if send_email.send():
                    messages.success(request, 'An OTP code has been sent to your Email Address to verify your transfer request')
                    request.session['transfer_tax_code'] = input_tax_code
                    return redirect('client_account_transfer_otp_authenticate')
                else:
                    messages.warning(request, 'Failed to send message')
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/transfer-taxcode-authenticate.html', acc_context2)
    else:
        return redirect('login')
    
def account_twofactor(request):
    if 'email' in request.session and 'pin' in request.session:
        current_user = request.session['email']
        current_user_details = Users.objects.filter(email=current_user)
        for user_details in current_user_details:
            pass
        sel_user_transfers = Transfers.objects.filter(email=current_user).order_by('-id')
        acc_context = {'current_user': current_user_details, 'sel_transfers': sel_user_transfers, 'user_details': user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'account/twofactor.html', acc_context2)
    else:
        return redirect('login')







