from django.shortcuts import render_to_response, render, redirect
from django.http import HttpResponse
from django.http import JsonResponse
from django.template.loader import render_to_string
from pyculiarity import detect_ts
import xlwt
import pandas as pd
from Measure.models import LldevicePdlagMeasure, LldevicePdlagAlarm, LldevicePdlagParameters, LldevicePdlagParameterinfo, UserActions, Lldevicelist
from main.views import getlanguage
import datetime
import json
import re
import cgi
import time

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

def plot(request):
     return render_to_response('graphs.html',{ 'user_object': request.user})

def generateExcel(request):
    if request.session.get('lang','en-gb') == 'hr':
        if request.user.is_authenticated():
            Measurements=LldevicePdlagMeasure.objects.filter(timestamp__gte=datetime.datetime.strptime(request.POST['startDateInput'], "%Y-%m-%d %H:%M:%S"),timestamp__lte=datetime.datetime.strptime(request.POST['EndDateInput'], "%Y-%m-%d %H:%M:%S"), lldevicelist=request.POST['device_id']).order_by('timestamp')
            workbook = xlwt.Workbook() 
            sheet = workbook.add_sheet("Sheet1")
        
            align = xlwt.Alignment()
            align.wrap = True
            align.vert = align.VERT_CENTER
            align.horz = align.HORZ_CENTER
        
            # borders
            borders = xlwt.Borders()
            borders.bottom = xlwt.Borders.THIN
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top= xlwt.Borders.THIN
            
            color0 = xlwt.Pattern()
            color0.pattern = xlwt.Pattern.SOLID_PATTERN
            color0.pattern_fore_colour = xlwt.Style.colour_map['yellow']
        
            style0 = xlwt.XFStyle()
            font = xlwt.Font() # Create the Font
            font.bold=True
            style0.borders = borders
            style0.font=font
            style0.alignment=align
            style0.pattern = color0
            
            sheet.write_merge(0,0,0,6,'Uredaj: '+request.POST['device_id']+' ['+request.POST['device_local_id']+']\nVrijeme od: '+request.POST['startDateInput']+' do '+request.POST['EndDateInput'], style0)
            sheet.row(0).height_mismatch = True
            sheet.row(0).height = 256*3
            
            color = xlwt.Pattern()
            color.pattern = xlwt.Pattern.SOLID_PATTERN
            color.pattern_fore_colour = xlwt.Style.colour_map['light_blue']
        
            style2 = xlwt.XFStyle()
            font = xlwt.Font() # Create the Font
            font.bold=True
            style2.borders = borders
            style2.font=font
            style2.alignment=align
            style2.pattern = color
            sheet.row(1).height_mismatch = True
            sheet.row(1).height = 256*4
            
            sheet.write(1, 0, 'Vrijeme', style2)
            column = sheet.col(0)
            column.width = 256 * 30 
            sheet.write(1, 1, 'CH1 Tlak ['+returnPressureUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 2, 'CH1 Protok ['+returnTotalFlowUnitString(request.POST['device_id'])+"/s]", style2)
            sheet.write(1, 3, 'CH1 Ukupni protok ['+returnTotalFlowUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 4, 'CH2 Tlak ['+returnPressureUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 5, 'CH2 Protok ['+returnTotalFlowUnitString(request.POST['device_id'])+"/s]", style2)
            sheet.write(1, 6, 'CH2 Ukupni protok ['+returnTotalFlowUnitString(request.POST['device_id'])+"]", style2)
                    # borders
            borders = xlwt.Borders()
            borders.bottom = xlwt.Borders.THIN
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top= xlwt.Borders.THIN
        
        
            style1 = xlwt.XFStyle()
            style1.borders = borders
            xlsRowCounter=2
            for measure in Measurements:           
                sheet.write(xlsRowCounter, 0, measure.timestamp.strftime("%Y-%m-%d %H:%M:%S"), style1)
                sheet.write(xlsRowCounter, 1, measure.ch1_pressure, style1)
                sheet.write(xlsRowCounter, 2, measure.ch1_flow, style1)
                sheet.write(xlsRowCounter, 3, measure.ch1_total_flow, style1)
                sheet.write(xlsRowCounter, 4, measure.ch2_pressure, style1)
                sheet.write(xlsRowCounter, 5, measure.ch2_flow, style1)  
                sheet.write(xlsRowCounter, 6, measure.ch2_total_flow, style1)
                xlsRowCounter+=1
            
            download_name2 =datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + '_' +request.POST['device_id']+'.xls'
            #download_nameEncoded=download_name.encode('ascii','ignore')
            response = HttpResponse(content_type="application/vnd.ms-excel") 
            response['Content-Disposition'] = "attachment; filename=%s"%download_name2
            #workbook.save(prfolder+download_nameEncoded)
            workbook.save(response)
            return response
        else:
            return HttpResponse('Invalid user')
    else:
        if request.user.is_authenticated():
            Measurements=LldevicePdlagMeasure.objects.filter(timestamp__gte=datetime.datetime.strptime(request.POST['startDateInput'], "%Y-%m-%d %H:%M:%S"),timestamp__lte=datetime.datetime.strptime(request.POST['EndDateInput'], "%Y-%m-%d %H:%M:%S"), lldevicelist=request.POST['device_id']).order_by('timestamp')
            workbook = xlwt.Workbook() 
            sheet = workbook.add_sheet("Sheet1")
        
            align = xlwt.Alignment()
            align.wrap = True
            align.vert = align.VERT_CENTER
            align.horz = align.HORZ_CENTER
        
            # borders
            borders = xlwt.Borders()
            borders.bottom = xlwt.Borders.THIN
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top= xlwt.Borders.THIN
            
            color0 = xlwt.Pattern()
            color0.pattern = xlwt.Pattern.SOLID_PATTERN
            color0.pattern_fore_colour = xlwt.Style.colour_map['yellow']
        
            style0 = xlwt.XFStyle()
            font = xlwt.Font() # Create the Font
            font.bold=True
            style0.borders = borders
            style0.font=font
            style0.alignment=align
            style0.pattern = color0
            
            sheet.write_merge(0,0,0,6,'Device: '+request.POST['device_id']+' ['+request.POST['device_local_id']+']\nTime from: '+request.POST['startDateInput']+' to '+request.POST['EndDateInput'], style0)
            sheet.row(0).height_mismatch = True
            sheet.row(0).height = 256*3
            
            color = xlwt.Pattern()
            color.pattern = xlwt.Pattern.SOLID_PATTERN
            color.pattern_fore_colour = xlwt.Style.colour_map['light_blue']
        
            style2 = xlwt.XFStyle()
            font = xlwt.Font() # Create the Font
            font.bold=True
            style2.borders = borders
            style2.font=font
            style2.alignment=align
            style2.pattern = color
            sheet.row(1).height_mismatch = True
            sheet.row(1).height = 256*4
            
            sheet.write(1, 0, 'Time', style2)
            column = sheet.col(0)
            column.width = 256 * 30 
            sheet.write(1, 1, 'CH1 Pressure ['+returnPressureUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 2, 'CH1 Flow ['+returnTotalFlowUnitString(request.POST['device_id'])+"/s]", style2)
            sheet.write(1, 3, 'CH1 Total Flow ['+returnTotalFlowUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 4, 'CH2 Pressure ['+returnPressureUnitString(request.POST['device_id'])+"]", style2)
            sheet.write(1, 5, 'CH2 Flow ['+returnTotalFlowUnitString(request.POST['device_id'])+"/s]", style2)
            sheet.write(1, 6, 'CH2 Total Flow ['+returnTotalFlowUnitString(request.POST['device_id'])+"]", style2)
                    # borders
            borders = xlwt.Borders()
            borders.bottom = xlwt.Borders.THIN
            borders.left = xlwt.Borders.THIN
            borders.right = xlwt.Borders.THIN
            borders.top= xlwt.Borders.THIN
        
        
            style1 = xlwt.XFStyle()
            style1.borders = borders
            xlsRowCounter=2
            for measure in Measurements:           
                sheet.write(xlsRowCounter, 0, measure.timestamp.strftime("%Y-%m-%d %H:%M:%S"), style1)
                sheet.write(xlsRowCounter, 1, measure.ch1_pressure, style1)
                sheet.write(xlsRowCounter, 2, measure.ch1_flow, style1)
                sheet.write(xlsRowCounter, 3, measure.ch1_total_flow, style1)
                sheet.write(xlsRowCounter, 4, measure.ch2_pressure, style1)
                sheet.write(xlsRowCounter, 5, measure.ch2_flow, style1)  
                sheet.write(xlsRowCounter, 6, measure.ch2_total_flow, style1)
                xlsRowCounter+=1
            
            download_name2 =datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + '_' +request.POST['device_id']+'.xls'
            #download_nameEncoded=download_name.encode('ascii','ignore')
            response = HttpResponse(content_type="application/vnd.ms-excel") 
            response['Content-Disposition'] = "attachment; filename=%s"%download_name2
            #workbook.save(prfolder+download_nameEncoded)
            workbook.save(response)
            return response
        else:
            return HttpResponse('Invalid user')

