from django.shortcuts import render
import requests
from django.contrib.auth.decorators import permission_required
import json
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.views.generic.base import View 
from django.utils.decorators import method_decorator
from datetime import datetime
from os import system
import json
import subprocess
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from .models import SerialKeys


#Converting a month to a numerical form
def DateToNumber(date_act):
    if date_act[3:6] == 'Jan':
        date_act = date_act.replace('Jan', '01')
    elif date_act[3:6] == 'Feb':
        date_act = date_act.replace('Feb', '02')
    elif date_act[3:6] == 'Mar':
        date_act = date_act.replace('Mar', '03')
    elif date_act[3:6] == 'Apr':
        date_act = date_act.replace('Apr', '04')
    elif date_act[3:6] == 'May':
        date_act = date_act.replace('May', '05')
    elif date_act[3:6] == 'June':
        date_act = date_act.replace('June', '06')
    elif date_act[3:6] == 'Jun':
        date_act = date_act.replace('Jun', '06')
    elif date_act[3:6] == 'July':
        date_act = date_act.replace('July', '07')
    elif date_act[3:6] == 'Jul':
        date_act = date_act.replace('Jul', '07')
    elif date_act[3:6] == 'Aug':
        date_act = date_act.replace('Aug', '08')
    elif date_act[3:6] == 'Sept':
        date_act = date_act.replace('Sept', '09')
    elif date_act[3:6] == 'Sep':
        date_act = date_act.replace('Sep', '09')
    elif date_act[3:6] == 'Oct':
        date_act = date_act.replace('Oct', '10')
    elif date_act[3:6] == 'Nov':
        date_act = date_act.replace('Nov', '11')
    elif date_act[3:6] == 'Dec':
        date_act = date_act.replace('Dec', '12')
    return date_act
#######################################


