import pytest
from django.core.urlresolvers import reverse
from model_mommy import mommy

from comissoes.models import Comissao, TipoComissao
from norma.models import LegislacaoCitada, NormaJuridica, TipoNormaJuridica

from .models import (Anexada, Autor, Autoria, DespachoInicial,
                     DocumentoAcessorio, MateriaLegislativa, Numeracao,
                     RegimeTramitacao, StatusTramitacao, TipoAutor,
                     TipoDocumento, TipoMateriaLegislativa, Tramitacao,
                     UnidadeTramitacao)


def make_unidade_tramitacao(descricao):
    # Cria uma comissão para ser a unidade de tramitação
    tipo_comissao = mommy.make(TipoComissao)
    comissao = mommy.make(Comissao,
                          tipo=tipo_comissao,
                          nome=descricao,
                          sigla='T',
                          data_criacao='2016-03-21')

    # Testa a comissão
    assert comissao.tipo == tipo_comissao
    assert comissao.nome == descricao

    # Cria a unidade
    unidade = mommy.make(UnidadeTramitacao, comissao=comissao)
    assert unidade.comissao == comissao

    return unidade


@pytest.mark.django_db(transaction=False)
def make_norma():
    # Cria um novo tipo de Norma
    tipo = mommy.make(TipoNormaJuridica,
                      sigla='T1',
                      descricao='Teste_Tipo_Norma')
    mommy.make(NormaJuridica,
               tipo=tipo,
               numero=1,
               ano=2016,
               data='2016-03-21',
               esfera_federacao='E',
               ementa='Teste_Ementa')

    # Testa se a Norma foi criada
    norma = NormaJuridica.objects.first()
    assert norma.tipo == tipo
    assert norma.numero == 1
    assert norma.ano == 2016

    return norma


@pytest.mark.django_db(transaction=False)
def make_materia_principal():
    regime_tramitacao = mommy.make(RegimeTramitacao, descricao='Teste_Regime')

    # Cria a matéria principal
    tipo = mommy.make(TipoMateriaLegislativa,
                      sigla='T1',
                      descricao='Teste_MateriaLegislativa')
    mommy.make(MateriaLegislativa,
               tipo=tipo,
               numero='165',
               ano='2002',
               data_apresentacao='2003-01-01',
               regime_tramitacao=regime_tramitacao)

    # Testa matéria
    materia = MateriaLegislativa.objects.first()
    assert materia.numero == 165
    assert materia.ano == 2002

    return materia


@pytest.mark.django_db(transaction=False)
def test_materia_anexada_submit(client):
    materia_principal = make_materia_principal()

    # Cria a matéria que será anexada
    tipo_anexada = mommy.make(TipoMateriaLegislativa,
                              sigla='T2',
                              descricao='Teste_2')
    regime_tramitacao = mommy.make(RegimeTramitacao, descricao='Teste_Regime')
    mommy.make(MateriaLegislativa,
               tipo=tipo_anexada,
               numero='32',
               ano='2004',
               data_apresentacao='2005-11-10',
               regime_tramitacao=regime_tramitacao)

    # Testa se a matéria que será anexada foi criada
    materia_anexada = MateriaLegislativa.objects.get(numero=32, ano=2004)

    # Testa POST
    response = client.post(reverse('materia_anexada',
                                   kwargs={'pk': materia_principal.pk}),
                           {'tipo': materia_anexada.tipo.pk,
                            'numero': materia_anexada.numero,
                            'ano': materia_anexada.ano,
                            'data_anexacao': '2016-03-18',
                            'salvar': 'salvar'},
                           follow=True)
    assert response.status_code == 200

    # Verifica se a matéria foi anexada corretamente
    anexada = Anexada.objects.first()
    assert anexada.materia_principal == materia_principal
    assert anexada.materia_anexada == materia_anexada


@pytest.mark.django_db(transaction=False)
def test_autoria_submit(client):
    materia_principal = make_materia_principal()

    # Cria um tipo de Autor
    tipo_autor = mommy.make(TipoAutor, descricao='Teste Tipo_Autor')

    # Cria um Autor
    autor = mommy.make(Autor, tipo=tipo_autor, nome='Autor Teste')

    # Testa POST
    response = client.post(reverse('autoria',
                                   kwargs={'pk': materia_principal.pk}),
                           {'autor': autor.pk,
                            'primeiro_autor': True,
                            'salvar': 'salvar'},
                           follow=True)
    assert response.status_code == 200

    # Verifica se o autor foi realmente criado
    autoria = Autoria.objects.first()
    assert autoria.autor == autor
    assert autoria.materia == materia_principal
    assert autoria.primeiro_autor is True


