# Python imports
import  json
# Django imports
from django.shortcuts import render_to_response, redirect
from django.core.urlresolvers import reverse
from django.template import RequestContext
from django.http import HttpResponse,JsonResponse
from django.core.exceptions import ObjectDoesNotExist

# LeakLess Monitor imports
from Applications.Files.models import Document, Download
from Applications.Files.forms import DocumentForm, DownloadForm
from Applications.Users.views import user_get_language, user_get_information, user_get_device

downloads_group_list = [{'name': 'Software', 'text_en' : 'Software', 'text_hr' : 'Programi za racunalo', 'selectable': True, 'subgroups' : None},
                        {'name': 'Firmware', 'text_en' : 'Firmware', 'text_hr' : 'Programi za uredaje', 'selectable': False,'subgroups' : [
                            {'name': 'PDLAG HW0500', 'text_en' : 'PDL-AG HW 05.00', 'text_hr' : 'PDL-AG HW 05.00', 'selectable': True, 'subgroups' : None},
                            {'name': 'PDLAG HW0200', 'text_en' : 'PDL-AG HW 02.00', 'text_hr' : 'PDL-AG HW 05.00', 'selectable': True, 'subgroups' : None}
                        ]}
                        ]

def files_delete_file(request):
    document_id=request.POST['documentID']

    Document.objects.filter(id=document_id).delete()
    return redirect(reverse('maps_page'))


def files_check_and_delete_existing(file_id, device_id):
    documents = Document.objects.filter(numberOfFile=file_id, device_id=device_id)
    if documents:
        documents.delete()

def files_return_form(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)

        device_id = request.POST['device_id']
        if form.is_valid():
            if request.POST['Upload'] == 'Upload1':
                files_check_and_delete_existing(1, device_id)
                newdoc = Document(docfile=request.FILES['docfile'], numberOfFile=1, device_id=device_id)
                newdoc.save()
            elif request.POST['Upload'] == 'Upload2':
                files_check_and_delete_existing(2, device_id)
                newdoc = Document(docfile=request.FILES['docfile'], numberOfFile=2, device_id=device_id)
                newdoc.save()
            elif request.POST['Upload'] == 'Upload3':
                files_check_and_delete_existing(3, device_id)
                newdoc = Document(docfile=request.FILES['docfile'], numberOfFile=3, device_id=device_id)
                newdoc.save()

            # Redirect to the document list after POST
            return redirect(reverse('maps_page'))
    else:
        device_id = request.GET.get('device_id')
        form1 = DocumentForm()  # A empty, unbound form
        form1.fields['docfile'].widget.attrs.update({'id': 'FileForm1',})
        form2 = DocumentForm()  # A empty, unbound form
        form2.fields['docfile'].widget.attrs.update({'id': 'FileForm2',})
        form3 = DocumentForm()  # A empty, unbound form
        form3.fields['docfile'].widget.attrs.update({'id': 'FileForm3',})

    # Load documents for the list page
    documents = Document.objects.filter(device_id=device_id).order_by('numberOfFile')

    doc_info = [-1, -1, -1]
    for i, document in enumerate(documents):
        doc_info[document.numberOfFile - 1] = document

    # Render list page with the documents and the form
    return render_to_response(
        'uploadFile.html',
        {'form1': form1, 'form2': form2, 'form3': form3, 'device_id': device_id, 'doc_info': doc_info,
         'lang': user_get_language(request)},
        context_instance=RequestContext(request)
    )



def files_download_view(request):
    if request.user.is_authenticated():

        files_treeview=[]

        lang = user_get_language(request)
        for group in downloads_group_list:
            files_treeview.append(downloads_return_group_node(group,lang ))


        return render_to_response('downloads.html', {   'user_object'           : request.user,
                                                        'user_device_type'      : user_get_device(request),
                                                        'user_info'             : user_get_information(request),
                                                        'lang'                  : user_get_language(request),
                                                        'files_treeview'        : json.dumps(files_treeview)}, RequestContext(request))

def downloads_return_group_node(group,lang):
    group_items = Download.objects.filter(group=group['name'])
    group_items_count = len(group_items)
    tag = [str(group_items_count)]

    if not group['selectable']:
        tag = []

    nodes = []
    if group['subgroups'] != None:
        for node in group['subgroups']:
            nodes.append(downloads_return_group_node(node,lang))

    if lang == 'hr':
        text = group['text_hr']
    else:
        text = group['text_en']

    return_data={
        'text'              : text,
        'group_name'        : group['name'],
        'icon'              : "glyphicon glyphicon-stop",
        'selectedIcon'      : "glyphicon glyphicon-stop",
        'showCheckbox'      : False,
        'backColor'         : "white",
        'selectable'        : group['selectable'],
        'state': {
            'checked'       : False,
            'disabled'      : False,
            'expanded'      : True,
            'selected'      : False
        },
        'tags'              : tag,
        'nodes'             : nodes
    }


    return return_data

def files_download_return_file_list(request):
    if request.user.is_authenticated():

        group = request.GET.get('group_name')
        group_text = request.GET.get('group_text')
        group_items = Download.objects.filter(group=group)

        user_information=user_get_information(request)

        return render_to_response(
            'downloads_list.html',{ 'group_name': group,
                                    'group_text': group_text,
                                    'file_list' : group_items,
                                    'user_info' : user_information,
                                    'lang'      : user_get_language(request)},
            context_instance=RequestContext(request)
        )
    else:
        return redirect('/leakless-monitor')

def files_new_download_return_form(request):
    # Handle file upload
    if request.method == 'POST':

        form = DownloadForm(request.POST, request.FILES)

        if form.is_valid():
            download = Download()

            download.group = form.cleaned_data['group']
            download.name = form.cleaned_data['name']
            download.file = form.cleaned_data['file']
            download.icon = form.cleaned_data['icon']
            download.info = form.cleaned_data['info']
            download.save()

            return HttpResponse('Ok')
        else:

            return HttpResponse('Error')

    elif request.method == 'GET':
        group = request.GET['group_name']
        lang = user_get_language(request)

        initial = {'group': group}

        form = DownloadForm(initial=initial)

        fields = list(form)
        return render_to_response(
            'newDownloadForm.html',{ 'fields'   : fields,
                                     'lang'     : lang},
            context_instance=RequestContext(request)
        )


def files_delete_download(request):

    if request.user.is_authenticated():

        id = request.GET.get('file_id')

        try:
            download = Download.objects.get(id=id )
            download.delete()
        except ObjectDoesNotExist:
            return HttpResponse("Error")

        return HttpResponse("Ok")
    else:
        return redirect('/leakless-monitor')
