from datetime import date

from django.core import serializers
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.utils.translation import ugettext_lazy as _

from painel.models import Painel
from parlamentares.models import Filiacao
from sapl.crud import build_crud
from sessao.models import (OrdemDia, PresencaOrdemDia, RegistroVotacao,
                           SessaoPlenaria, SessaoPlenariaPresenca,
                           VotoParlamentar)

from .models import Cronometro

cronometro_painel_crud = build_crud(
    Cronometro, '', [

        [_('Cronometro'),
         [('status', 3), ('data_cronometro', 6),
          ('tipo', 3)]],
    ])

# REST WS


def controlador_painel(request):

    painel_created = Painel.objects.get_or_create(data_painel=date.today())
    painel = painel_created[0]

    if request.method == 'POST':
        if 'start-painel' in request.POST:
            painel.aberto = True
            painel.save()
        elif 'stop-painel' in request.POST:
            painel.aberto = False
            painel.save()
        elif 'save-painel' in request.POST:
            painel.mostrar = request.POST['tipo_painel']
            painel.save()

    context = {'painel': painel, 'PAINEL_TYPES': Painel.PAINEL_TYPES}
    return render(request, 'painel/controller.html', context)


def cronometro_painel(request):
    print(request.POST)

    return HttpResponse({})


def painel_view(request):
    context = {'head_title': 'Painel Plenário',
               'title': '3a. Sessao Ordinária do Município XYZ'}
    return render(request, 'painel/index.html', {'context': context})


def painel_parlamentares_view(request):
    return render(request, 'painel/parlamentares.html')


def painel_votacao_view(request):
    return render(request, 'painel/votacao.html')

# REST web services


def json_presenca(request):
    presencas = PresencaOrdemDia.objects.filter(sessao_plenaria_id=50)
    parlamentares = []
    for p in presencas:
        parlamentares.append(p.parlamentar)
    # parlamentares = serializers.serialize('json', Parlamentar.objects.all())
    parlamentares = serializers.serialize('json', parlamentares)
    return HttpResponse(parlamentares, content_type='application/json')
    # return JsonResponse(data) # work with python dict


# TODO: make this response non cacheable,
#       probably on jQuery site, but check Django too
# TODO: reduce number of database query hits by means
#       of QuerySet wizardry.
def json_votacao(request):
    # TODO: se tentar usar objects.get(ordem_id = 104
    # ocorre a msg: 'RegistroVotacao' object does not support indexing
    # TODO; tratar o caso de vir vazio
    votacao = RegistroVotacao.objects.filter(ordem_id=104)[0]

    # Magic!
    # http://stackoverflow.com/questions/15507171/django-filter-query-foreign-key
    # recuperar pela votacao.id
    voto_parlamentar = VotoParlamentar.objects.filter(votacao_id=votacao.id)
    votos = {}
    for vp in voto_parlamentar:
        votos[vp.parlamentar.nome_parlamentar] = vp.voto

    ordem_dia = OrdemDia.objects.get(id=104)

    sessaoplenaria_id = ordem_dia.sessao_plenaria_id

    sessao_plenaria = SessaoPlenaria.objects.get(id=sessaoplenaria_id)

    # Pra recuperar o partido do parlamentar
    # tem que fazer OUTRA query, deve ter uma
    # forma de fazer isso na base do join de data models.
    filiacao = Filiacao.objects.filter(data_desfiliacao__isnull=True)
    parlamentar_partido = {}
    for f in filiacao:
        parlamentar_partido[f.parlamentar.nome_parlamentar] = f.partido.sigla

    presenca_ordem_dia = PresencaOrdemDia.objects.filter(
        sessao_plenaria_id=sessaoplenaria_id)
    presentes_ordem_dia = []
    for p in presenca_ordem_dia:
        nome_parlamentar = p.parlamentar.nome_parlamentar
        presentes_ordem_dia.append(
            {'nome': nome_parlamentar,
             'partido': parlamentar_partido[nome_parlamentar],
             'voto': votos.get(nome_parlamentar, '-')})

    total_votos = votacao.numero_votos_sim + \
        votacao.numero_votos_nao + votacao.numero_abstencoes

    sessao_plenaria_presenca = SessaoPlenariaPresenca.objects.filter(
        id=sessaoplenaria_id)
    presentes_sessao_plenaria = []
    for p in sessao_plenaria_presenca:
        presentes_sessao_plenaria.append(p.parlamentar.nome_parlamentar)

    presentes = len(presentes_sessao_plenaria)

    tipo_resultado = votacao.tipo_resultado_votacao.nome.upper()

    votacao_json = {"sessao_plenaria": str(sessao_plenaria),
                    "sessao_plenaria_data": sessao_plenaria.data_inicio,
                    "sessao_plenaria_hora_inicio": sessao_plenaria.hora_inicio,
                    "materia_legislativa_texto": ordem_dia.materia.ementa,
                    "observacao_materia": ordem_dia.materia.observacao,
                    "tipo_votacao": ordem_dia.tipo_votacao,
                    "numero_votos_sim": votacao.numero_votos_sim,
                    "numero_votos_nao": votacao.numero_votos_nao,
                    "numero_abstencoes": votacao.numero_abstencoes,
                    "total_votos": total_votos,
                    "presentes": presentes,
                    "tipo_resultado": tipo_resultado,
                    "presentes_ordem_dia": presentes_ordem_dia,
                    "presentes_sessao_plenaria": presentes_sessao_plenaria,
                    }
    return JsonResponse(votacao_json)