# coding: utf-8
from django.db import models
from django.utils.functional import cached_property
from django.db.models.signals import post_save
from django.dispatch import receiver

from representatives_votes.management.commands import (
        parltrack_import_votes,)
# from representatives.models import Representative
from representatives_votes.models import Vote, Proposal, Dossier
# from legislature.models import MemopolRepresentative
from core.utils import create_child_instance_from_parent


class Recommendation(models.Model):
    SCORE_TABLE = {
        ('abstain', 'abstain'): 1,
        ('abstain', 'for'): -0.5,
        ('abstain', 'against'): -0.5,
    }

    VOTECHOICES = (
        ('abstain', 'abstain'),
        ('for', 'for'),
        ('against', 'against')
    )

    proposal = models.OneToOneField(
        Proposal,
        related_name='recommendation'
    )

    recommendation = models.CharField(max_length=10, choices=VOTECHOICES)
    title = models.CharField(max_length=1000, blank=True)
    description = models.TextField(blank=True)
    weight = models.IntegerField(default=0)

    class Meta:
        ordering = ['proposal__datetime']


class MemopolDossier(Dossier):
    dossier_reference = models.CharField(max_length=200)
    name = models.CharField(max_length=1000, blank=True, default='')
    description = models.TextField(blank=True, default='')

    def save(self, *args, **kwargs):
        if not self.name:
            self.name = self.dossier_ptr.title
        return super(MemopolDossier, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name

@receiver(post_save, sender=Dossier)
def create_memopolrepresentative_from_representative(instance, **kwargs):
    create_child_instance_from_parent(MemopolDossier, instance)


class MemopolVote(Vote):
    class Meta:
        proxy = True

    @cached_property
    def absolute_score(self):
        if self.proposal.recommendation:
            recommendation = self.proposal.recommendation
            weight = recommendation.weight
            if (self.position == 'abstain' or
                recommendation.recommendation == 'abstain'):
                weight = weight / 2
            if self.position == recommendation.recommendation:
                return weight
            else:
                return -weight
        else:
            return 0


def vote_pre_import(sender, vote_data=None, **kwargs):
    dossiers = getattr(sender, 'memopol_filters', None)

    if dossiers is None:
        sender.memopol_filters = dossiers = Dossier.objects.filter(
            proposals__recommendation__in=
                Recommendation.objects.all()
        ).values_list('reference', flat=True)

    if vote_data.get('epref', None) not in dossiers:
        return False
parltrack_import_votes.Command.vote_pre_import.connect(vote_pre_import)