def checkNone(value):
    if value is None:
        value=0
    return value


def returnPressureUnitString(DeviceID):
    PMU=LldevicePdlagParameters.objects.filter(lldevicelist=DeviceID)
    Jedinica=0
    for line in PMU:
        Jedinica=line.rem_pmu
    
    if Jedinica == 0:
        return "Bar"
    elif Jedinica == 1:
        return "Pa"
    elif Jedinica == 2:
        return "Psi"
    else: 
        return "Bar"


def returnRecalculatePressureUnitString(DeviceID):
    Info = Lldevicelist.objects.filter(id=DeviceID)
    if len(Info)!=1:
        return 'Bar'
    else:
        if Info[0].loc_pressurerecalculateunit is None:
            return '?'
        else:
            return Info[0].loc_pressurerecalculateunit


def returnPressureFactor(DeviceID):
    PressureUnit = returnPressureUnitString(DeviceID)
    PressureRecalculateUnit= returnRecalculatePressureUnitString(DeviceID)
    if PressureUnit==PressureRecalculateUnit:
        return 1
    elif PressureUnit=="Bar":
        if PressureRecalculateUnit=="PSI":
            return 14.5
        elif PressureRecalculateUnit=="Pa":
            return 100000
        elif PressureRecalculateUnit=="m":
            return 10.197
        else:
            return 1
    elif PressureUnit=="PSI":
        if PressureRecalculateUnit=="Bar":
            return 1/14.5
        elif PressureRecalculateUnit=="Pa":
            return 6894.75729
        elif PressureRecalculateUnit=="m":
            return 0.703
        else:
            return 1
    elif PressureUnit=="Pa":
        if PressureRecalculateUnit=="Bar":
            return 1/100000
        elif PressureRecalculateUnit=="PSI":
            return 1/6894.75729
        elif PressureRecalculateUnit=="m":
            return 0.0001019744
        else:
            return 1

    return 1

def returnRecalculatePressureUnitOptions():
    Return=[]
    Return.append('Bar')
    Return.append('PSI')
    Return.append('m')
    return Return


def returnFlowUnitString(DeviceID):
    return returnTotalFlowUnitString(DeviceID)+'/s'


def returnRecalculateFlowUnitString(DeviceID):
    Info = Lldevicelist.objects.filter(id=DeviceID)
    if len(Info)!=1:
        return 'l'
    else:
        if Info[0].loc_flowrecalculateunit is None:
            return '?'
        else:
            return Info[0].loc_flowrecalculateunit

def returnFlowFactor(DeviceID):
    FlowUnit = returnFlowUnitString(DeviceID)
    FlowRecalculateUnit= returnRecalculateFlowUnitString(DeviceID)
    if FlowUnit==FlowRecalculateUnit:
        return 1
    elif FlowUnit=="l/s":
        if FlowRecalculateUnit=="m3/s":
            return 0.001
        elif FlowRecalculateUnit=="gal/s":
            return 0.264172052
        elif FlowRecalculateUnit=="l/h":
            return 3600
        elif FlowRecalculateUnit=="m3/h":
            return 3.6
        elif FlowRecalculateUnit=="gal/h":
            return 791.889293877
        else:
            return 1
    elif FlowUnit=="m3/s":
        if FlowRecalculateUnit=="l/s":
            return 1000
        elif FlowRecalculateUnit=="gal/s":
            return 264.172052358
        elif FlowRecalculateUnit=="l/h":
            return 3600000
        elif FlowRecalculateUnit=="m3/h":
            return 3600
        elif FlowRecalculateUnit=="gal/h":
            return 791889.29387672
        else:
            return 1
    elif FlowUnit=="gal/s":
        if FlowRecalculateUnit=="l/s":
            return 4.54609
        elif FlowRecalculateUnit=="m3/s":
            return 0.00454609
        elif FlowRecalculateUnit=="l/h":
            return 16365.924
        elif FlowRecalculateUnit=="m3/h":
            return 16.365924
        elif FlowRecalculateUnit=="gal/h":
            return 3600
        else:
            return 1

    return 1

def returnRecalculateFlowUnitOptions():
    Return = []
    Return.append('l/s')
    Return.append('m3/s')
    Return.append('gal/s')
    Return.append('l/h')
    Return.append('m3/h')
    Return.append('gal/h')
    return Return


