# Python imports
from datetime import datetime
import json, copy, numpy
import cgi

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

# LeakLess Monitor imports
from Applications.Measure.models import Llmeasurementgroup, Llmeasurementgroupmeasurements, Llmeasurementgroupcalculations
from Applications.Measure.views import measure_get_measure_data, measure_get_multiple_measure_data
from Applications.Users.views import user_get_information, user_get_device, user_get_language
from Applications.Measure.Groups.forms import *
from Applications.Devices.views import devices_return_user_device_list
from Applications.Devices.models import Lldevicelist

MEASUREMENT_MAPPING = {
    'CH1P'  : 'ch1_pressure',
    'CH2P'  : 'ch2_pressure',
    'CH1F'  : 'ch1_flow',
    'CH2F'  : 'ch2_flow',
    'CH1T'  : 'ch1_total_flow',
    'CH2T'  : 'ch2_total_flow',
    'CH1D'  : 'digital_ch1',
    'CH2D'  : 'digital_ch2'
}

MEASUREMENT_MAPPING_CRO = {
    'CH1P'  : 'Tlak CH1',
    'CH2P'  : 'Tlak CH2',
    'CH1F'  : 'Protok CH1',
    'CH2F'  : 'Protok CH2',
    'CH1T'  : 'Uk. protok CH1',
    'CH2T'  : 'Uk. protok CH2',
    'CH1D'  : 'Signal CH1',
    'CH2D'  : 'Signal CH2'
}

MEASUREMENT_MAPPING_ENG = {
    'CH1P'  : 'Pressure CH1',
    'CH2P'  : 'Pressure CH2',
    'CH1F'  : 'Flow CH1',
    'CH2F'  : 'Flow CH2',
    'CH1T'  : 'Tot. flow CH1',
    'CH2T'  : 'Tot. flow CH2',
    'CH1D'  : 'Digital CH1',
    'CH2D'  : 'Digital CH2'
}
def measurement_groups_view(request):
    if request.user.is_authenticated():
        measurement_group_treeview=[]

        measurement_group_list=measurement_groups_return_user_measurement_groups(request)
        lang = user_get_language(request)
        for measurement_group in measurement_group_list:
            measurement_group_treeview.append(measurement_groups_return_group_node(measurement_group, lang))

        user_information=user_get_information(request)
        user_device_type=user_get_device(request)
        return render_to_response('measurement_groups.html',{   'user_object'                   : request.user,
                                                                'user_info'                     : user_information,
                                                                'user_device_type'              : user_device_type,
                                                                'measurement_groups_treeview'   : json.dumps(measurement_group_treeview),
                                                                'lang'                          : user_get_language(request)},  RequestContext(request))
    else:
        return HttpResponse('Invalid user')


