# -*- coding: utf-8 -*-

from django.db import models
from django.contrib.auth.models import User
from django.core.files.storage import FileSystemStorage
from django.template.defaultfilters import register

from django.db.models import signals
from autoslug import AutoSlugField
import os

class OverwriteStorage(FileSystemStorage):
    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(OverwriteStorage, self)._save(name, content)

    def get_available_name(self, name):
        return name


USER_CHOICES = (
    ('profesor','Profesor'),
    ('alumno','Alumno'),
    ('admin','Administrador')
)

class Usuario(models.Model):
    """
        class Usuario : Clase encargada del usuario
            :user User: Usuario
            :bio Char: Descripcion del usuario
            :tlf Char: Telefono del usuario
            :email Email: Email del usuario
            :rol Char: Rol del usuario, por defecto,alumno
    """
    user = models.OneToOneField(User,verbose_name="usuario")
    nombre = models.CharField(u'Nombre',max_length=255, null=True, blank=True)
    bio  = models.CharField(u'BIO',max_length=255,null = True, blank = True)
    tlf = models.CharField(u'Telefono',max_length=20, blank=True,null=True )
    email = models.EmailField(u'correo',blank = False, null = False)
    asignaturas = models.ManyToManyField('Asignatura',null=True,blank=True,verbose_name="Lista de asignaturas")
    rol = models.CharField(u'Rol del usuario',max_length=100,choices=USER_CHOICES,default='alumno')
    foto = models.ImageField(
            upload_to="foto/",
            default="foto/default/default.png",
            storage=OverwriteStorage(),
            max_length=50,
            blank=True,null=True)
   
    def save(self, *args, **kwargs):
        self.foto.upload_to = 'foto/%s' % (self.user.username)
        self.foto.name = 'foto/'+ os.path.basename(self.user.username)+'.png'
        return super(Usuario, self).save(*args, **kwargs)

    def __unicode__(self):
        return u"%s" % (self.user.username)

    def tareas(self):
        """
            Metodo que obtiene las tareas de un determinado usuario
        """
        tareas = self.user.tarea_tarea_realiza.filter(user=self.user).exclude(realizado=True)
        return len(tareas)  

    @register.filter
    def obtener_nota_final(self,slug):
        """
            Metodo que obtiene nota final de un determinado usuario
        """
        tareas = self.user.tarea_tarea_realiza.filter(user=self.user,realizado=True,actividades__asignatura__slug=slug,actividades__hide=True)

        nota_final = 0.0

        for tarea in tareas.all():
            nota_final += float(tarea.nota)

        # Dividimos la nota total de las tareas realizadas entre tareas de la asignatura publicadas
        if tareas.count():
            from tarea.models import Actividad
            num_tareas = float(Actividad.objects.filter(asignatura__slug=slug,hide=True).count())
            nota_final = float(nota_final/num_tareas)
        
        return nota_final


    def evaluaciones(self):
        """
            Metodo que obtiene todas las evaluaciones de un determinado usuario
        """
        from cuestionario.models import Evaluacion

        evaluaciones = Evaluacion.objects.filter(user=self.user).exclude(realizado=True)
        return len(evaluaciones)
    
    def crea_usuario_si_nuevo_user(sender = None, instance = None,created = False, raw = False,**kwargs):
        if not created or raw:
            return
        
        usuario_list = Usuario.objects.filter(user=instance)
        if usuario_list.count() > 1: 
            usuario_list.delete()
        
        if usuario_list.count() == 0 :
            usuario = Usuario(user=instance, bio='')
            usuario.save()

    signals.post_save.connect(crea_usuario_si_nuevo_user, sender = User)

class Asignatura(models.Model):
    """
        class Asignatura: Clase encargada de la Asignatura
            :name Char: Nombre de la Asignatura
            :grupo Char: Grupo al que pertenece
    """
    name = models.CharField(u"Nombre", max_length=200,null=False,blank=False)
    grupo = models.CharField(u"Grupo",max_length=2,null=True,blank=False)
    slug = AutoSlugField(populate_from=lambda instance: (instance.name +'-'+ instance.grupo),unique_with=['name','grupo'],null=True,blank=True,editable=True,slugify=lambda value: value.replace(' ','-'))


    def __unicode__(self):
        return u"%s" % (self.slug)

    def alumnos(self):
        alumno = Usuario.objects.filter(asignaturas=self,rol='alumno')
        return alumno
    def profesor(self):
        profesor = Usuario.objects.filter(asignaturas=self,rol='profesor')
        return profesor

class Notificacion(models.Model):
    """
        NOTE: Actualmente sin usar
            class Notificacion : Clase encargada de notificar al usuario
                :user User: Usuario
                :bio Char: Descripcion del usuario
                :tlf Char: Telefono del usuario
                :email Email: Email del usuario
                :rol Char: Rol del usuario, por defecto,alumno
    """
    cuestionarios = models.BooleanField(default=True)
    tareas = models.BooleanField(default=True)
    mensajes = models.BooleanField(default=True)

class Historial(models.Model):
    """
        Class : Historial
            Clase encargada de controlar los accesos de los usuarios
                :ip Char: Direccion IP de un usuario desde la que se conecta
                :fecha DateTime: Fecha y hora desde la que se conecto
    """
    ip = models.CharField(max_length="11")
    fecha = models.DateTimeField('Fecha Entrada',auto_now_add=True)

    def __unicode__(self):
        return u"%s::%s" % (self.ip,self.date)