# Python imports
import json
import subprocess
# Django imports
from django.shortcuts import render_to_response, render, redirect
from django.http import HttpResponse
from django.core.exceptions import ObjectDoesNotExist
from django.http import JsonResponse
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission, Group

# LeakLess Monitor imports
from Applications.Devices.models import Lldevicelist
from Applications.Users.views import user_get_language, user_get_information
from Applications.Notifications.views import notification_return_list
from Applications.Measure.models import *
from Applications.Devices.models import *

def devices_restart_gateway(request):
    if request.user.is_authenticated() and request.user.is_superuser:
        text = 'Gateway restarted'

        try:
            subprocess.call(["service", "llgateway-secure", "restart"])
        except Exception as e:
            text = e.strerror

        data_response = {
            'ok' : True,
            'text' : text
        }

        return JsonResponse(data_response)
    else:
        return redirect('/leakless-monitor')



def devices_return_table(request):
    if request.user.is_authenticated():
        notification_list=notification_return_list(request)
        device_list = devices_return_user_device_list(request)
        user_information=user_get_information(request)

        return render_to_response('devices.html',{  'user_object'        : request.user,
                                                    'user_info'          : user_information,
                                                    'device_list'        : device_list,
                                                    'notification_list'  : notification_list,
                                                    'lang'               : user_get_language(request)})
    else:
        return redirect('/leakless-monitor')

def devices_return_small_table(request):
    if request.user.is_authenticated():
        notification_list=notification_return_list(request)
        device_list = devices_return_user_device_list(request)
        user_information=user_get_information(request)

        return render_to_response('devices_small.html',{  'user_object'        : request.user,
                                                    'user_info'          : user_information,
                                                    'device_list'        : device_list,
                                                    'notification_list'  : notification_list,
                                                    'lang'               : user_get_language(request)})
    else:
        return redirect('/leakless-monitor')

def devices_return_user_device_list(request):
    if request.user.is_authenticated():
        permfield=[]
        permission_list=request.user.get_all_permissions()
        for permission in permission_list:
            permfield.append(permission.split(".")[1])

        device_list = Lldevicelist.objects.filter(id__in=permfield)
        return device_list
    else:
        return None

def devices_change_lat_long(request):
    if request.user.is_authenticated():
        try:
            device_id   = request.GET.get('device_id')
            latitude    = request.GET.get('latitude')
            longitude   = request.GET.get('longitude')

            Lldevicelist.objects.filter(id=device_id).update(loc_lat=latitude, loc_long=longitude)
            return HttpResponse("Values successfully changed")
        except Exception as e:
            return HttpResponse("Error: "+e.message)
    else:
        return redirect('/leakless-monitor')



def devices_return_channel_labels(device_id):
    device_info = Lldevicelist.objects.get(id=device_id)

    channel_labels ={ 'ch1_pressure_label': device_info.info_ch1pressurename,
                      'ch2_pressure_label': device_info.info_ch2pressurename,
                      'ch1_flow_label': device_info.info_ch1flowname,
                      'ch2_flow_label': device_info.info_ch2flowname,
                      'ch1_digital_label': device_info.info_ch1digitalname,
                      'ch2_digital_label': device_info.info_ch2digitalname}

    return channel_labels

def devices_return_firmware(device_id):
    try:
        device_info = Lldevicelist.objects.get(id=device_id)
    except ObjectDoesNotExist:
        return None

    if device_info.rem_firmware=='':
        return None

    return device_info.rem_firmware

def devices_return_identifier(device_id):
    try:
        device_info = Lldevicelist.objects.get(id=device_id)
    except ObjectDoesNotExist:
        return None

    if device_info.rem_identifier is None:
        return '?'

    return device_info.rem_identifier

def devices_return_by_id(device_id):
    try:
        device_info = Lldevicelist.objects.get(id=device_id)
    except ObjectDoesNotExist:
        return None

    return device_info

def devices_add_new(request):
    if request.user.is_authenticated():
        if request.is_ajax():
            if request.method == 'POST':
                return_data =json.loads(request.body)

                device_id               = return_data['device_id']
                device_type             = return_data['device_type']
                device_identifier       = return_data['device_identifier']
                if device_id is None or device_identifier is None:
                    data_response = { 'ok': False , 'text': 'Wrong device ID or Identifier'}
                    return JsonResponse(data_response)

                # Provjeri je li device postoji
                device_list=Lldevicelist.objects.filter(id=device_id)
                if len(device_list)>0:
                    data_response = { 'ok': False , 'text': 'Device already exists'}
                    return JsonResponse(data_response)

                if device_type == 'PDL-AG':
                    data_response=devices_add_new_pdlag(device_id, device_identifier)
                elif device_type == 'MAG8000':
                    data_response=devices_add_new_mag8000(device_id, device_identifier)
                else:
                    data_response = {
                        'ok': False,
                        'text': 'Unknown device type selected',
                    }

                return JsonResponse(data_response)

            else:
                return_data =json.loads(request.GET)

    else:
        return HttpResponse('Invalid user')


def devices_add_new_pdlag(device_id, device_identifier):
    content_type = ContentType.objects.get(app_label='DeviceList', name='lldevicelist')
    # Dodaj u device list
    password = '?'
    if len(device_id) == 24:
        password = device_id[0:2] + device_id[4:6] + device_id[8:10] + device_id[12:14] + device_id[16:18] + device_id[
                                                                                                             20:22]
    else:
        data_response = {'ok': False, 'text': 'Device ID must be 24 digits'}
        return data_response

    new_device = Lldevicelist(id=device_id, loc_active=1, password=password, loc_type='PDL-AG', info_deviceicon='LL.png',
                              loc_lat=45.82697498767209, loc_long=16.08517234342196, rem_identifier=device_identifier)
    new_device.save()

    # Dodaj u realtime
    new_realtime = LldevicePdlagRealtime(lldevicelist=new_device)
    new_realtime.save()

    # Dodaj u parameters
    new_parameters = LldevicePdlagParameters(lldevicelist=new_device)
    new_parameters.save()

    # Dodaj u alarm profiles
    new_profiles = LldevicePdlagAlarmProfile(lldevicelist=new_device)
    new_profiles.save()

    # Dodaj permissions
    new_permission = Permission.objects.create(codename=device_id, name=device_id, content_type=content_type)
    new_permission.save()


    data_response = {
        'ok': True,
        'text': 'Added PDLAG device ID:' + device_id + ' [' + device_identifier + ']',
    }

    return data_response


def devices_add_new_mag8000(device_id, device_identifier):
    content_type = ContentType.objects.get(app_label='DeviceList', name='lldevicelist')
    # Dodaj u device list
    password = '?'

    new_device = Lldevicelist(id=device_id, loc_active=1, loc_type='MAG8000', info_deviceicon='SM.png',
                              loc_lat=46.82697498767209, loc_long=16.08517234342196, rem_identifier=device_identifier)
    new_device.save()

    new_realtime = LldeviceMAG8000Realtime(lldevicelist=new_device)
    new_realtime.save()

    # Dodaj permissions
    new_permission = Permission.objects.create(codename=device_id, name=device_id, content_type=content_type)
    new_permission.save()

    data_response = {
        'ok': True,
        'text': 'Added MAG8000 device ID:' + device_id + ' [' + device_identifier + ']',
    }

    return data_response