def measurement_group_get_data(request):
    if request.user.is_authenticated():
        if request.is_ajax():
            if request.method == 'POST':
                return_data =json.loads(request.body)
                measurement_group_id    = return_data['measurement_group_id']
                data_start_date         = datetime.strptime(return_data['start_date'], "%Y-%m-%d 00:00:00")
                data_end_date           = datetime.strptime(return_data['end_date'], "%Y-%m-%d 23:59:59")
                group_list              = request.user.groups.values_list('name', flat=True)
                primary_group           = group_list.first()

                try:
                    measurement_group               = Llmeasurementgroup.objects.get(usergroupname=primary_group, idllmeasurementgroup=measurement_group_id)
                    group_measurement_list          = Llmeasurementgroupmeasurements.objects.filter(measurementgroupid=measurement_group)
                    group_calculation_list          = Llmeasurementgroupcalculations.objects.filter(measurementgroupid=measurement_group)
                    device_list                     = group_measurement_list.values('deviceid').distinct()
                    group_measurement_count         = len(group_measurement_list)
                    device_group_measurement_list   = {}
                    group_measurement_indexes       = {}

                    masurement_labels=['']
                    masurement_series=[]
                    calculate_labels=[]
                    calculate_series=[]
                    calculate_equations=[]

                    plot_name = measurement_group.groupname + ' ['+measurement_group.groupinfo+']'
                    left_axis_label=measurement_group.axisleftlabel
                    right_axis_label=measurement_group.axisrightlabel

                    counter=0
                    for group_calculation in group_calculation_list:
                        group_calculation_label =group_calculation.name+ ' ['+group_calculation.info+']'
                        calculate_labels.append(group_calculation_label)
                        calculate_equations.append(group_calculation.equation)
                        if group_calculation.axis == 1:
                            calculate_series.append({'axis': 'y1'})
                        else:
                            calculate_series.append({'axis': 'y2'})
                        counter+=1

                    counter=0
                    for group_measurement in group_measurement_list:
                        group_measurement_indexes[group_measurement.deviceid_id+' '+group_measurement.measurement]=counter
                        group_measurement_label =group_measurement.deviceid_id+ ' ['+group_measurement.deviceid.rem_identifier+'] ['+group_measurement.measurement+']'
                        masurement_labels.append(group_measurement_label)
                        if group_measurement.axis == 1:
                            masurement_series.append({ 'axis': 'y1'})
                        else:
                            masurement_series.append({ 'axis': 'y2'})

                        counter+=1

                    for device in device_list:
                        device_id=device['deviceid']
                        temp=group_measurement_list.filter(deviceid=device_id)
                        device_group_measurement_list[device_id]=list(temp)


                    measurement_list = measure_get_multiple_measure_data(device_list, data_start_date, data_end_date)

                    data=[]

                    current_timestamp = ''
                    previous_timestamp = ''
                    for measurement in measurement_list:
                        device_id=measurement.lldevicelist_id

                        current_timestamp = measurement.timestamp

                        if current_timestamp != previous_timestamp:
                            data.append([None]*(group_measurement_count+1))
                            data[-1][0] = str(measurement.timestamp).replace("-", "/")

                        for device_group_measurement in device_group_measurement_list[device_id]:
                            measurement_name=device_group_measurement.measurement
                            measurement_index= group_measurement_indexes[device_id+' '+ measurement_name]+1
                            value=getattr(measurement,MEASUREMENT_MAPPING[measurement_name])
                            if value is None:
                                value = 0
                            data[-1][measurement_index]=value

                        previous_timestamp = current_timestamp

                    return_data={
                        'data'                  : data,
                        'plot_name'             : plot_name,
                        'left_axis_label'       : left_axis_label,
                        'right_axis_label'      : right_axis_label,
                        'masurement_labels'     : masurement_labels,
                        'masurement_series'     : masurement_series,
                        'calculate_labels'      : calculate_labels,
                        'calculate_series'      : calculate_series,
                        'calculate_equations'   : calculate_equations
                    }


                    response ={
                        'ok'                : False,
                        'data'              : return_data,
                        'response_text'     : 'Ok',
                    }
                    return JsonResponse(response)

                except ObjectDoesNotExist:
                    response ={
                        'ok'              : False,
                        'response_text'   : 'Group not found',
                    }
                    return JsonResponse(response)
    else:
        return HttpResponse('Invalid user')


def measurement_group_return_group_data(request):
    measurement_group_treeview=[]
    lang = user_get_language(request)

    measurement_group_list=measurement_groups_return_user_measurement_groups(request)

    for measurement_group in measurement_group_list:
        measurement_group_treeview.append(measurement_groups_return_group_node(measurement_group, lang))

    data_response = {
        'data' : measurement_group_treeview
    }
    return JsonResponse(data_response)

def measurement_groups_return_user_measurement_groups(request):
    group_list = request.user.groups.values_list('name', flat=True)
    primary_group = group_list.first()
    measurement_group_list = Llmeasurementgroup.objects.filter(usergroupname=primary_group)
    return measurement_group_list

def measurement_groups_return_group_node(measurement_group, lang):
    return_data={
        'text'              : measurement_group.groupname +' ['+measurement_group.groupinfo+']',
        'icon'              : "glyphicon glyphicon-stop",
        'selectedIcon'      : "glyphicon glyphicon-stop",
        'showCheckbox'      : False,
        'color'             : "#000000",
        'type'              : "group",
        'backColor'         : "white",
        'group_name'        : measurement_group.groupname,
        'group_id'          : measurement_group.idllmeasurementgroup,
        #'href'             : "#node-1",
        'selectable'        : True,
        'state': {
            'checked'       : False,
            'disabled'      : False,
            'expanded'      : False,
            'selected'      : False
        },
        #'tags'              : [device_identifier],
        'nodes'             : measurement_groups_return_subnodes(measurement_group.idllmeasurementgroup, lang)
    }
    return return_data

