from __future__ import unicode_literals

import datetime

from django.contrib import messages
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.db.models import Q
from django.template.loader import get_template
from django.utils import timezone
from django.utils.timezone import datetime
from django.utils.translation import ugettext_lazy as _

from booking.models import Booking
from core.utils import send_email
from people.models import Customer
from property.models import Property
from property.models import PropertyWebContact


class Pregunta(models.Model):
    pregunta_text = models.CharField(max_length=200)
    pregunta_parametro_1_text = models.CharField(max_length=100)
    pregunta_parametro_2_text = models.CharField(max_length=100)
    pregunta_parametro_3_text = models.CharField(max_length=100)
    pregunta_parametro_4_text = models.CharField(max_length=100)
    pregunta_parametro_5_text = models.CharField(max_length=100)
    pregunta_texto_al_mejor_parametro_1_text = models.CharField(max_length=50)
    pregunta_texto_al_mejor_parametro_2_text = models.CharField(max_length=50)
    pregunta_texto_al_mejor_parametro_3_text = models.CharField(max_length=50)
    pregunta_texto_al_mejor_parametro_4_text = models.CharField(max_length=50)
    pregunta_texto_al_mejor_parametro_5_text = models.CharField(max_length=50)
    minimo = models.IntegerField(default=1)
    maximo = models.IntegerField(default=5)	
    pub_date = models.DateTimeField('date published',auto_now_add=True)    
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Reciente?'
    def MediaDeRespuestas(self):
        from encuesta.models import Respuesta
        a = Respuesta.objects.filter(pregunta__id=self.id,respuesta_customer_fecha_responde_date__isnull=False,respuesta_eliminada=False)
        total=sum(res.respuesta_media() for res in a)        
        if len(a)==0:
           return 0
        tmpavg=total/float(len(a))
        return tmpavg
    def __unicode__(self):              
        return self.pregunta_text
    def serialize(self):
        return {
                'pregunta_text': self.pregunta_text,
                'pregunta_parametro_1_text': self.pregunta_parametro_1_text,
                'pregunta_parametro_2_text': self.pregunta_parametro_2_text,
                'pregunta_parametro_3_text': self.pregunta_parametro_3_text,
                'pregunta_parametro_4_text': self.pregunta_parametro_4_text,
                'pregunta_parametro_5_text': self.pregunta_parametro_5_text,
                'pregunta_texto_al_mejor_parametro_1_text':self. pregunta_texto_al_mejor_parametro_1_text,
                'pregunta_texto_al_mejor_parametro_2_text':self. pregunta_texto_al_mejor_parametro_2_text,
                'pregunta_texto_al_mejor_parametro_3_text':self. pregunta_texto_al_mejor_parametro_3_text,
                'pregunta_texto_al_mejor_parametro_4_text':self. pregunta_texto_al_mejor_parametro_4_text,
                'pregunta_texto_al_mejor_parametro_5_text':self. pregunta_texto_al_mejor_parametro_5_text,
                'minimo': self.minimo,
                'maximo': self.maximo,
                'pub_date': self.pub_date
        }



class Respuesta(models.Model):
    pregunta = models.ForeignKey(Pregunta)
    customer = models.ForeignKey(Customer, related_name='Respuesta_customer')
    prop = models.ForeignKey(Property, related_name='Respuesta_prop')
    book = models.ForeignKey(Booking, related_name='Respuesta_book')
    respuesta_comentario_text = models.CharField(max_length=500,blank=True, null=True)
    respuesta_comentario_propiedad_text = models.CharField(max_length=500, blank=True, null=True)
    respuesta_creacion_date = models.DateTimeField(null=False,blank=True)
    respuesta_customer_fecha_responde_date = models.DateTimeField('Fecha Contesta',null=True,blank=True)
    respuesta_propiedad_date= models.DateTimeField('Fecha Respuesta',null=True,blank=True)
    respuesta_eliminada = models.BooleanField(default=False)
    respuesta_eliminada_fecha=models.DateTimeField('Fecha Eliminacion',null=True,blank=True)
    respuesta_caducidad_date = models.DateField('Caduca',null=True,blank=True)
    respuesta_media_votos = models.FloatField(default=0)
    votos1 = models.IntegerField(default=5,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    votos2 = models.IntegerField(default=5,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    votos3 = models.IntegerField(default=5,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    votos4 = models.IntegerField(default=5,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    votos5 = models.IntegerField(default=5,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(1)
        ])
    respuesta_aviso_date = models.DateTimeField('Fecha Notificacion',null=True, blank=True)


    def respuesta_localizador(self):
        return self.book.number
    def contestada(self):
       if not self.respuesta_customer_fecha_responde_date:
          return 'Pendiente'
       else:
          return self.respuesta_customer_fecha_responde_date

    def respuesta_media(self):
        if self.respuesta_customer_fecha_responde_date!=None:
            return round((self.votos1+self.votos2+self.votos3+self.votos4+self.votos5)/float(5),2)
        else:
            return 0
    def __unicode__(self):              
        return self.book.number
    def EnviaEncuesta(self):
        customer = self.customer.user.email
        contact = PropertyWebContact.objects.filter(Q(web__prop=self.book.prop))[:1]
        data = {'encuesta': self, 'contact': contact}
        customer_subject = get_template('encuesta/emails/customer_subject.txt').render(data).replace('\n', ' ').strip()
        customer_msg = get_template('encuesta/emails/customer_msg_encuesta.html').render(data).strip()
        response = send_email(
            recipients=[customer],
            subject=customer_subject,
            body=customer_msg
        )
        
        

    def notificarespuesta(self, request):
        customer = self.customer.user.email
        contact = PropertyWebContact.objects.filter(Q(web__prop=self.book.prop))[:1]
        data = { 'encuesta':self, 'contact': contact }
        customer_subject = get_template('encuesta/emails/customer_subject.txt').render(data).replace('\n', ' ').strip()
        customer_msg = get_template('encuesta/emails/customer_msg.html').render(data).strip()
        response = send_email(
            recipients=[customer],
            subject=customer_subject,
            body=customer_msg
        )
        if response['total_rejected_recipients']:
            # Error sendind the email to the customer
            messages.error(request, _('Error sending the notification to the customer email (%s)' % customer))


    def estadocontestada(self):
        if self.respuesta_customer_fecha_responde_date:
            return 'Contestada'
        else:
            return 'Pendiente'
    def estadocontestadapropiedad(self):
        if self.respuesta_customer_fecha_responde_date:
            return 'Contestada'
        else:
            return 'Pendiente'

def tratarespuesta_save(sender, instance, **kwargs):
    vrespu = instance
    if vrespu.respuesta_customer_fecha_responde_date != None and vrespu.respuesta_eliminada==False:
        valor = vrespu.respuesta_media()
    else:
        valor  = 0
    Respuesta.objects.filter(pk=instance.pk).update(respuesta_media_votos=valor)


from django.db.models.signals import post_save
post_save.connect(tratarespuesta_save, sender=Respuesta)
