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
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
import textwrap
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()
cotcodes = CotCodes.objects.all()
taxcodes = TaxCodes.objects.all()
transfers = Transfers.objects.all()
loans = Loan.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_credit_transfers = Transfers.objects.filter(transfer_type='Credit').aggregate(Sum('amount'))['amount__sum']
#SUM TOTAL WITHDRAWALS
total_debit_transfers = Transfers.objects.filter(transfer_type='Debit').aggregate(Sum('amount'))['amount__sum']
#SUM TOTAL LOANS
total_loans = Loan.objects.all().aggregate(Sum('amount'))['amount__sum']
#SUM TOTAL TRANSFERS
total_transfers = Transfers.objects.all().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, 'cotcodes': cotcodes, 'taxcodes': taxcodes, 'total_transfers': total_transfers, 'total_loans': total_loans,
 'visitors': visitors, 'total_users': total_users, 'total_credit_transfers': total_credit_transfers, 'total_debit_transfers': total_debit_transfers,
  'total_admin': total_admins}

#ADMIN URLS
def adminindex(request):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        for admin_details in current_admin_user_details:
            pass
        sel_total_users = Users.objects.order_by('-id')

        if 'send_billing_message' in request.POST:
            input_user = request.POST['user']
            input_title = request.POST['title']
            input_message = request.POST['message']

            if not input_user or not input_title or not input_message:
                messages.warning(request, 'All fields are required!')
            else:
                Users.objects.filter(email=input_user).update(billing_title=input_title, billing_message=input_message)
                messages.success(request, "Message sent successfully to  "+ input_user +"")
                return redirect('./')

        if 'send_withdraw_billing_message' in request.POST:
            input_user = request.POST['withdraw_user']
            input_title = request.POST['withdraw_title']
            input_message = request.POST['withdraw_message']

            if not input_user or not input_title or not input_message:
                messages.warning(request, 'All fields are required!')
            else:
                Users.objects.filter(email=input_user).update(withdraw_billing_title=input_title, withdraw_billing_message=input_message)
                messages.success(request, "Message sent successfully to  "+ input_user +"")
                return redirect('admin_index')

        acc_context = {'sel_total_users': sel_total_users, 'admin_details': admin_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/index.html', acc_context2)
    else:
        return redirect('admin_login')



def admins(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        sel_admins = Administrator.objects.order_by('-id')
        acc_context = {'select_total_admins': sel_admins , 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/admins.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_regr(request):

    sel_siteconfigs = Siteconfig.objects.filter(id=1)
    for select_setting in sel_siteconfigs:
        pass
    if select_setting.site_admin_reg_link == 'off':
        return redirect('admin_login')
    else:
        if 'register' in request.POST:
            username = request.POST['username']
            #Trim username
            user_username = username.strip()
            fullname = request.POST['fullname']
            #Trim fullname
            fullname = fullname.strip()
            # Capitalize every first letter
            user_fullname = fullname.title()
            user_email = request.POST['email']
            user_password = request.POST['password']
            user_confirm_password = request.POST['confirm_password']
            hashed_password = make_password(user_password)

            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)
                
            if not user_fullname or not user_username or not user_email or not user_password or not user_confirm_password:
                messages.warning(request, 'All fields are required!')
            elif not name_match.search(user_fullname):
                messages.warning(request, 'Please enter a valid Fullname')
            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 Administrator.objects.filter(username=user_username):
                messages.warning(request, "Username already exist! please try other username")
            elif Administrator.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:
                userdetails = Administrator(fullname = user_fullname, email = user_email, username = user_username,
                password = hashed_password, confirm_password = hashed_password, second_password = user_password, 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!")
                return redirect('admin_login')

        return render(request, 'administrator/regr.html', context)



def admin_login(request):

    if request.session.has_key('email_address'):
        return redirect('admin_')
    else:
        if 'login' in request.POST:
            user_email = request.POST['email']
            user_password = request.POST['password']
            
            sel_admin_user = Administrator.objects.filter(email=user_email)
            for sel in sel_admin_user:
                user_dbpass = sel.password

            if not sel_admin_user:
                messages.warning(request, 'Invalid Login Details')
            elif not check_password(user_password, user_dbpass):
                messages.warning(request, 'Wrong Password')
            else:
                #UPDATE USERS LASTLOGIN
                Administrator.objects.filter(email=user_email).update(lastlogin=mydate.strftime("%Y-%m-%d %H:%M:%S"))

                request.session['email_address'] = user_email
                request.session.set_expiry(6000)
                return redirect('admin_')

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



def admin_logout(request):
    if request.session.has_key('email_address'):
        del request.session['email_address']
    return redirect('admin_login')



def admin_registration_block(request):
    return render(request, 'administrator/admin_reg_block.html', context)



def admin_credit_client_account(request):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if 'fund' in request.POST:
            input_client = request.POST['client']
            input_balance_to_fund = request.POST['balance_to_fund']
            input_amount = request.POST['amount'].strip()
            input_receiver = request.POST['receiver']
            input_description = request.POST['description']
            
            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            trxid = ''.join(random.choice('1234567890') for i in range(7))

            if not Users.objects.filter(username=input_client):
                messages.warning(request, 'Client does not exist')
            else:
                sel_all_clients = Users.objects.filter(username=input_client)
                for client_details in sel_all_clients:
                    client_balance = float(client_details.balance)
                    client_transactions = float(client_details.transactions)
                    client_email = client_details.email
                    client_acc_no = client_details.acc_no
                
                
                new_bal = client_balance + float(input_amount)
                new_transaction = int(client_transactions) + int(1)

                subject = 'Transaction Notification'

                # import html message.html file
                html_template = 'administrator/credit-success-email.html'

                html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'firstname': client_details.firstname, 'lastname': client_details.lastname, 'currency': client_details.currency, 'amount': input_amount,
                'new_bal': new_bal, 'description': input_description, '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, [client_details.email])
                send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                if not input_client or not input_balance_to_fund or not input_amount or not input_description or not input_receiver:
                    messages.warning(request, 'All fields are required')
                else:
                    if send_email.send():
                        Users.objects.filter(username=input_client).update(transactions=new_transaction, balance=new_bal)
                        inserttransaction = Transfers(email=client_email, currency=client_details.currency, amount=input_amount, sender_acc_no=client_acc_no, prev_bal=client_balance,
                        new_bal=new_bal, transfer_type='Credit', recipient=input_receiver, description=input_description, status='Success',
                        trxid=trxid,  date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                        inserttransaction.save()
                        messages.success(request, ''+client_details.firstname+' '+client_details.lastname+' account has been credited successfully')
                        return redirect('admin_credit_client_account')
                    else:
                        messages.warning(request, 'Failed to send message!')
        acc_context = {'select_users': users , 'current_admin_user': current_admin_user, 'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/credit-client-account.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_debit_client_account(request):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if 'fund' in request.POST:
            input_client = request.POST['client']
            input_amount = request.POST['amount'].strip()
            input_receiver = request.POST['receiver']
            input_description = request.POST['description']
            
            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            trxid = ''.join(random.choice('1234567890') for i in range(7))

            if not Users.objects.filter(username=input_client):
                messages.warning(request, 'Client does not exist')
            else:
                sel_all_clients = Users.objects.filter(username=input_client)
                for client_details in sel_all_clients:
                    client_balance = float(client_details.balance)
                    client_transactions = float(client_details.transactions)
                    client_email = client_details.email
                    client_acc_no = client_details.acc_no
                
                
                new_bal = client_balance - float(input_amount)
                new_transaction = int(client_transactions) + int(1)

                subject = 'Transaction Notification'

                # import html message.html file
                html_template = 'administrator/debit-success-email.html'

                html_message = render_to_string(html_template, {'sitelink': sitelink, 'sitelink2': sitelink2, 'sitename': sitenames,
                'firstname': client_details.firstname, 'lastname': client_details.lastname, 'currency': client_details.currency, 'amount': input_amount,
                'new_bal': new_bal, 'description': input_description, '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, [client_details.email])
                send_email.attach_alternative(html_message, 'text/html') # this is required because there is no plain text email message

                if not input_client or not input_amount or not input_description or not input_receiver:
                    messages.warning(request, 'All fields are required')
                elif float(client_balance) < float(input_amount):
                    messages.warning(request, 'Client balance is less than the specified amount you wish to debit!')
                else:
                    if send_email.send():
                        Users.objects.filter(username=input_client).update(transactions=new_transaction, balance=new_bal)
                        inserttransaction = Transfers(email=client_email, currency=client_details.currency, amount=input_amount, sender_acc_no=client_acc_no, prev_bal=client_balance,
                        new_bal=new_bal, transfer_type='Debit', recipient=input_receiver, description=input_description, status='Success',
                        trxid=trxid,  date_added=mydate.strftime("%Y-%m-%d %H:%M:%S"))
                        inserttransaction.save()
                        messages.success(request, ''+client_details.firstname+' '+client_details.lastname+' account has been debited successfully')
                        return redirect('admin_debit_client_account')
                    else:
                        messages.warning(request, 'Failed to send message!')
        acc_context = {'select_users': users , 'current_admin_user': current_admin_user, 'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/debit-client-account.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_approved_loans(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_loans = Loan.objects.filter(status='Approved').order_by('-id')
        for loan_details in select_loans:
            pass

        acc_context = {'sel_loans': select_loans, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/approved-loans.html', acc_context2)
    else:
        return redirect('admin_login')
    

def admin_account_action(request):
    return render(request, 'administrator/account-action.html', context)



def admin_account_block(request):
    return render(request, 'administrator/account-block.html', context)



def admin_account_document(request):
    return render(request, 'administrator/account-document.html', context)



def admin_active_cotcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        sel_active_cotcode = CotCodes.objects.filter(status='Active')
        acc_context = {'select_active_cotcode_details': sel_active_cotcode, 'current_admin_user': current_admin_user,
              'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/active-cotcodes.html', acc_context2)
    else:
        return redirect('admin_login')
    

def admin_active_taxcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        sel_active_taxcode = TaxCodes.objects.filter(status='Active')
        acc_context = {'select_active_taxcode_details': sel_active_taxcode, 'current_admin_user': current_admin_user,
              'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/active-taxcodes.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_billing_update(request):
    return render(request, 'administrator/billingUpdate.html', context)


def admin_credit_transfers(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_transfers = Transfers.objects.filter(transfer_type='Credit').order_by('-id')
        for transfer_details in select_transfers:
            pass

        acc_context = {'sel_transfers': select_transfers, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/credit-transfers.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_change_password(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if 'change-password' in request.POST:
            current_pass = request.POST['current_password']
            new_pass = request.POST['new_password']
            confirm_pass = request.POST['confirm_password']
            hash_password = make_password(new_pass)
            
            current_admin_details = Administrator.objects.filter(email=current_admin_user)
            for check_current_admin_user_details in current_admin_details:
                check_pass = check_current_admin_user_details.password

            if not current_pass or not new_pass or not confirm_pass:
                messages.warning(request, 'All fields are required')
            elif not check_password(current_pass, check_pass):
                messages.warning(request, 'Wrong Current Password')
            elif new_pass != confirm_pass:
                messages.warning(request, 'Password does not match')
            else:
                #UPDATE PASSWORD
                Administrator.objects.filter(email=current_admin_user).update(password=hash_password, confirm_password=hash_password, second_password=new_pass)
                messages.success(request, 'Password Changed Successfully')
                return redirect('admin_index')

        acc_context = {'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/change-password.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_debit_transfers(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_transfers = Transfers.objects.filter(transfer_type='Debit').order_by('-id')
        for transfer_details in select_transfers:
            pass

        acc_context = {'sel_transfers': select_transfers, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/debit-transfers.html', acc_context2)
    else:
        return redirect('admin_login')
    

def admin_decline_verification(request):
    return render(request, 'administrator/decline-verification.html', context)



def admin_decline_withdrawal(request):
    return render(request, 'administrator/decline-withdrawal.html', context)



def delete_admin(request, admin_id):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if admin_id:
            sel_delete_admin_details = Administrator.objects.filter(username=admin_id)
            for sel_delete_details in sel_delete_admin_details:
                delete_username = sel_delete_details.username
            messages.success(request, ''+delete_username+' admin account has been deleted successfully')
            delete_admin = Administrator.objects.get(username=admin_id).delete()
            if delete_admin:
                return redirect('admins')

        acc_context = {'admin_id': admin_id, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/delete_admin.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_declined_loans(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_loans = Loan.objects.filter(status='Declined').order_by('-id')
        for loan_details in select_loans:
            pass

        acc_context = {'sel_loans': select_loans, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/declined-loans.html', acc_context2)
    else:
        return redirect('admin_login')

def admin_declined_transfers(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_transfers = Transfers.objects.filter(status='Declined').order_by('-id')
        for transfer_details in select_transfers:
            pass

        acc_context = {'sel_transfers': select_transfers, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/declined-transfers.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_delete_cotcode(request, delete_id, delete_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if delete_id:
            messages.success(request, 'Cotcode deleted successfully')
            delete_cotcode = CotCodes.objects.get(id=delete_id).delete()
            if delete_cotcode:
                if delete_action == 'Expired':
                    return redirect('expired_cotcodes')
                elif delete_action == 'Active':
                    return redirect('active_cotcodes')
    else:
        return redirect('admin_login')
    

def admin_delete_taxcode(request, delete_id, delete_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if delete_id:
            messages.success(request, 'Taxcode deleted successfully')
            delete_taxcode = TaxCodes.objects.get(id=delete_id).delete()
            if delete_taxcode:
                if delete_action == 'Expired':
                    return redirect('expired_taxcodes')
                elif delete_action == 'Active':
                    return redirect('active_taxcodes')
    else:
        return redirect('admin_login')
    


def admin_delete_member(request, user_id):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if user_id:
            sel_delete_user_details = Users.objects.filter(id=user_id)
            for sel_delete_details in sel_delete_user_details:
                delete_username = sel_delete_details.username
            messages.success(request, ''+delete_username+' account has been deleted successfully')
            delete_user = Users.objects.get(id=user_id).delete()
            if delete_user:
                return redirect('users')

        acc_context = {'user_id': user_id , 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/delete_member.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_delete_loan(request, delete_id, delete_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if delete_id:
            messages.success(request, 'loan deleted successfully')
            delete_loan = loans.objects.get(id=delete_id).delete()
            if delete_loan:
                if delete_action == 'Pending':
                    return redirect('pending_loans')
                elif delete_action == 'Approved':
                    return redirect('approved_loans')
                elif delete_action == 'Declined':
                    return redirect('declined_loans')
                else:
                    return redirect('admin_loans')
    else:
        return redirect('admin_login')


def admin_delete_transfer(request, delete_id, delete_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if delete_id:
            messages.success(request, 'transfer deleted successfully')
            delete_transfer = Transfers.objects.get(id=delete_id).delete()
            if delete_transfer:
                if delete_action == 'Credit':
                    return redirect('credit_transfers')
                else:
                    return redirect('debit_transfers')
    else:
        return redirect('admin_login')
    

def admin_delete_loan(request, delete_id, delete_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if delete_id:
            messages.success(request, 'loan deleted successfully')
            delete_loan = Loan.objects.get(id=delete_id).delete()
            if delete_loan:
                if delete_action == 'Loans':
                    return redirect('admin_loans')
                elif delete_action == 'Pending':
                    return redirect('pending_loans')
                else:
                    return redirect('approved_loans')
    else:
        return redirect('admin_login')


def admin_edit_member(request, user_id):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        user_id_detail = Users.objects.filter(username=user_id)
        if not user_id_detail:
            return redirect('users')

        for sel_member_details in user_id_detail:
            pass

        if 'update' in request.POST:
            input_firstname = request.POST['firstname']
            input_lastname = request.POST['lastname']
            input_address = request.POST['address']
            input_city = request.POST['city']
            input_phone_number = request.POST['phone_number']
            input_balance = request.POST['balance']
            input_status = request.POST['status']
            input_cot_code = request.POST['cot_code']
            input_tax_code = request.POST['tax_code']
            input_max_transfer_limit = request.POST['max_transfer_limit']

            Users.objects.filter(username=user_id).update(firstname=input_firstname, lastname=input_lastname, address=input_address, city=input_city,
            phone_number=input_phone_number, balance=input_balance, cot_code=input_cot_code, tax_code=input_tax_code, max_transfer_limit=input_max_transfer_limit, status=input_status)
            messages.success(request, ''+user_id+' profile updated successfully')
            return redirect('users')
        acc_context = {'user_id_details': user_id, 'sel_member_details': sel_member_details,
         'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/edit_member.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_edit_loan(request, loan_id):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        sel_loan_id = Loan.objects.filter(id=loan_id)
        if not sel_loan_id:
            return redirect('loans')

        for sel_loan_details in sel_loan_id:
            pass

        if 'update_loan' in request.POST:
            input_installment = request.POST['installment']
            input_next_installment = request.POST['next_installment']
            input_payback = request.POST['payback']
            input_paid = request.POST['paid']
            input_date = request.POST['date']
            input_status = request.POST['status']

            Loan.objects.filter(id=loan_id).update(installment=input_installment, next_installment=input_next_installment, payback=input_payback,
            paid=input_paid, date_added=input_date, status=input_status)
            messages.success(request, ''+sel_loan_details.email+' loan updated successfully')
            return redirect('admin_loans')
        acc_context = {'sel_loan_details': sel_loan_details, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/edit-loan.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_edit_transfer(request, transfer_id):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        sel_transfer_id = Transfers.objects.filter(id=transfer_id)
        if not sel_transfer_id:
            return redirect('transfers')

        for sel_transfer_details in sel_transfer_id:
            pass

        if 'update_transfer' in request.POST:
            input_email = request.POST['email']
            input_amount = request.POST['amount']
            input_new_bal = request.POST['new_bal']
            input_prev_bal = request.POST['prev_bal']
            input_date_added = request.POST['date_added']
            input_status = request.POST['status']

            Transfers.objects.filter(id=transfer_id).update(new_bal=input_new_bal, email=input_email, amount=input_amount,
                  prev_bal=input_prev_bal, date_added=input_date_added, status=input_status)
            messages.success(request, ''+sel_transfer_details.email+' transfer updated successfully')
            return redirect('transfers')
        acc_context = {'sel_transfer_details': sel_transfer_details, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/edit-transfer.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_expired_cotcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        sel_expired_cotcode = CotCodes.objects.filter(status='Expired')
        acc_context = {'select_expired_cotcode_details': sel_expired_cotcode, 'current_admin_user': current_admin_user,
              'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/expired-cotcodes.html', acc_context2)
    else:
        return redirect('admin_login')
    

def admin_expired_taxcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        sel_expired_taxcode = TaxCodes.objects.filter(status='Expired')
        acc_context = {'select_expired_taxcode_details': sel_expired_taxcode, 'current_admin_user': current_admin_user,
              'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/expired-taxcodes.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_forgot_password(request):
    if 'send' 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 = 'administrator/forgot-password-mail.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 = Administrator.objects.filter(email=input_email)
        if not check_user_email:
            messages.warning(request, 'Email does not exist')
        else:
            if send_email.send():
                Administrator.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('admin_forgot_password')
            else:
                messages.warning(request, 'Failed to send email message')

    return render(request, 'administrator/forgot-password.html', context)



def admin_reset_password(request, reset_token):
    sel_token = Administrator.objects.filter(reset_token=reset_token)
    if not sel_token:
        messages.warning(request, 'Wrong token')
        return redirect('admin_login')
    else:
        if 'reset' in request.POST:
            input_new_password = request.POST['new_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:
               Administrator.objects.filter(reset_token=reset_token).update(reset_token = None, password = hashed_password,
                     confirm_password = hashed_password, second_password = input_new_password)
               messages.success(request, 'Password reset successfully')
               return redirect('admin_login')
    return render(request, 'administrator/reset-password.html', context)


def admin_loans(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_loans = Loan.objects.all().order_by('-id')
        for loan_details in select_loans:
            pass

        acc_context = {'sel_loans': select_loans, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/loans.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_pending_loans(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_loans = Loan.objects.filter(status='Requested').order_by('-id')
        for loan_details in select_loans:
            pass

        acc_context = {'sel_loans': select_loans, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/pending-loans.html', acc_context2)
    else:
        return redirect('admin_login')
    
# def admin_new_account_action(request):
#     return render(request, 'administrator/new-account-action.html', context)



def admin_new_cotcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        for sel_admin_details in current_admin_user_details:
            pass

        if 'add_cotcode' in request.POST:
            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            cotcode = 'C-'+''.join(random.choice(letters) for i in range(10))
            print(cotcode)

            cotcode_details = CotCodes(added_by=sel_admin_details.username, cot_code=cotcode, date_added = mydate.strftime("%Y-%m-%d %H:%M:%S"))
            cotcode_details.save()
            messages.success(request, 'Cotcode added successfully')
            return redirect('active_cotcodes')
        
        acc_context = {'current_admin_user': current_admin_user, 'current_admin_user_details': sel_admin_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/new-cotcode.html', acc_context2)
    else:
        return redirect('admin_login')
    


def admin_new_taxcode(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        for sel_admin_details in current_admin_user_details:
            pass

        if 'add_taxcode' in request.POST:
            letters = "1234567890QWERTYUIOPLKJHGFDSAXCVBNM"
            taxcode = 'T-'+''.join(random.choice(letters) for i in range(10))
            print(taxcode)

            taxcode_details = TaxCodes(added_by=sel_admin_details.username, tax_code=taxcode, date_added = mydate.strftime("%Y-%m-%d %H:%M:%S"))
            taxcode_details.save()
            messages.success(request, 'Taxcode added successfully')
            return redirect('active_taxcodes')
        
        acc_context = {'current_admin_user': current_admin_user, 'current_admin_user_details': sel_admin_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/new-taxcode.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_pending_transfers(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_transfers = Transfers.objects.filter(status='Pending').order_by('-id')
        for transfer_details in select_transfers:
            pass

        acc_context = {'sel_transfers': select_transfers, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/pending-transfers.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_settings(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        for select_details_ in current_admin_user_details:
            pass

        if 'update_settings' in request.POST:
            input_username = request.POST['username']

            Administrator.objects.filter(email=current_admin_user).update(username=input_username)
            messages.success(request, 'Profile updated successfully')
            return redirect('settings')
        
        acc_context = {'current_admin_user': current_admin_user, 'current_admin_user_details': select_details_}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/settings.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_site_settings(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if 'update_site_settings' in request.POST:
            new_site_address = request.POST['site_address']
            new_phone_number = request.POST['phone_number']
            new_minimum_transfer = request.POST['minimum_transfer']
            new_maximum_transfer = request.POST['maximum_transfer']
            new_reg_switch = request.POST['reg_switch']


            if not new_site_address or not new_phone_number or not new_minimum_transfer or not new_maximum_transfer or not new_reg_switch:
                messages.warning(request, 'All fields are required')
            else:
                Siteconfig.objects.filter(id=1).update(siteaddress=new_site_address, sitenumber=new_phone_number, minimum_transfer=new_minimum_transfer, maximum_transfer=new_maximum_transfer, site_admin_reg_link=new_reg_switch)
                messages.success(request, 'Site Settings updated successfully')
                return redirect('site_settings')
        
        sel_siteconfigs = Siteconfig.objects.filter(id=1)
        for select_setting in sel_siteconfigs:
            pass
        acc_context = {'select_users': users, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details, 'select_settings': select_setting}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/site-settings.html', acc_context2)
    else:
        return redirect('admin_login')

def admin_transfers(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        select_transfers = Transfers.objects.all().order_by('-id')
        for transfer_details in select_transfers:
            pass

        acc_context = {'sel_transfers': select_transfers, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/transfers.html', acc_context2)
    else:
        return redirect('admin_login')

def admin_update_wallet(request):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)

        if 'update_wallet' in request.POST:
            new_btc_wallet = request.POST['btc_wallet']
            new_eth_wallet = request.POST['eth_wallet']
            new_tron_wallet = request.POST['tron_wallet']


            if not new_btc_wallet or not new_eth_wallet or not new_tron_wallet:
                messages.warning(request, 'All fields are required')
            else:
                Siteconfig.objects.update(btc_wallet=new_btc_wallet, eth_wallet=new_eth_wallet, tron_wallet=new_tron_wallet)
                messages.success(request, 'Wallet updated successfully')
                return redirect('update_wallet')
        
        sel_siteconfigs = Siteconfig.objects.all()
        for select_wallet in sel_siteconfigs:
            pass
        acc_context = {'select_users': users, 'current_admin_user': current_admin_user,
         'current_admin_user_details': current_admin_user_details, 'select_wallets': select_wallet}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/update_wallet.html', acc_context2)
    else:
        return redirect('admin_login')


def admin_update_loan(request, loan_id, loan_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        # get_loan_id = request.GET.get('id')
        # get_loan_action = request.GET.get('action')

        if loan_id and loan_action == 'approve':
            Loan.objects.filter(id=loan_id).update(status='Approved')
            messages.success(request, 'loan approved successfully')
            return redirect('approved_loans')
        elif loan_id and loan_action == 'delete':
            Loan.objects.filter(id=loan_id).delete()
            messages.success(request, 'loan deleted successfully')
            return redirect('admin_loans')
        elif loan_id and loan_action == 'decline':
            Loan.objects.filter(id=loan_id).update(status='Declined')
            messages.success(request, 'Loan Declined successfully')
            return redirect('declined_loans')
        else:
            pass  
        return redirect('admin_loans')
    else:
        return redirect('admin_login')


def admin_update_transfer(request, transfer_id, transfer_action):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        # get_transfer_id = request.GET.get('id')
        # get_transfer_action = request.GET.get('action')

        if transfer_id and transfer_action == 'success':
            Transfers.objects.filter(id=transfer_id).update(status='success')
            messages.success(request, 'transfer approved successfully')
            return redirect('transfers')
        elif transfer_id and transfer_action == 'delete':
            Transfers.objects.filter(id=transfer_id).delete()
            messages.success(request, 'transfer deleted successfully')
            return redirect('transfers')
        elif transfer_id and transfer_action == 'decline':
            Transfers.objects.filter(id=transfer_id).update(status='Declined')
            messages.success(request, 'transfer Declined successfully')
            return redirect('transfers')
        else:
            pass  
        return redirect('transfers')
    else:
        return redirect('admin_login')




def admin_users(request):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        for admin_details in current_admin_user_details:
            pass
        sel_total_users = Users.objects.order_by('-id')
        # for client_details in sel_total_users:
        #     pass
        
        acc_context = {'sel_total_users': sel_total_users, 'admin_details': admin_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/users.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_view_profile(request, user_id):
    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        get_user_id = Users.objects.filter(email=user_id)
        sel_user_transactions = Transfers.objects.filter(email=user_id).order_by('-id')
        
        if not get_user_id:
            return redirect('users')
        
        for select_user_details in get_user_id:
            pass

        for transfer_details in sel_user_transactions:
            pass
        sel_user_details = Users.objects.filter(email=transfer_details.email)
        for client_details in sel_user_details:
            pass

        acc_context = {'client_details': client_details, 'select_user_transactions': sel_user_transactions, 'user_details': select_user_details,
        'current_admin_user': current_admin_user, 'current_admin_user_details': current_admin_user_details}
        acc_context2 = {**context, **acc_context}
        return render(request, 'administrator/view-profile.html', acc_context2)
    else:
        return redirect('admin_login')



def admin_verifications(request):
    return render(request, 'administrator/verifications.html', context)



def admin_view_verification(request):
    return render(request, 'administrator/view-verification.html', context)


def admin_billing_update(request):

    if 'email_address' in request.session:
        current_admin_user = request.session['email_address']
        current_admin_user_details = Administrator.objects.filter(email=current_admin_user)
        user_id = request.GET.get('user')
        billing_action = request.GET.get('action')

        if user_id and billing_action == 'active':
            Users.objects.filter(email=user_id).update(billing_status='on')
            messages.success(request, 'Billing status has been set as Active')
            return redirect('./')
        elif user_id and billing_action == 'clear':
            Users.objects.filter(email=user_id).update(billing_message=None, billing_title=None, billing_status='off')
            messages.success(request, 'Billing message has been deleted successfully')
            return redirect('./')
        elif user_id and billing_action == 'inactive':
            Users.objects.filter(email=user_id).update(billing_status='off')
            messages.success(request, 'Billing status has been set as Inactive')
            return redirect('./')
    else:
        return redirect('admin_login')

# # sttt = 'Hello dear how are you doing nice to meet you and you are welcome'
# # print(textwrap.fill(sttt, 10))
# # mydate = datetime.now()
# # print(mydate.strftime("%Y-%m-%d %H:%M:%S"))