def measurement_groups_return_subnodes(mesurementgroup_id, lang):
    measurement_group_measurement_list = Llmeasurementgroupmeasurements.objects.filter(measurementgroupid=mesurementgroup_id)
    measurement_group_calculation_list = Llmeasurementgroupcalculations.objects.filter(measurementgroupid=mesurementgroup_id)

    return_data=[]
    measurement_subnodes=[]
    calculate_subnodes=[]

    node_measurement_info={
        'text'              : "Measurements",
        'icon'              : "glyphicon glyphicon-stop",
        'selectedIcon'      : "glyphicon glyphicon-stop",
        'selectable '       : False,
        'type'              : "measurement_group",
        'group_id'          : mesurementgroup_id,
        'measurement_id'    : 0,
        'state': {
            'checked'       : True,
            'disabled'      : False,
            'expanded'      : False,
            'selected'      : False
        },
        'tags'              : ['available'],
        'nodes'             : []
    }


    node_calculate_info={
        'text'              : "Calculations",
        'icon'              : "glyphicon glyphicon-stop",
        'selectedIcon'      : "glyphicon glyphicon-stop",
        'selectable '       : False,
        'type'              : "calculation_group",
        'group_id'          : mesurementgroup_id,
        'calculation_id'    : 0,
        'state': {
            'checked'       : True,
            'disabled'      : False,
            'expanded'      : False,
            'selected'      : False
        },
        'tags'              : ['available'],
        'nodes'             : []
    }

    node_info={
        'text'              : "Unknown",
        'icon'              : "glyphicon glyphicon-stop",
        'selectedIcon'      : "glyphicon glyphicon-stop",
        'color'             : "#000000",
        'group_id'          : mesurementgroup_id,
        'selectable '       : False,
        'showCheckbox'      : True,
        'state': {
            'checked'       : True,
            'disabled'      : False,
            'expanded'      : False,
            'selected'      : False
        },
    }

    if lang == 'hr':
        node_measurement_info['text'] = "Mjerenje"
        node_calculate_info['text'] = "Proracun"
    else:
        node_measurement_info['text'] = "Measurement"
        node_calculate_info['text'] = "Calculation"


    measurement_counter=0
    for measurement_group_measurement in measurement_group_measurement_list:
        node_info_new=node_info.copy()
        node_info_new['text'] = measurement_group_measurement.deviceid.rem_identifier+ ' ['+measurement_group_measurement.info+']'
        node_info_new['type'] = "measurement"
        node_info_new['number'] = measurement_counter
        node_info_new['measurement_id'] = measurement_group_measurement.idllmeasurementgroupmeasurements
        if lang == 'hr':
            node_info_new['tags']=[MEASUREMENT_MAPPING_CRO[measurement_group_measurement.measurement]]
        else:
            node_info_new['tags']=[MEASUREMENT_MAPPING_ENG[measurement_group_measurement.measurement]]
        measurement_subnodes.append(node_info_new)
        measurement_counter+=1

    node_measurement_info['nodes']=measurement_subnodes
    node_measurement_info['tags']=[str(measurement_counter)]

    calculation_counter=0
    for measurement_group_calculation in measurement_group_calculation_list:
        node_info_new=node_info.copy()
        node_info_new['text'] = measurement_group_calculation.name+ ' ['+measurement_group_calculation.info+']'
        node_info_new['type'] = "calculation"
        node_info_new['number'] = calculation_counter+measurement_counter
        node_info_new['calculation_id'] = measurement_group_calculation.idllmeasurementgroupcalculations
        node_info_new['tags']=[measurement_group_calculation.equation]
        calculate_subnodes.append(node_info_new)
        calculation_counter+=1

    node_calculate_info['nodes']=calculate_subnodes
    node_calculate_info['tags']=[str(calculation_counter)]


    return_data.append(node_measurement_info)
    return_data.append(node_calculate_info)

    return return_data