def returnTotalFlowUnitString(DeviceID):
    FMU=LldevicePdlagParameters.objects.filter(lldevicelist=DeviceID)
    Jedinica=0
    for line in FMU:
        Jedinica=line.rem_fmu
    
    if Jedinica == 0:
        return "l"
    elif Jedinica == 1:
        return "m3"
    elif Jedinica == 2:
        return "gal"
    else: 
        return "l"


def returnRecalculateTotalFlowUnitString(DeviceID):
    Info = Lldevicelist.objects.filter(id=DeviceID)
    if len(Info)!=1:
        return 'l'
    else:
        if Info[0].loc_totalflowrecalculateunit is None:
            return '?'
        else:
            return Info[0].loc_totalflowrecalculateunit


def returnTotalFlowFactor(DeviceID):
    TotalFlowUnit = returnTotalFlowUnitString(DeviceID)
    TotalFlowRecalculateUnit= returnRecalculateTotalFlowUnitString(DeviceID)
    if TotalFlowUnit==TotalFlowRecalculateUnit:
        return 1
    elif TotalFlowUnit=="l":
        if TotalFlowRecalculateUnit=="m3":
            return 0.001
        elif TotalFlowRecalculateUnit=="gal":
            return 0.264172052
        else:
            return 1
    elif TotalFlowUnit=="m3":
        if TotalFlowRecalculateUnit=="l":
            return 1000
        elif TotalFlowRecalculateUnit=="gal":
            return 264.172052358
        else:
            return 1
    elif TotalFlowUnit=="gal":
        if TotalFlowRecalculateUnit=="l":
            return 4.54609
        elif TotalFlowRecalculateUnit=="m3":
            return 0.00454609
        else:
            return 1

    return 1

def returnRecalculateTotalFlowUnitOptions():
    Return = []
    Return.append('l')
    Return.append('m3')
    Return.append('gal')
    return Return

def generateGraph(request):
    if request.user.is_authenticated():
        xdata=[]

        PressureUnit=returnRecalculatePressureUnitString(request.GET.get('device_id'))
        PressureFactor=returnPressureFactor(request.GET.get('device_id'))

        FlowUnit = returnRecalculateFlowUnitString(request.GET.get('device_id'))
        FlowFactor = returnFlowFactor(request.GET.get('device_id'))

        TotalFlowUnit=returnRecalculateTotalFlowUnitString(request.GET.get('device_id'))
        TotalFlowFactor = returnTotalFlowFactor(request.GET.get('device_id'))

        Measurements=LldevicePdlagMeasure.objects.filter(timestamp__gte=datetime.datetime.strptime(request.GET.get('startDateInput'), "%Y-%m-%d %H:%M:%S"),timestamp__lte=datetime.datetime.strptime(request.GET.get('EndDateInput'), "%Y-%m-%d %H:%M:%S"), lldevicelist=request.GET.get('device_id')).order_by('timestamp')
        fmt = '%Y-%m-%d %H:%M:%S'
        data={}
        if request.GET.get('CHP')=="1":
            CHP_data = {}
            CHP_data['name']="Pressure"
            CHP_data['ime']="Tlak"
            CHP_data['unit']="["+PressureUnit+"]"
        if request.GET.get('CHF')=="1":
            CHF_data = {}
            CHF_data['name']="Flow"
            CHF_data['ime']="Protok"
            CHF_data['unit']="["+FlowUnit+"]"
        if request.GET.get('CHT')=="1":
            CHT_data = {}
            CHT_data['name']="Total Flow"
            CHT_data['ime']="Ukupni protok"
            CHT_data['unit']="["+TotalFlowUnit+"]"
        if request.GET.get('CHDIG')=="1":
            CHD_data = {}
            CHD_data['name']="Digital input"
            CHD_data['ime']="Digitalni ulaz"
            CHD_data['unit']="[0/1] \r\n\r\n"
        counter=0
        CHP_array=[]
        CHF_array=[]
        CHT_array=[]
        CHD_array=[]
        numOfseample=int(request.GET.get('sampler'))
        numOfRows=Measurements.count()
        for measure in Measurements:
            time=measure.timestamp
            xdata.append(time)
            if request.GET.get('CHP')=='1':
                CHP_array.append([time, checkNone(measure.ch1_pressure)*PressureFactor, checkNone(measure.ch2_pressure)*PressureFactor])
            if request.GET.get('CHF')=="1":
                CHF_array.append([time, checkNone(measure.ch1_flow)*FlowFactor, checkNone(measure.ch2_flow)*FlowFactor])
            if request.GET.get('CHT')=="1":
                CHT_array.append([time, checkNone(measure.ch1_total_flow)*TotalFlowFactor, checkNone(measure.ch2_total_flow)*TotalFlowFactor])
            if request.GET.get('CHDIG')=="1":
                CHD_array.append([time, checkNone(measure.digital_ch1), checkNone(measure.digital_ch2)])
            counter+=1
        data['xData']=xdata
        datasets=[]
        if request.GET.get('CHP')=="1":
            CHP_data['data']=CHP_array
            datasets.append(CHP_data)
        if request.GET.get('CHF')=="1":
            CHF_data['data']=CHF_array
            datasets.append(CHF_data)
        if request.GET.get('CHT')=="1":
            CHT_data['data']=CHT_array
            datasets.append(CHT_data)
        if request.GET.get('CHDIG')=="1":
            CHD_data['data']=CHD_array
            datasets.append(CHD_data)
        #print data
        data['datasets']=datasets
        return JsonResponse(  data )        
    else:
        return HttpResponse('Invalid user')
  
def Alarms(request):
    Alarms=LldevicePdlagAlarm.objects.filter(timestamp__gte=datetime.datetime.strptime(request.GET.get('startDateInput'), "%Y-%m-%d %H:%M:%S"),timestamp__lte=datetime.datetime.strptime(request.GET.get('EndDateInput'), "%Y-%m-%d %H:%M:%S"),lldevicelist=request.GET.get('device_id'))
    fmt = '%Y-%m-%d %H:%M:%S'
    #html="<table id=\"table0\" class=\"tablesorter\"><caption>Alarms</caption><thead><tr><th>Timestamp</th><th>Alarm</th></thead><tfoot><tr><th>Timestamp</th><th>Alarm</th></tr></tfoot><tbody>"
    html="<div style=\"margin-top: 50px;\"><table class=\"table table-striped\" id=\"tblGrid\">"
    html+="<thead id=\"tblHead\"><tr><th><font color=\"#444444\">Timestamp</font></th><th><font color=\"#444444\">Alarm</font></th></tr></thead><tbody>"
    for alarm1 in Alarms:
        if alarm1.checked is None:
            html+="<tr><td><font color=\"#444444\">"+alarm1.timestamp.strftime(fmt)+"</font></td>"
            html+="<td><font color=\"#444444\">"+alarm1.alarm+"</font</td></tr>" 
        else:
            html+="<tr><td><font color=\"#444444\">"+alarm1.timestamp.strftime(fmt)+"</font></td>"
            html+="<td><font color=\"#444444\">"+alarm1.alarm+"</font</td></tr>" 
    html+="</tbody></table></div>"
    return HttpResponse(html)

