# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from DeviceList.models import Document
from DeviceList.forms import DocumentForm
from django.shortcuts import render_to_response, render, redirect
from DeviceList.models import Lldevicelist, Lldevicenoatifications, Lldevicenoatificationsack, AuthUser
from Measure.models import LldevicePdlagMeasure
from Measure.models import LldevicePdlagRealtime
from django.http import HttpResponse
from django.db.models import Q
from django.template import RequestContext
from main.views import getlanguage
import json, datetime, random
import Measure.views

def setlanguage(request):
    request.session['lang'] = request.GET.get('lang')
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

def maps(request):
    if request.user.is_authenticated():
        DevicesData=Lldevicelist.objects.filter(loc_active=1)
        devices_dict={}
        icons_dict=Measure.views.getIconList()
        noatification_dict=returnNoatificationList(request.user.id, request.session.get('lang','en-gb'))
        noatification_all_count=len(noatification_dict['all'])
        noatification_notaccepted_count=len(noatification_dict['notaccepted'])


        for device in DevicesData:
            if request.user.has_perm("DeviceList."+str(device.id)):
                device_dict={}
                device_dict['lat']=device.loc_lat
                device_dict['lon']=device.loc_long
                device_dict['type']=device.loc_type
                device_dict['rem_identifier']=device.rem_identifier
                device_dict['id']=device.id
                device_dict['info']=device.rem_info
                devices_dict[device.id]=device_dict
        return render_to_response('maps.html',{ 'user_object': request.user,
                                                'devices': json.dumps(devices_dict),
                                                'lang':getlanguage(request),
                                                'noatifications': noatification_dict,
                                                'noatification_all_count':noatification_all_count,
                                                'noatification_notaccepted_count':noatification_notaccepted_count,
                                                'icons': icons_dict},  RequestContext(request))
    else:
        return redirect('/leakless-monitor')

def acceptNoatifications(request):
    if request.user.is_authenticated():
        NoatificationIDs=request.GET.get('noatification_ids')

        for noatification in NoatificationIDs:
            NoatificationData = Lldevicenoatifications.objects.get(idlldevicenoatifications=noatification)
            UserData = AuthUser.objects.get(id=request.user.id)
            NoatificationAcceptRecord = Lldevicenoatificationsack(userid=UserData,noatificationid=NoatificationData)
            NoatificationAcceptRecord.save()

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


def returnNoatificationList(UserID, Lang):
    CurrentDate = datetime.datetime.now()
    NoatificationData = Lldevicenoatifications.objects.filter(expirationdate__gte=CurrentDate)
    NoatificationsAcked = Lldevicenoatificationsack.objects.filter(userid=UserID)
    NoatificationsAckedList=NoatificationsAcked.values_list('noatificationid', flat=True)
    # skip Acked noatification
    NoatificationData = Lldevicenoatifications.objects.filter(expirationdate__gte=CurrentDate)

    NoatificationDataExcluded=NoatificationData.exclude(idlldevicenoatifications__in=NoatificationsAckedList)

    ReturnDataNotAccepted = []
    ReturnDataAll = []

    for noatification in NoatificationDataExcluded:

        NoatificationInfo = {}
        NoatificationInfo['id'] = noatification.idlldevicenoatifications
        NoatificationInfo['type'] = noatification.type
        NoatificationInfo['icon'] = noatification.icon
        if Lang == "hr":
            NoatificationInfo['text'] = noatification.text_hr
            NoatificationInfo['title'] = noatification.title_hr
            NoatificationInfo['header'] = noatification.header_hr
        elif Lang == "en-gb":
            NoatificationInfo['text'] = noatification.text_en
            NoatificationInfo['title'] = noatification.title_en
            NoatificationInfo['header'] = noatification.header_en
            ReturnDataNotAccepted.append(NoatificationInfo)

    for noatification in NoatificationData:

        NoatificationInfo = {}
        NoatificationInfo['id'] = noatification.idlldevicenoatifications
        NoatificationInfo['type'] = noatification.type
        NoatificationInfo['icon'] = noatification.icon
        if Lang == "hr":
            NoatificationInfo['text'] = noatification.text_hr
            NoatificationInfo['title'] = noatification.title_hr
            NoatificationInfo['header'] = noatification.header_hr
        elif Lang == "en-gb":
            NoatificationInfo['text'] = noatification.text_en
            NoatificationInfo['title'] = noatification.title_en
            NoatificationInfo['header'] = noatification.header_en
            ReturnDataAll.append(NoatificationInfo)

    ReturnData={}
    ReturnData['all']=ReturnDataAll
    ReturnData['notaccepted']=ReturnDataNotAccepted

    return ReturnData


def showdevices(request):
    if request.user.is_authenticated():
        permfield=[]
        permissions=request.user.get_all_permissions()
        for perm in permissions:
            permfield.append(perm.split(".")[1])
        DevicesData=Lldevicelist.objects.filter(id__in=permfield)
        return render_to_response('devices.html',{ 'user_object': request.user, 'devices': DevicesData, 'lang':getlanguage(request)})
    else:
        return redirect('/leakless-monitor')


def showDeviceInfo(request):
    if request.user.is_authenticated():
        permfield=[]
        permissions=request.user.get_all_permissions()
        for perm in permissions:
            permfield.append(perm.split(".")[1])
        DevicesInfo=getDeviceInfoData(permfield)
        return render_to_response('deviceInfoTable.html',{ 'user_object': request.user, 'deviceInfo': DevicesInfo, 'lang':getlanguage(request)})
    else:
        return redirect('/leakless-monitor')