def measurement_groups_return_group_id(group_name):
    try:
        measurement_group=Llmeasurementgroup.objects.get(groupname=group_name)
        return measurement_group.groupname
    except ObjectDoesNotExist:
        return None

def measurement_groups_delete_measurement_group(request):
    if request.user.is_authenticated():
        if request.is_ajax():
            if request.method == 'POST':
                return_data =json.loads(request.body)
                measurement_group_name  = return_data['group_name']
                group_list = request.user.groups.values_list('name', flat=True)
                primary_group = group_list.first()
                try:
                    measurement_group=Llmeasurementgroup.objects.get(usergroupname=primary_group, groupname=measurement_group_name)
                    measurement_group.delete()
                    response ={
                        'ok'              : True,
                        'response_text'   : 'Group deleted',
                    }
                    return JsonResponse(response)

                except ObjectDoesNotExist:
                    response ={
                        'ok'              : False,
                        'response_text'   : 'Group not found',
                    }
                    return JsonResponse(response)
    else:
        return HttpResponse('Invalid user')

def measurement_groups_return_new_measurement_group_form(request):
    if request.method == 'POST':

        form = NewMeasurementGroupFormCro(request.POST)

        if form.is_valid():
            group_name = form.cleaned_data['group_name']
            group_info = form.cleaned_data['group_info']
            try:
                Llmeasurementgroup.objects.get(groupname=group_name)
            except ObjectDoesNotExist:
                group_list = request.user.groups.values_list('name', flat=True)
                primary_group = group_list.first()
                new_measurement_group = Llmeasurementgroup()
                new_measurement_group.groupname=group_name
                new_measurement_group.groupinfo=group_info
                new_measurement_group.usergroupname=primary_group

                new_measurement_group.axisleftlabel = form.cleaned_data['axis_left_label']
                new_measurement_group.axisleftunit = form.cleaned_data['axis_left_unit']
                new_measurement_group.axislefttype = form.cleaned_data['axis_left_type']

                new_measurement_group.axisrightlabel = form.cleaned_data['axis_right_label']
                new_measurement_group.axisrightunit = form.cleaned_data['axis_right_unit']
                new_measurement_group.axisrighttype = form.cleaned_data['axis_right_type']

                new_measurement_group.save()
                return HttpResponse('Ok')

            return HttpResponse('Error')
            # provjeri je li grupa vec postoji

        else:
            return HttpResponse('Error')

    else:

        lang = user_get_language(request)
        if lang == "hr":
            form = NewMeasurementGroupFormCro()
        else:
            form = NewMeasurementGroupFormEng()

        fields = list(form)
        fields_general = []
        fields_axl = []
        fields_axr = []

        for field in fields:
            if field.field.group == 'General':
                fields_general.append(field)
            if field.field.group == 'AXL':
                fields_axl.append(field)
            if field.field.group == 'AXR':
                fields_axr.append(field)

        return render_to_response(
            'newMeasurementGroupForm.html',{ 'fields_general'   : fields_general,
                                             'fields_axl'       : fields_axl,
                                             'fields_axr'       : fields_axr,
                                             'lang'     : lang},
            context_instance=RequestContext(request)
        )