def NotificationAlarms(request):
    if request.user.is_authenticated():
        permfield=[]
        permissions=request.user.get_all_permissions()
        for perm in permissions:
            permfield.append(perm.split(".")[1])
        Alarms=LldevicePdlagAlarm.objects.filter(lldevicelist__in=permfield, checked__isnull=True).order_by('-timestamp')
        """
        if int(request.GET.get('deltaT'))==0:
            Alarms=LldevicePdlagAlarm.objects.filter(lldevicelist__in=permfield, checked__isnull=True)
        else:
            Alarms=LldevicePdlagAlarm.objects.filter(timestamp__gte=datetime.datetime.now() - datetime.timedelta(seconds=int(request.GET.get('deltaT'))), lldevicelist__in=permfield, checked__isnull=True)
        """
        fmt = '%Y-%m-%d %H:%M:%S'
        counter=0
        html="<ul id=\"notifDropDown\" class=\"dropdown-menu scrollable-menu\" style=\"background-color: #3399cc;\" role=\"menu\">"
        for alarm1 in Alarms:
            if counter==10:
                break;
            counter+=1
            html+="<li id=\"alarm"+str(alarm1.idlldevicepdlag_alarm)+"\"><a><div><font color=\"#ffffff\">"+str(alarm1.lldevicelist)+", &#160; "+alarm1.timestamp.strftime(fmt)+"&#160; &#160; <button type=\"button\" onclick=\"confirmAlarm("+str(alarm1.idlldevicepdlag_alarm)+")\" class=\"btn btn-default\">Confirm</button><br><div align=\"center\">"+cgi.escape(alarm1.alarm).replace(",","<br>")+"</div>&#160;"+"</font></div></a></li>"
        html+="</ul>"
        if counter>0:
            html="<span id=\"redNotifier\" value=\"fire_Alarm\" class=\"badge badge-notify\">"+str(counter)+"</span>"+html
        else:
            html="<span id=\"redNotifier\" class=\"badge badge-notify\"></span>"+html
        #html="<span style=\"font-size:36px;\" class=\"glyphicon glyphicon-bell\"></span><b class=\"caret\"></b><span id=\"redNotifier\" class=\"badge badge-notify\">"+str(counter)+"</span>"+html
        return HttpResponse(html)
    else:
        return HttpResponse('')


def confirmAlarm(request):
    if request.user.is_authenticated():
        try:
            AlarmsData=LldevicePdlagAlarm.objects.filter(idlldevicepdlag_alarm=request.GET.get('AlarmID')).update(checked=1)          
            return HttpResponse("Alarm confirmed")
        except Exception as e:
            return HttpResponse(e.message)
    else:
        return HttpResponse('invalid User')


def AlarmTable(request):
    if request.user.is_authenticated():
        permfield=[]
        permissions=request.user.get_all_permissions()
        for perm in permissions:
            permfield.append(perm.split(".")[1])
        AlarmsData=LldevicePdlagAlarm.objects.filter(lldevicelist__in=permfield)
        return render_to_response('alarms.html',{ 'user_object': request.user, 'alarms': AlarmsData, 'lang':getlanguage(request)})
    else:
        return redirect('/')