def getDeviceInfoData(IDList):
    devices_info=[]

    Devices_Data    = Lldevicelist.objects.filter(id__in=IDList)
    Device_Measures = LldevicePdlagRealtime.objects.filter(lldevicelist__in=IDList)
    for dmeasure in Device_Measures:
        Identifier=next((x for x in Devices_Data if x.id == dmeasure.lldevicelist_id), None).rem_identifier
        if (Identifier is None):
            Identifier = 'Unknown'

        device_dict={}
        device_dict['ID']=dmeasure.lldevicelist_id
        device_dict['Identifier']=Identifier
        device_dict['Timestamp']=dmeasure.timestamp

        PressureUnit=Measure.views.returnRecalculatePressureUnitString(dmeasure.lldevicelist_id)
        PressureFactor=Measure.views.returnPressureFactor(dmeasure.lldevicelist_id)

        FlowUnit = Measure.views.returnRecalculateFlowUnitString(dmeasure.lldevicelist_id)
        FlowFactor = Measure.views.returnFlowFactor(dmeasure.lldevicelist_id)

        TotalFlowUnit=Measure.views.returnRecalculateTotalFlowUnitString(dmeasure.lldevicelist_id)
        TotalFlowFactor = Measure.views.returnTotalFlowFactor(dmeasure.lldevicelist_id)

        if (dmeasure.timestamp is not None):
            device_dict['Timestamp']=dmeasure.timestamp
            Time_Difference=datetime.datetime.now()-dmeasure.timestamp
            hours, remainder = divmod(Time_Difference.seconds, 3600)
            minutes, seconds = divmod(remainder, 60)
            device_dict['ElapsedTime']='%02d:%02d:%02d' % (hours, minutes, seconds)
        else:
            device_dict['Timestamp']='?'
            device_dict['ElapsedTime']='?'

        if (dmeasure.ch1_pressure is not None):
            device_dict['PressureCH1']=str(dmeasure.ch1_pressure*PressureFactor)+" "+PressureUnit
        else:
            device_dict['PressureCH1']="? "+PressureUnit

        if (dmeasure.ch2_pressure is not None):
            device_dict['PressureCH2']=str(dmeasure.ch2_pressure*PressureFactor) +" "+PressureUnit
        else:
            device_dict['PressureCH2']="? "+PressureUnit

        if (dmeasure.ch1_flow is not None):
            device_dict['FlowCH1']=str(dmeasure.ch1_flow*FlowFactor)+" "+FlowUnit
        else:
            device_dict['FlowCH1']="? "+FlowUnit

        if (dmeasure.ch2_flow is not None):
            device_dict['FlowCH2'] = str(dmeasure.ch2_flow*FlowFactor)+" "+FlowUnit
        else:
            device_dict['FlowCH2'] = "? "+FlowUnit

        if (dmeasure.ch1_total_flow is not None):
            device_dict['TotalFlowCH1']=str(dmeasure.ch1_total_flow*TotalFlowFactor)+" "+TotalFlowUnit
        else:
            device_dict['TotalFlowCH1']="? "+TotalFlowUnit

        if (dmeasure.ch2_total_flow is not None):
            device_dict['TotalFlowCH2']=str(dmeasure.ch2_total_flow*TotalFlowFactor)+" "+TotalFlowUnit
        else:
            device_dict['TotalFlowCH2']="? "+TotalFlowUnit

        devices_info.append(device_dict)

    return devices_info

def latlonChange(request):
    if request.user.is_authenticated():
        try:
            DevicesData=Lldevicelist.objects.filter(id=request.GET.get('device_id')).update(loc_lat=request.GET.get('latitude'), loc_long=request.GET.get('longitude'))          
            return HttpResponse("Values successfully changed")
        except Exception as e:
            return HttpResponse(e.message) 
    else:
        return redirect('/leakless-monitor')

def DeleteFiles(request):
    Document.objects.filter(id=request.POST['documentID']).delete()
    return redirect('/deviceslist/maps/')

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

def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        """
        ovo je kako na serveru mozes provjerit velicinu fajle i tip
        for fileic in request.FILES.getlist("docfile"):
            print "tip"+ fileic.content_type
            print "velicina"+ str(fileic._size)
        """
        device_id2=request.POST['device_id']
        if form.is_valid():
            if request.POST['Upload']=='Upload1':
                checkAndDeleteExisting(1,device_id2)
                newdoc = Document(docfile = request.FILES['docfile'], numberOfFile=1, device_id=device_id2)
                newdoc.save()
            elif request.POST['Upload']=='Upload2':
                checkAndDeleteExisting(2, device_id2)
                newdoc = Document(docfile = request.FILES['docfile'], numberOfFile=2, device_id=device_id2)
                newdoc.save()
            elif request.POST['Upload']=='Upload3':
                checkAndDeleteExisting(3, device_id2)
                newdoc = Document(docfile = request.FILES['docfile'], numberOfFile=3, device_id=device_id2)
                newdoc.save()

            # Redirect to the document list after POST
            return redirect('/deviceslist/maps/')
    else:
        device_id2=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_id2).order_by('numberOfFile')

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

    #for document in documents:
    #    print document.docfile
    #Document.objects.filter(docfile='documents/2016/03/11/Boston_Legal_-_101_-_Head_Cases.avi').delete()

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


# Create your views here.