def measurement_groups_return_edit_measurement_group_form(request):
    if request.method == 'POST':

        form = EditMeasurementGroupFormCro(request.POST)

        if form.is_valid():
            group_name_fixed = form.cleaned_data['group_name_fixed']
            try:
                measurement_group= Llmeasurementgroup.objects.get(groupname=group_name_fixed)
                measurement_group.groupname=form.cleaned_data['group_name']
                measurement_group.groupinfo= form.cleaned_data['group_info']
                
                measurement_group.axisleftlabel = form.cleaned_data['axis_left_label']
                measurement_group.axisleftunit = form.cleaned_data['axis_left_unit']
                measurement_group.axislefttype = form.cleaned_data['axis_left_type']

                measurement_group.axisrightlabel = form.cleaned_data['axis_right_label']
                measurement_group.axisrightunit = form.cleaned_data['axis_right_unit']
                measurement_group.axisrighttype = form.cleaned_data['axis_right_type']

                measurement_group.save()
                return HttpResponse('Ok')

            except ObjectDoesNotExist:
                return HttpResponse('Error')

            # provjeri je li grupa vec postoji

        else:
            return HttpResponse('Error')

    else:
        group_name_fixed = request.GET['group_name']
        try:
            measurement_group = Llmeasurementgroup.objects.get(groupname=group_name_fixed)
        except ObjectDoesNotExist:
            return HttpResponse('Error')

        lang = user_get_language(request)
        initial={   'group_name_fixed'  : group_name_fixed,
                    'group_name'        : measurement_group.groupname,
                    'group_info'        : measurement_group.groupinfo,
                    'axis_left_label'  : measurement_group.axisleftlabel,
                    'axis_left_unit'   : measurement_group.axisleftunit,
                    'axis_left_type'   : measurement_group.axislefttype,
                    'axis_right_label' : measurement_group.axisrightlabel,
                    'axis_right_unit'  : measurement_group.axisrightunit,
                    'axis_right_type'  : measurement_group.axisrighttype
        }

        if lang == "hr":
            form = EditMeasurementGroupFormCro(initial=initial)
        else:
            form = EditMeasurementGroupFormEng(initial=initial)

        fields = list(form)
        fields_general = []
        fields_axl=[]
        fields_axr=[]

        for field in fields:
            if field.field.group == 'General':
                fields_general.append(field)
            if field.field.group=='AXL':
                fields_axl.append(field)
            if field.field.group=='AXR':
                fields_axr.append(field)

        return render_to_response(
            'editMeasurementGroupForm.html',{ 'fields_general'  : fields_general,
                                              'fields_axl'     : fields_axl,
                                              'fields_axr'     : fields_axr,
                                              'lang'            : lang},
            context_instance=RequestContext(request)
        )

def measurement_groups_delete_measurement_group_measurement(request):
    if request.user.is_authenticated():
        if request.is_ajax():
            if request.method == 'POST':
                return_data =json.loads(request.body)
                measurement_id  = return_data['measurement_id']

                group_list = request.user.groups.values_list('name', flat=True)
                primary_group = group_list.first()
                try:
                    measurement_group=Llmeasurementgroupmeasurements.objects.get(idllmeasurementgroupmeasurements=measurement_id)
                    if measurement_group.measurementgroupid.usergroupname != primary_group:
                        response ={
                            'ok'              : False,
                            'response_text'   : 'No permission to delete measurement form group',
                        }
                        return JsonResponse(response)


                    measurement_group.delete()
                    response ={
                        'ok'              : True,
                        'response_text'   : 'Measurement deleted',
                    }
                    return JsonResponse(response)

                except ObjectDoesNotExist:
                    response ={
                        'ok'              : False,
                        'response_text'   : 'Measurement not found',
                    }
                    return JsonResponse(response)
    else:
        return HttpResponse('Invalid user')

def measurement_groups_return_new_measurement_group_measurement_form(request):
    if request.user.is_authenticated():
        user_device_list = devices_return_user_device_list(request)
        device_choice_list = []
        for device in user_device_list:
            if device.loc_type == 'PDL-AG':
                device_choice_list.append((device.id, device.id + ' [' + device.rem_identifier + ']'))

        measurement_group_list = measurement_groups_return_user_measurement_groups(request)
        measurement_group_choice_list = []
        for measurement_group in measurement_group_list:
            measurement_group_choice_list.append((measurement_group.idllmeasurementgroup, measurement_group.groupname))

        if request.method == 'POST':
            form = NewMeasurementGroupMeasurementFormCro(device_choice_list,measurement_group_choice_list,request.POST)

            if form.is_valid():
                group_measurement=Llmeasurementgroupmeasurements()

                group_measurement.measurementgroupid    = Llmeasurementgroup.objects.get(idllmeasurementgroup=form.cleaned_data['group_id'])
                group_measurement.deviceid              = Lldevicelist.objects.get(id=form.cleaned_data['device_id'])
                group_measurement.measurement           = form.cleaned_data['measurement_type']
                group_measurement.axis                  = form.cleaned_data['measurement_axis']
                group_measurement.info                  = form.cleaned_data['measurement_info']

                group_measurement.save()

                return HttpResponse('Ok')
            else:
                return HttpResponse('Error')

        else:

            group_id = request.GET['group_id']

            lang = user_get_language(request)



            if lang == "hr":
                form = NewMeasurementGroupMeasurementFormCro(device_choice_list,measurement_group_choice_list,initial={'group_id': group_id})
            else:
                form = NewMeasurementGroupMeasurementFormEng(device_choice_list,measurement_group_choice_list,initial={'group_id': group_id})

            fields = list(form)

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