def generateTypeDependHTML(paramI,Params,request):
    html="<div class=\"row\">"
    html+="<div class=\"input-group input-group-sm\" id=\"ParamsList\">"
    html+="<span class=\"input-group-addon\" style=\"width: 100%; max-width:500px; min-width:200px\">"+paramI.publicname+"</span>"
    if paramI.type=="STRING":
        tmp_rem=str(getattr(Params,"rem_"+paramI.name.lower()))
        tmp_loc=str(getattr(Params,"loc_"+paramI.name.lower()))
        html+="<input type=\"text\" style=\"min-width: 250px\" class=\"form-control\" value=\""+tmp_rem+"\" readonly>"
        html+="<span class=\"input-group-addon\"></span>"
        if tmp_rem==tmp_loc:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"width: 200px\" class=\"form-control\" value=\""+tmp_loc+"\" oninput=\"formEvaluatorText(this,'"+tmp_rem+"');\" maxlength=\""+str(paramI.max)+"\">"
        else:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"background-color:#ddffdd;width: 200px\" class=\"form-control\" value=\""+tmp_loc+"\" oninput=\"formEvaluatorText(this,'"+tmp_rem+"');\" maxlength=\""+str(paramI.max)+"\">"
    elif paramI.type=="INTEGER":
        tmp_rem=str(getattr(Params,"rem_"+paramI.name.lower()))
        tmp_loc=str(getattr(Params,"loc_"+paramI.name.lower()))
        html+="<input type=\"number\" style=\"min-width: 250px\" class=\"form-control\" value=\""+tmp_rem+"\" readonly>"
        html+="<span class=\"input-group-addon\"></span>"
        if tmp_rem==tmp_loc:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"width: 200px\" step=\"1\" class=\"form-control\" value="+tmp_loc+" oninput=\"formEvaluatorInteger(this,'"+tmp_rem+"');\" min=\""+str(paramI.min)+"\" max=\""+str(paramI.max)+"\">"
        else:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"background-color:#ddffdd;width: 200px\" step=\"1\" class=\"form-control\" value="+tmp_loc+" oninput=\"formEvaluatorInteger(this,'"+tmp_rem+"')\" min=\""+str(paramI.min)+"\" max=\""+str(paramI.max)+"\">"
    elif paramI.type=="DOUBLE":
        tmp_rem=str(getattr(Params,"rem_"+paramI.name.lower()))
        tmp_loc=str(getattr(Params,"loc_"+paramI.name.lower()))
        html+="<input type=\"number\" style=\"min-width: 250px\" class=\"form-control\" value=\""+tmp_rem+"\" readonly>"
        html+="<span class=\"input-group-addon\"></span>"
        if tmp_rem==tmp_loc:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"width: 200px\" step=\"1\" class=\"form-control\" value="+tmp_loc+" oninput=\"formEvaluatorDouble(this,'"+tmp_rem+"');\" min=\""+str(paramI.min)+"\" max=\""+str(paramI.max)+"\">"
        else:
            html+="<input name=\"param_input\" id=\""+paramI.name+"\" type=\"text\" style=\"background-color:#ddffdd;width: 200px\" step=\"1\" class=\"form-control\" value="+tmp_loc+" oninput=\"formEvaluatorDouble(this,'"+tmp_rem+"')\" min=\""+str(paramI.min)+"\" max=\""+str(paramI.max)+"\">"
    elif paramI.type=="ENUM":
        enumCount=0
        tmp_rem=getattr(Params,"rem_"+paramI.name.lower())
        if tmp_rem is None:
            tmp_rem=0
        tmp_loc=getattr(Params,"loc_"+paramI.name.lower())
        if tmp_loc is None:
            tmp_loc=0
        listOfEnums=paramI.enumtext.split(",")
        
        if int(tmp_rem)>len(listOfEnums)-1:
            html+="<input type=\"text\" style=\"background-color:#ff0000;min-width: 250px\" class=\"form-control\" value=\"UNAVAILABLE\" readonly>"
            html+="<span class=\"input-group-addon\"></span>"
            html+="<input type=\"text\" style=\"background-color:#ff0000;width: 200px\" class=\"form-control\" value=\"UNAVAILABLE\" readonly>"
        
        else:
            html+="<input type=\"text\" style=\"min-width: 250px\" class=\"form-control\" value=\""+str(listOfEnums[int(tmp_rem)])+"\" readonly>"
            html+="<span class=\"input-group-addon\"></span>"
            if tmp_rem==tmp_loc:
                html+="<select name=\"param_input\" class=\"form-control\" style=\"width: 200px\" id=\""+paramI.name+"\" onchange=\"formEvaluatorEnum(this,'"+str(tmp_rem)+"')\">"
            else:
                html+="<select name=\"param_input\" class=\"form-control\" style=\"background-color:#ddffdd;width: 200px\" id=\""+paramI.name+"\" onchange=\"formEvaluatorEnum(this,'"+str(tmp_rem)+"')\">"
            for enum in listOfEnums:
                if enumCount==int(tmp_loc):
                    html+="<option value=\""+str(enumCount)+"\" selected>"+enum+"</option>"
                else: 
                    html+="<option value=\""+str(enumCount)+"\" >"+enum+"</option>"
                enumCount+=1
            html+="</select>"
    elif paramI.type=="TIME":
        tmp_rem=getattr(Params,"rem_"+paramI.name.lower())
        tmp_loc=getattr(Params,"loc_"+paramI.name.lower())
        html+="<input type=\"text\" style=\"min-width: 250px\" class=\"form-control\" value=\""+str(tmp_rem)+"\" readonly>"
        html+="<span class=\"input-group-addon\"></span>"
        html+="<div class=\"form-group\" style=\"margin-bottom: 0px; width: 200px\">"
        html+="<div class=\"input-group date\" id=\"timePicker\" title=\""+str(tmp_rem)+"\" \">"
        if tmp_rem==tmp_loc:
            html+="<input id=\""+paramI.name+"\" name=\"param_input\" type=\"text\" value=\""+str(tmp_loc)+"\" class=\"form-control\" style=\"height: 30px\"/>"
        else:
            html+="<input id=\""+paramI.name+"\" name=\"param_input\" style=\"background-color:#ddffdd\" type=\"text\" value=\""+str(tmp_loc)+"\" class=\"form-control\" style=\"height: 30px\"/>"
        html+="<span class=\"input-group-addon\">"
        html+="<span class=\"glyphicon glyphicon-time\"></span>"
        html+="</span>"
        html+="</div>"
        html+="</div>"
        
    # Help button
    html+="<span class=\"input-group-btn\">"
    html+="<button class=\"btn btn-primary\" role=\"button\" data-toggle=\"collapse\" href=\"\#"+paramI.name.lower()+"\" aria-expanded=\"false\" aria-controls=\""+paramI.name.lower()+"\">"
    html+="<span class=\"glyphicon glyphicon-menu-down\"></span>"
    html+="</button>"
    html+="</span>"
    html+="</div>"
    html+="</div>"  #End row
    
    html+="<div class=\"collapse\" id=\""+paramI.name.lower()+"\">"
    html+="<div class=\"well\">"
    if request.session.get('lang','en-gb') == 'hr':
        html+=paramI.infotext_cro
    else: 
        html+=paramI.infotext_eng
    html+="</div>"
    html+="</div>"
    return html


def generateParameterUserActionList(request):
       
    Actions=UserActions.objects.filter(lldevice_id=request.GET.get('device_id'),actiontype="PARAM_SAVE").order_by('-timestamp')
    counter=5

    if len(Actions)==0:
        if request.session.get('lang','en-gb') == 'hr':
            response="Log akcija je prazan"
        else:
            response="Action log empty"
        return response

    response="<table class=\"table table-striped\" style=\"font-size: 12\">"
    response+="<thead>"
    response+="<tr>"
    if request.session.get('lang','en-gb') == 'hr':
        response+="<th>Vrijeme</th>"
        response+="<th>Korisnik</th>"
        response+="<th>Akcija</th>"
    else:
        response+="<th>Timestamp</th>"
        response+="<th>Username</th>"
        response+="<th>Action</th>"
    response+="</tr>"
    response+="</thead>"
    response+="<tbody>"
    
    for action in Actions:
        response+="<tr>"
        response+="<td>"+str(action.timestamp)+"</td>"
        response+="<td>"+action.username+"</td>"
        response+="<td data-original-title=\""+action.useraction_long+"\" data-container=\"body\" data-toggle=\"tooltip\" data-placement=\"bottom\" style=\"text-align: center;\">"+action.useraction_short+"</td>"
        response+="</tr>"
        counter -=1
        if counter==0:
            break
        
    response+="</tbody>"
    response+="</table>"
    return response


