#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect,HttpResponse
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from app.models import Usuario,Asignatura
from app.deco import role_required
from django.core.exceptions import PermissionDenied

def get_info(request,profile,asignatura):
    from cuestionario.models import Evaluacion,Cuestionario
    from tarea.models import Actividad,Tarea
    from app.models import Asignatura
    import datetime
    actividad = Actividad.objects.filter(autor=profile.user,asignatura__slug__iexact=asignatura)

    evaluacion = Evaluacion.objects.filter(user=profile.user,tarea__actividades__asignatura__slug__iexact=asignatura,tarea__realizado=True,tarea__actividades__hide=True)
    evaluacion_sin_corregir = Evaluacion.objects.filter(user=profile.user,tarea__actividades__asignatura__slug__iexact=asignatura,realizado=False,tarea__realizado=True,tarea__actividades__cuestionario_actividad__enddate__gte=datetime.date.today(),tarea__actividades__hide=True)
    evaluacion_sin_repartir =  Actividad.objects.filter(autor=profile.user,asignatura__slug__iexact=asignatura,hide=True,tarea_tarea_actividades__realizado=True,tarea_tarea_actividades__evaluacion_tarea=None,cuestionario_actividad__enddate__gte=datetime.date.today(),enddate__lt=datetime.date.today()).distinct()

    tarea = Tarea.objects.filter(user = profile.user,actividades__asignatura__slug__iexact=asignatura,actividades__hide=True)
    tarea_sin_finalizar = Tarea.objects.filter(user=profile.user,actividades__asignatura__slug__iexact=asignatura,realizado=False,actividades__hide=True,actividades__enddate__gte=datetime.date.today())#,actividades__time__gte = datetime.datetime.now().time())


    asignatura = Asignatura.objects.get(slug__iexact=asignatura)

    cuestionario = Cuestionario.objects.filter(autor=profile.user,actividad__asignatura__slug__iexact = asignatura )
    if request.META.has_key( 'HTTP_REFERER' ):
        atras = request.META['HTTP_REFERER']
    else:
        atras = None

    k_info = {'atras':atras,'asignatura':asignatura,'actividad':actividad,'evaluacion':evaluacion,'evaluacion_sin_repartir':evaluacion_sin_repartir,'tarea':tarea,'tarea_sin_finalizar':tarea_sin_finalizar,'evaluacion_sin_corregir':evaluacion_sin_corregir,'cuestionario':cuestionario}
    return k_info

def ver_indice(request):
    return render_to_response('app/index.html',context_instance = RequestContext(request))

@login_required
def comprueba_referido(request):
    if request.META.has_key( 'HTTP_REFERER' ):
        return HttpResponseRedirect(request.META['HTTP_REFERER'])
    else:
        raise PermissionDenied

@login_required
def perfil(request,slug=None):
    from django.forms.models import model_to_dict
    from app.forms import Edit_Form_Perfil
    import app.forms
    profile = request.user.get_profile()

    if slug:
        k_info=get_info(request,profile,slug)

    if request.POST:
        form = Edit_Form_Perfil(request.POST,request.FILES,instance=profile)
        if form.is_valid():
            form.save()
            if slug:
                return HttpResponseRedirect(reverse('app.views.perfil',args=[slug]))
            else:
                return HttpResponseRedirect(reverse('app.views.perfil'),)

    else:
        usuario = model_to_dict(profile, fields=[], exclude=[])
        form = Edit_Form_Perfil(usuario)
    if slug:
        return render_to_response('app/asignatura_perfil.html',{'form' : form ,'informacion':k_info },context_instance = RequestContext(request))

    else:
        return render_to_response('app/perfil.html',{'form' : form },context_instance = RequestContext(request))