def measurement_groups_return_edit_measurement_group_measurement_form(request):
    if request.user.is_authenticated():
        user_device_list = devices_return_user_device_list(request)
        device_choice_list = []
        for device in user_device_list:
            if device.loc_type == 'PDL-AG':
                device_choice_list.append((device.id, device.id + ' [' + device.rem_identifier + ']'))

        measurement_group_list = measurement_groups_return_user_measurement_groups(request)
        measurement_group_choice_list = []
        for measurement_group in measurement_group_list:
            measurement_group_choice_list.append((measurement_group.idllmeasurementgroup, measurement_group.groupname))

        if request.method == 'POST':

            form = EditMeasurementGroupMeasurementFormCro(device_choice_list,measurement_group_choice_list,request.POST)

            if form.is_valid():
                try:
                    measurement_group= Llmeasurementgroupmeasurements.objects.get(idllmeasurementgroupmeasurements=form.cleaned_data['measurement_group_id_fixed'])

                    measurement_group.measurementgroupid    = Llmeasurementgroup.objects.get(idllmeasurementgroup=form.cleaned_data['group_id'])
                    measurement_group.deviceid              = Lldevicelist.objects.get(id=form.cleaned_data['device_id'])
                    measurement_group.measurement           = form.cleaned_data['measurement_type']
                    measurement_group.axis                  = form.cleaned_data['measurement_axis']
                    measurement_group.info                  = form.cleaned_data['measurement_info']
                    measurement_group.save()
                    return HttpResponse('Ok')

                except ObjectDoesNotExist:
                    return HttpResponse('Error')

                # provjeri je li grupa vec postoji

            else:
                return HttpResponse('Error')

        else:
            measurement_group_id_fixed = request.GET['measurement_group_id']
            try:
                measurement_group = Llmeasurementgroupmeasurements.objects.get(idllmeasurementgroupmeasurements=measurement_group_id_fixed)
            except ObjectDoesNotExist:
                return HttpResponse('Error')

            lang = user_get_language(request)
            initial={   'measurement_group_id_fixed': measurement_group_id_fixed,
                        'group_id'                  : measurement_group.measurementgroupid.idllmeasurementgroup,
                        'device_id'                 : measurement_group.deviceid.id,
                        'measurement_type'          : measurement_group.measurement,
                        'measurement_axis'          : measurement_group.axis,
                        'measurement_info'          : measurement_group.info}

            if lang == "hr":
                form = EditMeasurementGroupMeasurementFormCro(device_choice_list,measurement_group_choice_list, initial=initial)
            else:
                form = EditMeasurementGroupMeasurementFormEng(device_choice_list,measurement_group_choice_list, initial=initial)

            fields = list(form)

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

def measurement_groups_delete_measurement_group_calculation(request):
    if request.user.is_authenticated():
        if request.is_ajax():
            if request.method == 'POST':
                return_data =json.loads(request.body)
                calculation_id  = return_data['calculation_id']

                group_list = request.user.groups.values_list('name', flat=True)
                primary_group = group_list.first()
                try:
                    calculation_group=Llmeasurementgroupcalculations.objects.get(idllmeasurementgroupcalculations=calculation_id)
                    if calculation_group.measurementgroupid.usergroupname != primary_group:
                        response ={
                            'ok'              : False,
                            'response_text'   : 'No permission to delete calculation form group',
                        }
                        return JsonResponse(response)

                    calculation_group.delete()
                    response ={
                        'ok'              : True,
                        'response_text'   : 'Calculation deleted',
                    }
                    return JsonResponse(response)

                except ObjectDoesNotExist:
                    response ={
                        'ok'              : False,
                        'response_text'   : 'Calculation not found',
                    }
                    return JsonResponse(response)
    else:
        return HttpResponse('Invalid user')