def generateUnitRecalculationWindow(request):

    PressureUnit = returnPressureUnitString(request.GET.get('device_id'))
    FlowUnit = returnFlowUnitString(request.GET.get('device_id'))
    TotalFlowUnit = returnTotalFlowUnitString(request.GET.get('device_id'))

    RecalculatePressureUnit = returnRecalculatePressureUnitString(request.GET.get('device_id'))
    RecalculateFlowUnit = returnRecalculateFlowUnitString(request.GET.get('device_id'))
    RecalculateTotalFlowUnit = returnRecalculateTotalFlowUnitString(request.GET.get('device_id'))

    response = "<table class=\"table table-striped\" style=\"font-size: 12\">"
    response += "<thead>"
    response += "<tr>"
    if request.session.get('lang', 'en-gb') == 'hr':
        response += "<th>Mjerenje</th>"
        response += "<th>Iz</th>"
        response += "<th>U</th>"
    else:
        response += "<th>Measurement</th>"
        response += "<th>From</th>"
        response += "<th>To</th>"
    response += "</tr>"
    response += "</thead>"
    response += "<tbody>"

    response += "<tr>"
    response += "<td>"
    response += "Pressure"
    response += "</td>"
    response += "<td>"
    response += "<input type=\"text\" style=\"\" class=\"form-control\" value=\"" + str(PressureUnit) + "\" readonly>"
    response += "</td>"
    response += "<td>"
    response += "<select name=\"unit_input\" class=\"form-control\" style=\"\" id=\"PressureRecalculate\">"
    for enum in returnRecalculatePressureUnitOptions():
        if enum == RecalculatePressureUnit:
            response += "<option value=\"" + str(enum) + "\" selected>" + enum + "</option>"
        else:
            response += "<option value=\"" + str(enum) + "\" >" + enum + "</option>"
    response += "</select>"
    response += "</td>"
    response += "</tr>"

    response += "<tr>"
    response += "<td>"
    response += "Flow"
    response += "</td>"
    response += "<td>"
    response += "<input type=\"text\" style=\"\" class=\"form-control\" value=\"" + str(FlowUnit) + "\" readonly>"
    response += "</td>"
    response += "<td>"
    response += "<select name=\"unit_input\" class=\"form-control\" style=\"\" id=\"FlowRecalculate\">"
    for enum in returnRecalculateFlowUnitOptions():
        if enum == RecalculateFlowUnit:
            response += "<option value=\"" + str(enum) + "\" selected>" + enum + "</option>"
        else:
            response += "<option value=\"" + str(enum) + "\" >" + enum + "</option>"
    response += "</select>"
    response += "</td>"
    response += "</tr>"

    response += "<tr>"
    response += "<td>"
    response += "Total flow"
    response += "</td>"
    response += "<td>"
    response += "<input type=\"text\" style=\"\" class=\"form-control\" value=\"" + str(TotalFlowUnit) + "\" readonly>"
    response += "</td>"
    response += "<td>"
    response += "<select name=\"unit_input\" class=\"form-control\" style=\"\" id=\"TotalFlowRecalculate\">"
    for enum in returnRecalculateTotalFlowUnitOptions():
        if enum == RecalculateTotalFlowUnit:
            response += "<option value=\"" + str(enum) + "\" selected>" + enum + "</option>"
        else:
            response += "<option value=\"" + str(enum) + "\" >" + enum + "</option>"
    response += "</select>"
    response += "</td>"
    response += "</tr>"

    response += "</tbody>"
    response += "</table>"
    response += "<button type=\"button\" style=\"margin-top:20px;\" class=\"btn btn-primary btn-block\" onclick=\"saveRecalculateUnitParameters();\">Save</button>"

    return response