@pytest.mark.django_db(transaction=False)
def test_despacho_inicial_submit(client):
    materia_principal = make_materia_principal()

    # Cria uma comissão
    tipo_comissao = mommy.make(TipoComissao)
    comissao = mommy.make(Comissao,
                          tipo=tipo_comissao,
                          nome='Teste',
                          sigla='T',
                          data_criacao='2016-03-18')

    # Testa POST
    response = client.post(reverse('despacho_inicial',
                                   kwargs={'pk': materia_principal.pk}),
                           {'comissao': comissao.pk,
                            'salvar': 'salvar'},
                           follow=True)
    assert response.status_code == 200

    # Verifica se o despacho foi criado
    despacho = DespachoInicial.objects.first()
    assert despacho.comissao == comissao
    assert despacho.materia == materia_principal


@pytest.mark.django_db(transaction=False)
def test_numeracao_submit(client):
    materia_principal = make_materia_principal()

    # Cria dados para inserir na numeração
    tipo = mommy.make(TipoMateriaLegislativa,
                      sigla='T2',
                      descricao='Teste_2')
    # Testa POST
    response = client.post(reverse('numeracao',
                                   kwargs={'pk': materia_principal.pk}),
                           {'tipo_materia': tipo.pk,
                            'numero_materia': '341',
                            'ano_materia': 2015,
                            'data_materia': '2016-03-21',
                            'salvar': 'salvar'},
                           follow=True)

    assert response.status_code == 200

    # Verifica se a numeração foi criada
    numeracao = Numeracao.objects.first()
    assert numeracao.tipo_materia == tipo
    assert numeracao.ano_materia == 2015


@pytest.mark.django_db(transaction=False)
def test_documento_acessorio_submit(client):
    materia_principal = make_materia_principal()

    # Cria um tipo de Autor
    tipo_autor = mommy.make(TipoAutor, descricao='Teste Tipo_Autor')

    # Cria um Autor
    autor = mommy.make(Autor, tipo=tipo_autor, nome='Autor Teste')

    # Cria um tipo de documento
    tipo = mommy.make(TipoDocumento,
                      descricao='Teste')

    # Testa POST
    response = client.post(reverse('documento_acessorio',
                                   kwargs={'pk': materia_principal.pk}),
                           {'tipo': tipo.pk,
                            'nome': 'teste_nome',
                            'data_materia': '2016-03-21',
                            'autor': autor,
                            'ementa': 'teste_ementa',
                            'salvar': 'salvar'},
                           follow=True)

    assert response.status_code == 200

    # Verifica se o documento foi criado
    doc = DocumentoAcessorio.objects.first()
    assert doc.tipo == tipo
    assert doc.nome == 'teste_nome'
    assert doc.autor == str(autor)


@pytest.mark.django_db(transaction=False)
def test_legislacao_citada_submit(client):
    materia_principal = make_materia_principal()
    norma = make_norma()

    # Testa POST
    response = client.post(reverse('legislacao_citada',
                                   kwargs={'pk': materia_principal.pk}),
                           {'tipo': norma.tipo.pk,
                            'numero': norma.numero,
                            'ano': norma.ano,
                            'disposicao': 'disposicao',
                            'salvar': 'salvar'},
                           follow=True)

    assert response.status_code == 200

    # Testa se a legislação citada foi criada
    leg = LegislacaoCitada.objects.first()
    assert leg.norma == norma
    assert leg.disposicoes == 'disposicao'


@pytest.mark.django_db(transaction=False)
def test_tramitacao_submit(client):
    materia_principal = make_materia_principal()
    # Cria status para tramitação
    status_tramitacao = mommy.make(StatusTramitacao,
                                   indicador='F',
                                   sigla='ST',
                                   descricao='Status_Teste')
    # Testa POST
    response = client.post(
        reverse('tramitacao_materia',
                kwargs={'pk': materia_principal.pk}),
        {'unidade_tramitacao_local': make_unidade_tramitacao(
            'Unidade Local').pk,
         'unidade_tramitacao_destino': make_unidade_tramitacao(
            'Unidade Destino').pk,
         'urgente': True,
         'status': status_tramitacao.pk,
         'data_tramitacao': '2016-03-21',
         'texto': 'Texto_Teste',
         'salvar': 'salvar'},
        follow=True)

    assert response.status_code == 200

    # Testa se a tramitacao foi criada
    tramitacao = Tramitacao.objects.first()
    assert (tramitacao.unidade_tramitacao_local.comissao.nome ==
            'Unidade Local')
    assert (tramitacao.unidade_tramitacao_destino.comissao.nome ==
            'Unidade Destino')
    assert tramitacao.urgente is True