#Main function
class SerialKeysViev(View):
    
    def get(self, request):

        #Authorization check
        username = request.user.username
        if username != "":
            username = username
        else:
            return redirect('/admin/login/?next=/')
        #####################
        
        #Request for a list of keys
        str_cmd_get_keys = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial list'
        keys = str(subprocess.run(str_cmd_get_keys, shell=True, stdout=subprocess.PIPE)).split('\\n')
        ###########################

        #declaring variables for a lists
        all_keys = []
        all_act_keys = []
        all_not_act_keys = []
        ################################




        #AN EXCEPTION With one key, the output of the terminal is different.
        if 'total 1' in keys[1]:
            book = []
            book.append(keys)
            book.append(keys)
            book.append(keys)
            book.append(keys)
            book.append(keys)
            keys = book
            for i in keys:
                i = str(i)
                serial_number = i[i.find("key:") + 4:i.find("key:") +24]
                date_act = 'not activated'
                expired = 'not activated'
                active = i[i.find("key:") +21 + 4:i.find("total") -4]
                #############################

                #Request to the cbd for detailed information about the serial key
                str_cmd_get_info = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial info -serial ' + serial_number
                key_info = subprocess.run(str_cmd_get_info, shell=True, stdout=subprocess.PIPE)
                key_info = str(key_info).split('\\n')
                key_info = json.dumps(key_info)
                #################################################################

                #License duration and activation date
                license_lenth = key_info[key_info.find('"license length') + 17:key_info.find('\\')]
                activate = key_info[key_info.find("stdout=b'serial") + 36:key_info.find('",')]
                #####################################

                #getting activation date, duration, etc. List building
                if activate == 'not activated':
                    all_not_act_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                
                if activate != 'not activated':
                    activate = key_info[key_info.find("activated") + 10:key_info.find('+')]
                    date_act = (DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[:6] + '20' + ((DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[6:])
                    #date_act = date_act[:6] + '20' + date_act[6:]  #date_act = activate[5:14]  #date_act = date_act.replace(' ', ':')  #time_act = activate[15:24]     #date_act = DateToNumber(date_act) + ' ' + time_act
                    expired = key_info[key_info.find("expired") + 9:key_info.find('//')]
                    activate = 'activated'
                    all_act_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                all_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                #######################################################
        #end of EXCEPTION###################################################



        else:
            #Going through the resulting list of serial keys
            for i in keys[0:100]:
                #values ​​for non-activated keys
                date_act = 'not activated'
                expired = 'not activated'
                #############################

                #Request to the cbd for detailed information about the serial key
                str_cmd_get_info = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial info -serial ' + i[:19]
                key_info = subprocess.run(str_cmd_get_info, shell=True, stdout=subprocess.PIPE)
                key_info = str(key_info).split('\\n')
                key_info = json.dumps(key_info)
                #################################################################

                #License duration and activation date
                license_lenth = key_info[key_info.find('"license length') + 17:key_info.find('\\')]
                activate = key_info[key_info.find("stdout=b'serial") + 36:key_info.find('",')]
                #####################################

                #getting activation date, duration, etc. List building
                if activate == 'not activated':
                    all_not_act_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                
                if activate != 'not activated':
                    activate = key_info[key_info.find("activated") + 10:key_info.find('+')]
                    date_act = (DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[:6] + '20' + ((DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[6:])
                    #date_act = date_act[:6] + '20' + date_act[6:]  #date_act = activate[5:14]  #date_act = date_act.replace(' ', ':')  #time_act = activate[15:24]     #date_act = DateToNumber(date_act) + ' ' + time_act
                    expired = key_info[key_info.find("expired") + 9:key_info.find('//')]
                    activate = 'activated'
                    all_act_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                all_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                #######################################################

        #Slicing of unwanted list values ​​stored in response to request
        all_keys = (all_keys[1:-3])
        all_act_keys = (all_act_keys[1:-3])
        ##############################################################

        #Recording the number of serial keys
        number_keys = {'all_number': len(all_keys), 'act_number': len(all_act_keys), 'not_act_number': len(all_not_act_keys)}
        ####################################

        #Sort using lambda function by date from newest to oldest
        try:
            all_keys = (sorted(all_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_keys = all_keys
        try:
            all_act_keys = (sorted(all_act_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_act_keys = all_act_keys
        try:
            all_not_act_keys = (sorted(all_not_act_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_not_act_keys = all_not_act_keys
        #########################################################

        #The final list of serial keys after sorting
        result = ({'all_keys': all_keys, 'all_act_keys': all_act_keys, 'all_not_act_keys': all_not_act_keys,  'number_keys': number_keys,})
        ############################################

        #Selecting the output list depending on the subquery parameter
        see_all_keys = request.GET.get('all_keys')
        see_act_keys = request.GET.get('act_keys')
        see_not_act_keys = request.GET.get('deact_keys')
        ##############################################################

        #Implementing pagination with django-paginator
        if see_all_keys != None:
            paginator = Paginator(result['all_keys'], 10)
        elif see_act_keys != None:
            paginator = Paginator(result['all_act_keys'], 10)
        elif see_not_act_keys != None:
            paginator = Paginator(result['all_not_act_keys'], 10)
        else:
            paginator = Paginator(result['all_keys'], 10)
        page_number = request.GET.get('?page')
        if page_number == None:
            page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        ##############################################
        print(page_obj)
        #Variable for displaying the name of the authorized user
        whois = {'whois': request.user.username}
        ########################################################
        print(result['all_keys'])
        return render(request, "index.html", {"allKeys_list":result['all_keys'], "number": result['number_keys'], 'page_obj': page_obj, 'whois': whois, 'username': username},)


#Serial key deactivation
def deactivate(request):

    if 'q' in request.GET:
        
        #generating parameters for redirecting to the previous page
        prev_page = request.META.get('HTTP_REFERER')
        if '&' in prev_page:
            param1 = prev_page[prev_page.find('?') + 0:prev_page.find('&')]
            param2 = prev_page[prev_page.find('&') + 1:]
        else:
            param1 = prev_page[prev_page.find('?') + 0:]
            if param1 == '/':
                param1 = ''
            param2 = ''
        prev_page = {'param1': param1, 'param2': param2}
        ############################################################

        #request to the cdb to deactivate the serial key
        key_to_deactivate = str(request.GET['q'])
        str_cmd_deactivate = 'cellframe-node-cli vpn_cdb serial delete -serial ' + str(key_to_deactivate)
        str_cmd_deactivate = subprocess.run(str_cmd_deactivate, shell=True, stdout=subprocess.PIPE)
        str_cmd_deactivate = str(str_cmd_deactivate).split('\\n')
        str_cmd_deactivate = json.dumps(str_cmd_deactivate)
        if 'already' in str_cmd_deactivate:
            message = request.GET['q'] + ' already deactivated'
        else:
            message = request.GET['q'] + ' successfully deactivated'
        #################################################

        #Recording in the database the number and date of deactivation of the serial
        write_change = SerialKeys()
        write_change.number = key_to_deactivate
        write_change.datetime = str(datetime.now())
        write_change.save()
        ############################################################################

        return render(request, "deact_success.html", {'message': message, 'prev_page': prev_page})
    else:
        return HttpResponse('Error')


def testView(self, request):
    def get(self, request):

        #Authorization check
        username = request.user.username
        if username != "":
            username = username
        else:
            return redirect('/admin/login/?next=/')
        #####################
        
        #Request for a list of keys
        str_cmd_get_keys = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial list'
        keys = str(subprocess.run(str_cmd_get_keys, shell=True, stdout=subprocess.PIPE)).split('\\n')
        ###########################

        #declaring variables for a lists
        all_keys = []
        all_act_keys = []
        all_not_act_keys = []
        ################################




        #AN EXCEPTION With one key, the output of the terminal is different.
        if 'total 1' in keys[1]:
            book = []
            book.append(keys)
            book.append(keys)
            book.append(keys)
            book.append(keys)
            book.append(keys)
            keys = book
            for i in keys:
                i = str(i)
                serial_number = i[i.find("key:") + 4:i.find("key:") +24]
                date_act = 'not activated'
                expired = 'not activated'
                active = i[i.find("key:") +21 + 4:i.find("total") -4]
                #############################

                #Request to the cbd for detailed information about the serial key
                str_cmd_get_info = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial info -serial ' + serial_number
                key_info = subprocess.run(str_cmd_get_info, shell=True, stdout=subprocess.PIPE)
                key_info = str(key_info).split('\\n')
                key_info = json.dumps(key_info)
                #################################################################

                #License duration and activation date
                license_lenth = key_info[key_info.find('"license length') + 17:key_info.find('\\')]
                activate = key_info[key_info.find("stdout=b'serial") + 36:key_info.find('",')]
                #####################################

                #getting activation date, duration, etc. List building
                if activate == 'not activated':
                    all_not_act_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                
                if activate != 'not activated':
                    activate = key_info[key_info.find("activated") + 10:key_info.find('+')]
                    date_act = (DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[:6] + '20' + ((DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[6:])
                    #date_act = date_act[:6] + '20' + date_act[6:]  #date_act = activate[5:14]  #date_act = date_act.replace(' ', ':')  #time_act = activate[15:24]     #date_act = DateToNumber(date_act) + ' ' + time_act
                    expired = key_info[key_info.find("expired") + 9:key_info.find('//')]
                    activate = 'activated'
                    all_act_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                all_keys.append(({'key': serial_number, 'active': active, 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                #######################################################
        #end of EXCEPTION###################################################



        else:
            #Going through the resulting list of serial keys
            for i in keys[0:100]:
                #values ​​for non-activated keys
                date_act = 'not activated'
                expired = 'not activated'
                #############################

                #Request to the cbd for detailed information about the serial key
                str_cmd_get_info = '/opt/cellframe-node/bin/cellframe-node-cli vpn_cdb serial info -serial ' + i[:19]
                key_info = subprocess.run(str_cmd_get_info, shell=True, stdout=subprocess.PIPE)
                key_info = str(key_info).split('\\n')
                key_info = json.dumps(key_info)
                #################################################################

                #License duration and activation date
                license_lenth = key_info[key_info.find('"license length') + 17:key_info.find('\\')]
                activate = key_info[key_info.find("stdout=b'serial") + 36:key_info.find('",')]
                #####################################

                #getting activation date, duration, etc. List building
                if activate == 'not activated':
                    all_not_act_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                
                if activate != 'not activated':
                    activate = key_info[key_info.find("activated") + 10:key_info.find('+')]
                    date_act = (DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[:6] + '20' + ((DateToNumber(activate[5:14].replace(' ', '.')) + ' ' + activate[15:24])[6:])
                    #date_act = date_act[:6] + '20' + date_act[6:]  #date_act = activate[5:14]  #date_act = date_act.replace(' ', ':')  #time_act = activate[15:24]     #date_act = DateToNumber(date_act) + ' ' + time_act
                    expired = key_info[key_info.find("expired") + 9:key_info.find('//')]
                    activate = 'activated'
                    all_act_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                all_keys.append(({'key': i[:19], 'active': i[20:], 'license_lenth': license_lenth, 'activate': activate, 'date_act': date_act, 'expired': expired}))
                #######################################################

        #Slicing of unwanted list values ​​stored in response to request
        all_keys = (all_keys[1:-3])
        all_act_keys = (all_act_keys[1:-3])
        ##############################################################

        #Recording the number of serial keys
        number_keys = {'all_number': len(all_keys), 'act_number': len(all_act_keys), 'not_act_number': len(all_not_act_keys)}
        ####################################

        #Sort using lambda function by date from newest to oldest
        try:
            all_keys = (sorted(all_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_keys = all_keys
        try:
            all_act_keys = (sorted(all_act_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_act_keys = all_act_keys
        try:
            all_not_act_keys = (sorted(all_not_act_keys, key=lambda x: datetime.strptime(x['date_act'], '%d.%m.%Y %H:%M:%S',), reverse=True ))
        except:
            all_not_act_keys = all_not_act_keys
        #########################################################

        #The final list of serial keys after sorting
        result = ({'all_keys': all_keys, 'all_act_keys': all_act_keys, 'all_not_act_keys': all_not_act_keys,  'number_keys': number_keys,})
        ############################################

        #Selecting the output list depending on the subquery parameter
        see_all_keys = request.GET.get('all_keys')
        see_act_keys = request.GET.get('act_keys')
        see_not_act_keys = request.GET.get('deact_keys')
        ##############################################################

        #Implementing pagination with django-paginator
        if see_all_keys != None:
            paginator = Paginator(result['all_keys'], 10)
        elif see_act_keys != None:
            paginator = Paginator(result['all_act_keys'], 10)
        elif see_not_act_keys != None:
            paginator = Paginator(result['all_not_act_keys'], 10)
        else:
            paginator = Paginator(result['all_keys'], 10)
        page_number = request.GET.get('?page')
        if page_number == None:
            page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        ##############################################
        print(page_obj)
        #Variable for displaying the name of the authorized user
        whois = {'whois': request.user.username}
        ########################################################
        print(result['all_keys'])
        return render(request, "index.html", {"allKeys_list":result['all_keys'], "number": result['number_keys'], 'page_obj': page_obj, 'whois': whois, 'username': username},)