def generateParamsList(request):
    if request.user.is_authenticated():
        device_ID=request.GET.get('device_id')
        device_Identifier=request.GET.get('device_identifier')
        Params=LldevicePdlagParameters.objects.filter(lldevicelist=request.GET.get('device_id'))
        counter=0
        
        html="<button style=\"margin-right: 20px; margin-top:-40px; color: #000000; font-size: 30\" type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>"
        html+="<h3 style=\"margin-top: 60px; margin-bottom: 20px\" align=\"center\">Parameters</h3>"
        string_to_show="Identifikator:"+device_Identifier+"<br> ID:"+device_ID
        html+="<h3 class=\"modal-title\" align=\"center\" style=\"margin-top:40px;font-size:16px;margin-bottom:40px\">"+string_to_show+"</h3>"
        html+="<div class=\"row\" style=\"margin: 0px;\">"
        html+="<div class=\"col-sm-1\">"
        html+="</div>"
        html+="<div class=\"col-sm-7\" style=\"text-align: center\">"
        if len(Params)!=1:
            return HttpResponse("Parameters not fetched!")
        
        lastParameterChange=Params[0].lastparameterchange;
        
        # grupa generalno
        ParamInfo=LldevicePdlagParameterinfo.objects.filter(visible__gte=1,group="GENERAL").order_by().order_by('idlldevice_pdlag_parameterinfo','subgroup')
        
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4>Opcenito</h4>"
        else:
            html+="<h4>General</h4>"
        
        lastSubgroup=0
        for paramI in ParamInfo:
            currentSubgroup=paramI.subgroup
            if(currentSubgroup != lastSubgroup):
                html+="<div style=\"margin-top:20px\"></div>"
            lastSubgroup=currentSubgroup
            html+=generateTypeDependHTML(paramI,Params[0],request)

        # grupa alarmi
        ParamInfo=LldevicePdlagParameterinfo.objects.filter(visible__gte=1,group="ALARM").order_by('idlldevice_pdlag_parameterinfo','subgroup')
        
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4>Alarmi</h4>"
        else:
            html+="<h4>Alarms</h4>"
        
        lastSubgroup=0
        for paramI in ParamInfo:
            currentSubgroup=paramI.subgroup
            if(currentSubgroup != lastSubgroup):
                html+="<div style=\"margin-top:20px\"></div>"
            lastSubgroup=currentSubgroup
            html+=generateTypeDependHTML(paramI,Params[0],request)
        
        # grupa measure
        ParamInfo=LldevicePdlagParameterinfo.objects.filter(visible__gte=1,group="MEASURE").order_by('idlldevice_pdlag_parameterinfo','subgroup')
        
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4>Mjerenje</h4>"
        else:
            html+="<h4>Measure</h4>"
        
        lastSubgroup=0
        for paramI in ParamInfo:
            currentSubgroup=paramI.subgroup
            if(currentSubgroup != lastSubgroup):
                html+="<div style=\"margin-top:20px\"></div>"
            lastSubgroup=currentSubgroup
            html+=generateTypeDependHTML(paramI,Params[0],request)
            
        # grupa postavke
        ParamInfo=LldevicePdlagParameterinfo.objects.filter(visible__gte=1,group="SETTINGS").order_by('idlldevice_pdlag_parameterinfo','subgroup')
        
        
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4>Postavke</h4>"
        else:
            html+="<h4>Settings</h4>"
            
        lastSubgroup=0
        for paramI in ParamInfo:
            currentSubgroup=paramI.subgroup
            if(currentSubgroup != lastSubgroup):
                html+="<div style=\"margin-top:20px\"></div>"
            lastSubgroup=currentSubgroup
            html+=generateTypeDependHTML(paramI,Params[0],request)

        
        html+="<button type=\"button\" style=\"margin-top:20px;margin-bottom:40px\" class=\"btn btn-primary btn-block\" onclick=\"startSaveParameters();\">Save</button>"
        html+="</div>"

        html+="<div class=\"col-sm-4\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4>Informacije</h4>"
        else: 
            html+="<h4>Information</h4>"
        html+="<div class=\"panel panel-primary\">"
        html+="<div class=\"panel-heading\">Status</div>"
        html+="<div class=\"panel-body\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="Zadnja promjena prametara: "+str(lastParameterChange)
        else: 
            html+="Last parameter change: "+str(lastParameterChange)
            
        html+="</div>"
        html+="</div>"

        html+="<br>"
        html+="<div class=\"panel panel-primary\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<div class=\"panel-heading\">Log akcija</div>"
        else: 
            html+="<div class=\"panel-heading\">Action log</div>"
        html+="<div class=\"panel-body\">"
        html+=generateParameterUserActionList(request)
        html+="</div>"
        html+="</div>"

        html += "<br>"

        html += "<div class=\"panel panel-primary\">"
        if request.session.get('lang', 'en-gb') == 'hr':
            html += "<div class=\"panel-heading\">Pretvorba mjernih jedinica</div>"
        else:
            html += "<div class=\"panel-heading\">Measurement unit recalculation</div>"
        html += "<div class=\"panel-body\">"
        html += generateUnitRecalculationWindow(request)
        html += "</div>"
        html += "</div>"

        html+="<br>"
        html+="<div class=\"panel panel-primary\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<div class=\"panel-heading\">Pomoc</div>"
        else: 
            html+="<div class=\"panel-heading\">Help</div>"
        html+="<div class=\"panel-body\">"
        
        html+="<div class=\"media\">"
        html+="<div class=\"media-left\">"
        html+="<a href=\"#\">"
        html+="<img class=\"media-object\" src=\"/static/img/info-64.png\" alt=\"...\">"
        html+="</a>"
        html+="</div>"
        html+="<div class=\"media-body\">"
        html+="<h4 class=\"media-heading\">General</h4>"
        if request.session.get('lang','en-gb') == 'hr':
            html+="Opcenite informacije o uredaju"
        else: 
            html+="General information about the device."
        html+="</div>"
        html+="</div>"
        
        html+="<div class=\"media\">"
        html+="<div class=\"media-left\">"
        html+="<a href=\"#\">"
        html+="<img class=\"media-object\" src=\"/static/img/alarm_clock-64.png\" alt=\"...\">"
        html+="</a>"
        html+="</div>"
        html+="<div class=\"media-body\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4 class=\"media-heading\">Alarmi</h4>"
            html+="Postavke alarma za sve kanale. Podesite granice alarma i promjenite nacin njihove dojave."
        else:
            html+="<h4 class=\"media-heading\">Alarms</h4>"
            html+="Alarm settings for all channels. Adjust the limits of each alarm and change the reporting option of the alarm."
        html+="</div>"
        html+="</div>"
        
        html+="<div class=\"media\">"
        html+="<div class=\"media-left\">"
        html+="<a href=\"#\">"
        html+="<img class=\"media-object\" src=\"/static/img/scatter_plot-64.png\" alt=\"...\">"
        html+="</a>"
        html+="</div>"
        html+="<div class=\"media-body\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4 class=\"media-heading\">Mjerenje</h4>"
            html+="Razlicite postavke vezane uz mjerenje, kao sto su mjerne jedinice, interval slanja podataka te faktori skaliranja za senzore."
        else:
            html+="<h4 class=\"media-heading\">Measure</h4>"
            html+="Various settings related to measurements such as measurement units, GPRS reporting options or sensor scaling factors."
        html+="</div>"
        html+="</div>"
        
        html+="<div class=\"media\">"
        html+="<div class=\"media-left\">"
        html+="<a href=\"#\">"
        html+="<img class=\"media-object\" src=\"/static/img/settings-64.png\" alt=\"...\">"
        html+="</a>"
        html+="</div>"
        html+="<div class=\"media-body\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<h4 class=\"media-heading\">Postavke</h4>"
            html+="Postavke vezane uz mrezu ili vezu sa serverom. Upozoravamo korisnika da ne mijenja ove postavke bez prethodnih konzultacija sa tehnickom podrskom."
        else:
            html+="<h4 class=\"media-heading\">Settings</h4>"
            html+="Settings related to network and server connection. We advise the user not to change these settings without prior consultation with the technical support."
        html+="</div>"
        html+="</div>"
        
        html+="</div>"
        html+="</div>"
        html+="<br>"
        html+="<div class=\"panel panel-primary\">"
        if request.session.get('lang','en-gb') == 'hr':
            html+="<div class=\"panel-heading\">Legenda</div>"
        else: 
            html+="<div class=\"panel-heading\">Legend</div>"
        html+="<div class=\"panel-body\">"
        html+="<div class=\"row\">"
        if request.session.get('lang','en-gb') == 'hr':
            text="Parametar odgovara stanju na uredaju"
        else: 
            text="No parameter change is required"
        html+="<div class=\"box\" style=\"height: 35px; text-align: center;line-height: 30px;border-style: solid;border-width: 1px; margin: 10px;background-color:#ffffff\">"+text+"</div>"
        html+="</div>"
        html+="<div class=\"row\">"
        if request.session.get('lang','en-gb') == 'hr':
            text="Promjene za koje se ceka upis na uredaj"
        else: 
            text="Changes waiting to be written to device"
        html+="<div class=\"box\" style=\"height: 35px; text-align: center;line-height: 30px; border-style: solid;border-width: 1px; margin: 10px; background-color:#ddffdd\">"+text+"</div>"
        html+="</div>"
        html+="<div class=\"row\">"
        if request.session.get('lang','en-gb') == 'hr':
            text="Greska upisa parametra"
        else: 
            text="Parameter input error"
        html+="<div class=\"box\" style=\"height: 35px; text-align: center;line-height: 30px;border-style: solid;border-width: 1px; margin: 10px;background-color:#ffbbbb\">"+text+"</div>"
        html+="</div>"
        html+="<div class=\"row\">"
        if request.session.get('lang','en-gb') == 'hr':
            text="Promjena koja nije spremljena"
        else: 
            text="Non-saved changes"
        html+="<div class=\"box\" style=\"height: 35px; text-align: center;line-height: 30px;border-style: solid;border-width: 1px; margin: 10px;background-color:#ffffbb\">"+text+"</div>"
        html+="</div>"
        html+="</div>"
                
        html+="</div>"
        return HttpResponse(html)
    else:
        return HttpResponse('invalid User')


