from django.shortcuts import render
from django.shortcuts import redirect
from django.http import JsonResponse
from django.urls import reverse
from django.core.exceptions import ObjectDoesNotExist
from constance import config

from gravity.models import GravitySensor


def getGravitySensors(req, device_id=None):
    ret = []
    if device_id is None:
        devices = GravitySensor.objects.all()
    else:
        try:
            devices = [GravitySensor.objects.get(id=device_id),]
        except ObjectDoesNotExist:
            devices = []
    for dev in devices:
        if dev.sensor_type == GravitySensor.SENSOR_MANUAL:
            # For manual sensors, we want the "manage device" link to be for adding a reading instead
            manage_text = "Add Reading"
            manage_url = reverse('gravity_add_point', kwargs={'manual_sensor_id': dev.id,})
        else:
            manage_text = "Manage Device"
            manage_url = reverse('gravity_dashboard', kwargs={'sensor_id': dev.id,})

        temp, temp_format = dev.retrieve_loggable_temp()
        if temp is None:
            temp_string = "--.-°"
        else:
            temp_string = "{}° {}".format(temp, temp_format)

        gravity = dev.retrieve_loggable_gravity()
        if gravity is None:
            grav_string = "-.---"
        else:
            grav_string = "{:05.3f}".format(gravity)

        bound_device = {}
        if dev.assigned_brewpi_device is not None:
            bound_device['id'] = dev.assigned_brewpi_device_id
            bound_device['name'] = dev.assigned_brewpi_device.device_name

        ret.append({"device_name": dev.name, "current_gravity": grav_string,
                    "current_temp": temp, "temp_format": temp_format, "temp_string": temp_string,
                    'device_url': reverse('gravity_dashboard', kwargs={'sensor_id': dev.id,}),
                    'manage_text': manage_text, 'manage_url': manage_url,
                    'bound_device': bound_device,
                    'modal_name': '#gravSensor{}'.format(dev.id)})
    return JsonResponse(ret, safe=False, json_dumps_params={'indent': 4})


def get_ispindel_extras(req, device_id):
    try:
        device = GravitySensor.objects.get(id=device_id)
    except ObjectDoesNotExist:
        return JsonResponse({'error': 'Unable to locate device with ID {}'.format(device_id)}, safe=False)

    if device.sensor_type == GravitySensor.SENSOR_ISPINDEL:
        # Load the iSpindel 'extras' from redis
        extras = device.ispindel_configuration.load_extras_from_redis()
        extras['device_name'] = device.name
        extras['device_id'] = device.id
    else:
        extras = {}

    return JsonResponse(extras, safe=False, json_dumps_params={'indent': 4})


def get_tilt_extras(req, device_id):
    try:
        device = GravitySensor.objects.get(id=device_id)
    except ObjectDoesNotExist:
        return JsonResponse({'error': 'Unable to locate device with ID {}'.format(device_id)}, safe=False)

    if device.sensor_type == GravitySensor.SENSOR_TILT:
        # Load the Tilt 'extras' from redis
        extras = device.tilt_configuration.load_extras_from_redis()
        extras['device_name'] = device.name
        extras['device_id'] = device.id
    else:
        extras = {}

    return JsonResponse(extras, safe=False, json_dumps_params={'indent': 4})