
from rest_framework import viewsets
from django.http import JsonResponse
from django.db.models import F
from django.db import connection
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import action
from .. import models, serializers
from os import getenv
import redis
import json
import logging

class DispositivoViewSet(viewsets.ModelViewSet):
    queryset = models.Dispositivo.objects.all()
    serializer_class = serializers.DispositivoSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['id_paradero', 'id_tipo_dispositivo']


    @action(detail=False, methods=['post'])
    def whoami(self, request, pk=None):
        input = json.loads(request.body)
        whoami = input['whoami']

        record = models.Paradero.objects \
            .filter(dispositivo__id_dispositivo=whoami['idDispositivo']) \
            .annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
            .first()

        if (record):
            return JsonResponse({
                "WhoamiResponse": {
                    "NroParadero": record.nro_paradero,
                    "NombreParadero": record.nombre_paradero,
                    "Status": "OK"
                }
            })

        # retorna json de no existente
        return JsonResponse({
            "WhoamiResponse": {
                "Status": "NOK",
                "errorString": "Dispositivo no identificado"
            }
        })
        

    @action(detail=False, methods=['post'])
    def getInfoDevice(self, request, pk=None):
        input = json.loads(request.body)
        getInfoDevice = input['GetInfoDevice']


        record = models.Paradero.objects \
            .filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
            .annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
            .first()

        db_host = getenv('DB_REDIS_HOST')
        db_port = getenv('DB_REDIS_PORT')
        r = redis.Redis(host=db_host, port=db_port, decode_responses=True)

        key = f'stop_id:{record.nro_paradero}'
        json_trayectos = r.get(key)
        if json_trayectos != None:
            trayectos = json.loads(json_trayectos)
        else:
            trayectos = []


        lineas = {}
        lineas_agrupadas = {}
        for t in trayectos:

            pk_linea = f'{t["route_id"]}-{t["direction_id"]}'
            if pk_linea not in lineas:
                lineas[pk_linea] = models.Linea.objects.filter(id_linea=pk_linea).first()

            linea = lineas[pk_linea]

            if linea == None:
                logging.error(pk_linea)

            if linea != None:
                if pk_linea not in lineas_agrupadas:
                    lineas_agrupadas[pk_linea] = {
                        'Linea': linea.route_long_name,
                        'Descripcion': linea.route_short_name,
                        'TipoLocomocion': linea.route_type.descripcion,
                        'colorFondo': linea.route_color,
                        'colorTexto': linea.route_text_color,
                        'Llegadas': []
                    }

                lineas_agrupadas[pk_linea]['Llegadas'].append({
                    'patente': t['vehicle_license_plate'],
                    'Planificada': None,
                    'EstimadaGPS': t['hora_llegada'],
                    'DistanciaGPS': None,
                    'Mensajelinea': None,
                })


        detalle_lineas = []
        for pk_linea in lineas_agrupadas:
            detalle_lineas.append(lineas_agrupadas[pk_linea])      


        return JsonResponse({
            "GetInfoDeviceResponse": {
                "DetalleLineas": detalle_lineas,
                "MensajeParadero": "No considerar, uso futuro"
            }
        })