def writeParamsChanges(request):
    if request.user.is_authenticated():
        failCount=0
        successCount=0
        userUsername=request.user.username
        userActionDataLong=""
        userActionDataShort=""
        
        try:
        
            ParamInfo=LldevicePdlagParameterinfo.objects.all()
            dict={}
            errorParamList=[]
            for Param in ParamInfo:
                Value=request.GET.get(Param.name)
                if Value is not None:
                    FieldName="loc_"+Param.name.lower()
                    if checkValue(Param.name.upper(),Value,Param)==False:
                        failCount+=1
                        errorParamList.append("1-"+Param.name.upper())
                        continue
                        
                    d = {FieldName:Value}
                    dict.update(d)
                    successCount+=1     
                else:
                    failCount+=1
                    errorParamList.append("0-"+Param.name.upper())
            
            tmp=LldevicePdlagParameters.objects.filter(lldevicelist=request.GET.get('device_id')).update(**dict) 
            if failCount>0:
                userActionDataShort="New data save with "+str(failCount)+" errors"
                userActionDataLong="Success: "+str(successCount)+" Fail: "+str(failCount)+" Params: "+",".join(errorParamList)
                UserActionData=UserActions(timestamp=datetime.datetime.now(),actiontype="PARAM_SAVE",useraction_short=userActionDataShort,useraction_long=userActionDataLong,username=str(userUsername),lldevice_id=request.GET.get('device_id'))
                UserActionData.save()
                
                return HttpResponse("Success: "+str(successCount)+" Fail: "+str(failCount)+" Params: "+",".join(errorParamList))
            else: 
                userActionDataShort="New data save"
                userActionDataLong="Success: "+str(successCount)+" Fail: "+str(failCount)+" Params: "+",".join(errorParamList)
                UserActionData=UserActions(timestamp=datetime.datetime.now(),actiontype="PARAM_SAVE",useraction_short=userActionDataShort,useraction_long=userActionDataLong,username=str(userUsername),lldevice_id=request.GET.get('device_id'))
                UserActionData.save()
                return HttpResponse("OK")
        except Exception as e:
            return HttpResponse(e.message) 
    else:
        return HttpResponse('invalid User')


def writeRecalculateUnitChanges(request):
    if request.user.is_authenticated():
        failCount = 0
        successCount = 0
        userUsername = request.user.username
        userActionDataLong = ""
        userActionDataShort = ""
        errorParamList = []

        try:

            dict = {}
            FieldNamePressure = "loc_pressurerecalculateunit"
            PressureValue = request.GET.get("PressureRecalculate")

            if PressureValue in returnRecalculatePressureUnitOptions():
                successCount+=1
                d = {FieldNamePressure: PressureValue}
                dict.update(d)
            else:
                failCount+=1

            FieldNameFlow = "loc_flowrecalculateunit"
            FlowValue = request.GET.get("FlowRecalculate")

            if FlowValue in returnRecalculateFlowUnitOptions():
                successCount+=1
                d = {FieldNameFlow: FlowValue}
                dict.update(d)
            else:
                failCount+=1

            FieldNameTotalFlow = "loc_totalflowrecalculateunit"
            TotalFlowValue = request.GET.get("TotalFlowRecalculate")
            if TotalFlowValue in returnRecalculateTotalFlowUnitOptions():
                successCount+=1
                d = {FieldNameTotalFlow: TotalFlowValue}
                dict.update(d)
            else:
                failCount+=1
                errorParamList.append("1-")

            tmp = Lldevicelist.objects.filter(id=request.GET.get('device_id')).update(**dict)
            if failCount > 0:
                userActionDataShort = "New unit save with " + str(failCount) + " errors"
                userActionDataLong = "Success: " + str(successCount) + " Fail: " + str(
                    failCount) + " Params: " + ",".join(errorParamList)
                UserActionData = UserActions(timestamp=datetime.datetime.now(), actiontype="PARAM_SAVE",
                                             useraction_short=userActionDataShort, useraction_long=userActionDataLong,
                                             username=str(userUsername), lldevice_id=request.GET.get('device_id'))
                UserActionData.save()

                return HttpResponse(
                    "Success: " + str(successCount) + " Fail: " + str(failCount) + " Params: " + ",".join(
                        errorParamList))
            else:
                userActionDataShort = "New unit save"
                userActionDataLong = "Success: " + str(successCount) + " Fail: " + str(
                    failCount) + " Params: " + ",".join(errorParamList)
                UserActionData = UserActions(timestamp=datetime.datetime.now(), actiontype="UNIT_SAVE",
                                             useraction_short=userActionDataShort, useraction_long=userActionDataLong,
                                             username=str(userUsername), lldevice_id=request.GET.get('device_id'))
                UserActionData.save()
                return HttpResponse("OK")
        except Exception as e:
            return HttpResponse(e.message)
    else:
        return HttpResponse('invalid User')

def checkValue(paramname, paramvalue, paramI):
   
    if paramI.type=="STRING":
        MaxLen=paramI.max
        #if re.match("^[A-Za-z0-9_-]*$", paramvalue):
        if len(paramvalue)>MaxLen:
            return False
        else:
            return True
        #else:
        #    return False
    elif paramI.type == "INTEGER":
        Max=paramI.max
        Min=paramI.min
            
        if int(paramvalue)>Max or int(paramvalue)<Min:
            return False
        else: 
            return True
    elif paramI.type == "DOUBLE":
        Max=paramI.max
        Min=paramI.min
            
        if(float(paramvalue)>Max or float(paramvalue)<Min):
            return False
        else: 
            return True
    elif paramI.type == "ENUM":
        Max=paramI.max
        Min=paramI.min
            
        if(int(paramvalue)>Max or int(paramvalue)<Min):
            return False
        else: 
            return True
    elif paramI.type == "TIME":            
        try:
            time.strptime(paramvalue, '%H:%M:%S')
            return True
        except ValueError:
            return False
    else:
        return False    
    

def identifyAnomalies(request):
    if request.user.is_authenticated():
        try:
            JSONData={}
            FilterValue =request.GET.get('Filter')
            GraphName   =request.GET.get('GraphName')
            GraphNumber =request.GET.get('GraphNumber')
            Channel     =request.GET.get('Channel')
            
            Measurements=LldevicePdlagMeasure.objects.filter(timestamp__gte=datetime.datetime.strptime(request.GET.get('startDateInput'), "%Y-%m-%d %H:%M:%S"),timestamp__lte=datetime.datetime.strptime(request.GET.get('EndDateInput'), "%Y-%m-%d %H:%M:%S"), lldevicelist=request.GET.get('device_id')).order_by('timestamp')
            counterVector=[]
            timeVector=[]
            dataVector=[]
            counter=0;
            for measure in Measurements:
                counter=counter+1;
                counterVector.append(counter)
                timeVector.append(measure.timestamp)
                dataVector.append(measure.ch1_pressure)
            
            d = {'col1': timeVector, 'col2': dataVector}
            data = pd.DataFrame(data=d, index=counterVector)
             
            results = detect_ts(data, max_anoms=0.02, direction='both');
            
            b=results['anoms'].iloc[:,1].values
            
            stringArray=[]
            for i in range(1, len(b)):

                ts = pd.to_datetime(str(b[i])) 
                d = ts.strftime('%Y-%m-%d %H:%M:%S')
                stringArray.append(d)
            
            print stringArray
            JSONData['anomalies']=stringArray
            return JsonResponse(  JSONData )       
        except Exception as e:
            return HttpResponse(e.message) 
    else:
        return HttpResponse('Invalid user')