@login_required
def ver_asignatura(request,slug):
    from tarea.models import Tarea
    from cuestionario.models import Evaluacion

    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)
    
    if profile.user.usuario.rol == 'profesor':
        return render_to_response('app/%s/main_asignaturas.html'% request.user.usuario.rol,{'informacion':k_info},context_instance = RequestContext(request))
    else:
        tareas = Tarea.objects.filter(actividades__asignatura__slug = slug,user=profile.user,realizado=True,actividades__hide=True)
        evaluaciones = Evaluacion.objects.filter(tarea__actividades__asignatura__slug__iexact=slug,user=profile.user,realizado=True,tarea__actividades__hide=True)
        return render_to_response('app/%s/main_asignaturas.html'% request.user.usuario.rol,{'informacion':k_info,'tareas':tareas,'evaluaciones':evaluaciones},context_instance = RequestContext(request))

@role_required(role='profesor')
@login_required
def aniadir_alumno_asignatura(request,slug):
    from django.contrib.auth.models import User
    from app.forms import Add_Form_Alumno_Asignatura
    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)
    asignatura = profile.user.usuario.asignaturas.get(slug__iexact = slug)

    if profile.user.is_authenticated() and request.method =='POST':
        form = Add_Form_Alumno_Asignatura(request.POST)
        usuario = None
        try : 
            """ Consulta si ya existe"""
            usuario = User.objects.get( username = request.POST['username'])
            alumno = Usuario.objects.get(user = usuario)

            try :   
                    alumno.asignaturas.get(slug__iexact = asignatura.slug)

            except asignatura.DoesNotExist:
                    alumno.asignaturas.add(asignatura)
                    alumno.save()
            
            return HttpResponseRedirect(reverse('app.views.ver_asignatura',args=[asignatura.slug]))
        except User.DoesNotExist:
            if form.is_valid():
                """ Crea un usuario nuevo"""
                usuario = User(username=request.POST['username'],first_name=request.POST['first_name'],last_name=request.POST['last_name'],email=request.POST['email'])
                usuario.is_staff=False
                usuario.set_password(request.POST['username'][:-1])
                usuario.save()
                alumno = Usuario.objects.get(user = usuario)
                try :   
                        alumno.asignaturas.get(slug__iexact = asignatura.slug)

                except asignatura.DoesNotExist:
                        alumno.email = usuario.email
                        alumno.nombre = usuario.first_name + ' ' + usuario.last_name
                        alumno.asignaturas.add(asignatura)
                        alumno.save()
                
                return HttpResponseRedirect(reverse('app.views.ver_asignatura',args=[asignatura.slug]))
                
    else:
        form = Add_Form_Alumno_Asignatura()
        
    return render_to_response('app/%s/aniadir_alumno_asignatura.html'% request.user.usuario.rol,{'form' : form,'asignatura':asignatura,'informacion':k_info},context_instance = RequestContext(request))