def measurement_groups_return_new_measurement_group_calculation_form(request):
    if request.user.is_authenticated():
        measurement_group_list = measurement_groups_return_user_measurement_groups(request)
        measurement_group_choice_list = []
        for measurement_group in measurement_group_list:
            measurement_group_choice_list.append((measurement_group.idllmeasurementgroup, measurement_group.groupname))

        if request.method == 'POST':
            form = NewMeasurementGroupCalculationFormCro(measurement_group_choice_list,request.POST)

            if form.is_valid():
                group_calculation=Llmeasurementgroupcalculations()

                group_calculation.measurementgroupid    = Llmeasurementgroup.objects.get(idllmeasurementgroup=form.cleaned_data['group_id'])
                group_calculation.name                  = form.cleaned_data['calculation_name']
                group_calculation.info                  = form.cleaned_data['calculation_info']
                group_calculation.axis                  = form.cleaned_data['calculation_axis']
                group_calculation.equation              = form.cleaned_data['calculation_equation']

                group_calculation.save()

                return HttpResponse('Ok')
            else:
                return HttpResponse('Error')

        else:

            group_id = request.GET['group_id']

            lang = user_get_language(request)



            if lang == "hr":
                form = NewMeasurementGroupCalculationFormCro(measurement_group_choice_list,initial={'group_id': group_id})
            else:
                form = NewMeasurementGroupCalculationFormEng(measurement_group_choice_list,initial={'group_id': group_id})

            fields = list(form)

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

def measurement_groups_return_edit_measurement_group_calculation_form(request):
    if request.user.is_authenticated():
        measurement_group_list = measurement_groups_return_user_measurement_groups(request)
        measurement_group_choice_list = []
        for measurement_group in measurement_group_list:
            measurement_group_choice_list.append((measurement_group.idllmeasurementgroup, measurement_group.groupname))

        if request.method == 'POST':

            form = EditMeasurementGroupCalculationFormCro(measurement_group_choice_list,request.POST)

            if form.is_valid():
                try:
                    calculation_group= Llmeasurementgroupcalculations.objects.get(idllmeasurementgroupcalculations=form.cleaned_data['calculation_group_id_fixed'])

                    calculation_group.measurementgroupid    = Llmeasurementgroup.objects.get(idllmeasurementgroup=form.cleaned_data['group_id'])
                    calculation_group.name                  = form.cleaned_data['calculation_name']
                    calculation_group.info                  = form.cleaned_data['calculation_info']
                    calculation_group.axis                  = form.cleaned_data['calculation_axis']
                    calculation_group.equation              = form.cleaned_data['calculation_equation']

                    calculation_group.save()
                    return HttpResponse('Ok')

                except ObjectDoesNotExist:
                    return HttpResponse('Error')

                # provjeri je li grupa vec postoji

            else:
                return HttpResponse('Error')

        else:
            calculation_group_id_fixed = request.GET['calculation_group_id']
            try:
                calculation_group = Llmeasurementgroupcalculations.objects.get(idllmeasurementgroupcalculations=calculation_group_id_fixed)
            except ObjectDoesNotExist:
                return HttpResponse('Error')

            lang = user_get_language(request)
            initial={   'calculation_group_id_fixed': calculation_group_id_fixed,
                        'group_id'                  : calculation_group.measurementgroupid.idllmeasurementgroup,
                        'calculation_name'          : calculation_group.name,
                        'calculation_info'          : calculation_group.info,
                        'calculation_axis'          : calculation_group.axis,
                        'calculation_equation'      : calculation_group.equation}

            if lang == "hr":
                form = EditMeasurementGroupCalculationFormCro(measurement_group_choice_list, initial=initial)
            else:
                form = EditMeasurementGroupCalculationFormEng(measurement_group_choice_list, initial=initial)

            fields = list(form)

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