@role_required(role='profesor')
@login_required
def aniadir_alumnos_asignatura(request,slug):
    from django.utils import simplejson
    from django.contrib.auth.models import User

    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)
    asignatura = profile.user.usuario.asignaturas.get(slug__iexact = slug)

    if profile.user.is_authenticated() and request.method =='POST':
        message = simplejson.dumps(request.POST['lista'], sort_keys=True, indent=5,separators=(',',':')).decode('iso-8859-1').encode('raw_unicode_escape')
        for linea in list(simplejson.loads(message).split("\n")):
            campo = linea.split("\t")
            if len(linea)>=5:
                DNI = campo[0].replace(' ', '')
                NIF = 'TRWAGMYFPDXBNJZSQVHLCKE'
                Letra = NIF[int(DNI)%23]

                try:
                    """ Consulta si ya existe"""
                    usuario = User.objects.get( username = campo[0].replace(' ', '') + Letra)
                    alumno = Usuario.objects.get(user = usuario)
                    try :
                        """ Comprueba si el alumno esta dado de alta"""   
                        alumno.asignaturas.get(slug__iexact = asignatura.slug)

                    except asignatura.DoesNotExist:
                        """ Si no lo esta, lo da de alta"""
                        alumno.asignaturas.add(asignatura)
                        alumno.save()

                except User.DoesNotExist:
                    """ Crea un usuario nuevo"""
                    usuario = User(username=campo[0].replace(' ', '') + Letra,first_name=campo[3].replace(' ', ''),last_name=campo[1].replace(' ', '')+' '+campo[2].replace(' ', ''),email=campo[4].replace(' ', ''),password=campo[0].replace(' ', ''))
                    usuario.is_staff=False
                    usuario.set_password(campo[0].replace(' ', '') )
                    usuario.save()

                    alumno = Usuario.objects.get(user = usuario)

                    try :   
                            alumno.asignaturas.get(slug__iexact = asignatura.slug)

                    except asignatura.DoesNotExist:
                            alumno.email = usuario.email
                            alumno.asignaturas.add(asignatura)
                            alumno.nombre=name=campo[3]+' '+campo[1]+' '+campo[2]
                            alumno.save()

        #return HttpResponse(list(simplejson.loads(message).split("\n"))[0], mimetype="application/json")
        return HttpResponseRedirect(reverse('app.views.ver_asignatura',args=[asignatura.slug]))

    return render_to_response('app/%s/aniadir_alumnos_asignatura.html'% request.user.usuario.rol,{'asignatura':asignatura,'informacion':k_info},context_instance = RequestContext(request))

@role_required(role='profesor')
@login_required
def eliminar_alumno_asignatura(request,slug,alumno):
    from tarea.models import Tarea
    from cuestionario.models import Evaluacion

    asignatura = Asignatura.objects.get(slug__iexact=slug)
    alumno = Usuario.objects.get(user__username__iexact=alumno)

    """Eliminamos las evaluaciones"""
    evaluaciones = Evaluacion.objects.filter(user=alumno.user,tarea__actividades__asignatura__slug__iexact=slug)
    evaluaciones.delete()

    """Eliminamos las tareas"""
    tareas = Tarea.objects.filter(user=alumno.user,actividades__asignatura__slug__iexact=slug)
    tareas.delete()

    alumno.asignaturas.remove(asignatura)

    return comprueba_referido(request)

@role_required(role='profesor')
@login_required
def eliminar_alumnos_asignatura(request,slug):
    from tarea.models import Tarea
    from cuestionario.models import Evaluacion

    asignatura = Asignatura.objects.get(slug__iexact=slug)
    alumnos = Usuario.objects.filter(asignaturas=asignatura,rol='alumno')

    """Elimina alumno de la asignatura"""
    for alumno in alumnos.all():
        
        """Eliminamos las evaluaciones"""
        evaluaciones = Evaluacion.objects.filter(user=alumno.user,tarea__actividades__asignatura__slug__iexact=slug)
        evaluaciones.delete()

        """Eliminamos las tareas"""
        tareas = Tarea.objects.filter(user=alumno.user,actividades__asignatura__slug__iexact=slug)
        tareas.delete()

        alumno.asignaturas.remove(asignatura)

    return comprueba_referido(request)

@role_required(role='profesor')
@login_required
def ver_alumno_asignatura(request,slug,alumno):
    from tarea.models import Tarea
    from cuestionario.models import Evaluacion
    
    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)

    # Query
    alumno = Usuario.objects.get(user__username__iexact=alumno)
    tareas = Tarea.objects.filter(user=alumno.user,actividades__asignatura__slug__iexact=slug,realizado=True)
    evaluaciones = Evaluacion.objects.filter(user=alumno.user,tarea__actividades__asignatura__slug__iexact=slug,realizado=True)

    return render_to_response('app/%s/ver_alumno_asignatura.html'% request.user.usuario.rol,{'alumno':alumno,'tareas':tareas,'evaluaciones':evaluaciones,'informacion':k_info},context_instance = RequestContext(request))

