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

from django.core.exceptions import PermissionDenied
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
from django.http import HttpResponse,HttpResponseRedirect

from app.deco import role_required
from app.views import get_info

@login_required
def descarga_evaluacion(request,slug,id,alumno):
    import csv
    import StringIO
    import zipfile
    
    from cuestionario.models import Evaluacion
    from tarea.models import Pregunta as PreguntaActividad

    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)

    if profile.user.usuario.rol == "profesor":
        evaluacion = get_object_or_404(Evaluacion,id=id,tarea__actividades__asignatura__slug__iexact=slug,realizado=True,user__username=alumno)
        preguntas_tarea = PreguntaActividad.objects.filter(actividad__id=evaluacion.tarea.actividades.id,realizador__username=alumno).exclude(pregunta_evaluada=None)
    else:
        evaluacion = get_object_or_404(Evaluacion,id=id,tarea__actividades__asignatura__slug__iexact=slug,realizado=True,user__username=profile.user.username)
        preguntas_tarea = PreguntaActividad.objects.filter(actividad__id=evaluacion.tarea.actividades.id,realizador__username=profile.user.username).exclude(pregunta_evaluada=None)
 
    # Seguridad viene sin referenciar
    if not request.META.has_key( 'HTTP_REFERER' ):
        raise PermissionDenied

    # Cabecera
    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename="'+alumno.encode('utf-8')+'-'+evaluacion.tarea.actividades.name.encode('utf-8')+'.zip"'

    # Archivo zip
    archivoZIP = zipfile.ZipFile(response,'w')   ## write zip to response

    # Manejador de archivo
    archivoHandle = StringIO.StringIO()

    # Archivo CSV
    archivoCSV = csv.writer(archivoHandle,dialect='excel')
    archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta","Valor","Puntuacion","Comentario"])

    # Preguntas Evaluadas
    for pregunta in preguntas_tarea.all():
        if pregunta.realizador == evaluacion.user:
            if pregunta.pregunta_evaluada.type != 1:
                eleccion = pregunta.pregunta_evaluada.tarea_eleccion_pregunta.all()[0]
                archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,eleccion.name.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
            else:
                if pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all():
                    respuesta = pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all()[0]
                    puntuacion = pregunta
                    archivoCSV.writerow([pregunta.pregunta_evaluada.nr, pregunta.pregunta_evaluada.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,respuesta.respuesta.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
                else:
                    raise PermissionDenied
    archivoZIP.writestr(evaluacion.user.username+'-Puntuacion.csv', archivoHandle.getvalue())
    
    # Manejador de archivo
    archivoHandle = StringIO.StringIO()
    
    # Archivo CSV
    archivoCSV = csv.writer(archivoHandle,dialect='excel')
    archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta"])

    # Cuestionario
    for pregunta in evaluacion.cuestionario.pregunta_cuestionario.all():
        if pregunta.realizador == evaluacion.user:

            if pregunta.type != 1:
                if pregunta.eleccion_pregunta.all():
                    eleccion = pregunta.eleccion_pregunta.all()[0]
                    archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,eleccion.name.encode('utf-8')])
            else:
                if pregunta.tarea_respuesta_pregunta.all():
                    respuesta = pregunta.respuesta_pregunta.all()[0]
                    archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,respuesta.respuesta.encode('utf-8')])
                else:
                    raise PermissionDenied
    
    archivoZIP.writestr(evaluacion.user.username.encode('utf-8')+'-Cuestionario.csv', archivoHandle.getvalue())
    for file in archivoZIP.filelist:
        file.create_system = 0    
    
    archivoZIP.close()
    return response
    #return HttpResponse(response, mimetype="application/json")

@role_required(role='profesor')
@login_required
def descarga_todas_evaluaciones(request,slug,id):
    import csv
    import StringIO
    import zipfile

    from cuestionario.models import Evaluacion
    from tarea.models import Pregunta as PreguntaActividad

    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)

    evaluaciones = Evaluacion.objects.filter(tarea__actividades__id=id,tarea__actividades__asignatura__slug__iexact=slug,realizado=True)
    preguntas_tarea = PreguntaActividad.objects.filter(actividad__id=id).exclude(pregunta_evaluada=None)

    # Seguridad viene sin referenciar
    if request.META.has_key( 'HTTP_REFERER' ):
        if evaluaciones.count() == 0:
            return HttpResponseRedirect(request.META['HTTP_REFERER'])
    elif evaluaciones.count() == 0:
        raise PermissionDenied

    # Cabecera
    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename="Evaluacion-'+evaluaciones.all()[0].tarea.actividades.name.encode('utf-8')+'.zip"'

    # Archivo zip
    archivoZIP = zipfile.ZipFile(response,'w')   ## write zip to response

    for evaluacion in evaluaciones:

        # Manejador de archivo
        archivoHandle = StringIO.StringIO()

        # Archivo CSV
        archivoCSV = csv.writer(archivoHandle,dialect='excel')
        archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta","Valor","Puntuacion","Comentario"])

        for pregunta in preguntas_tarea.all():
            if pregunta.realizador == evaluacion.user:
                if pregunta.pregunta_evaluada.type != 1:
                    eleccion = pregunta.pregunta_evaluada.tarea_eleccion_pregunta.all()[0]
                    archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,eleccion.name.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
                else:
                    if pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all():
                        respuesta = pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all()[0]
                        puntuacion = pregunta
                        archivoCSV.writerow([pregunta.pregunta_evaluada.nr, pregunta.pregunta_evaluada.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,respuesta.respuesta.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
                    else:
                        raise PermissionDenied


        archivoZIP.writestr(evaluacion.user.username.encode('utf-8')+'-Puntuacion.csv', archivoHandle.getvalue())

        # Manejador de archivo
        archivoHandle = StringIO.StringIO()
        
        # Archivo CSV
        archivoCSV = csv.writer(archivoHandle,dialect='excel')
        archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta"])

        # Cuestionario
        for pregunta in evaluacion.cuestionario.pregunta_cuestionario.all():
            if pregunta.realizador == evaluacion.user:

                if pregunta.type != 1:
                    if pregunta.eleccion_pregunta.all():
                        eleccion = pregunta.eleccion_pregunta.all()[0]
                        archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,eleccion.name.encode('utf-8')])
                else:
                    if pregunta.tarea_respuesta_pregunta.all():
                        respuesta = pregunta.respuesta_pregunta.all()[0]
                        archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,respuesta.respuesta.encode('utf-8')])
                    else:
                        raise PermissionDenied
        
        archivoZIP.writestr(evaluacion.user.username.encode('utf-8')+'-Cuestionario.csv', archivoHandle.getvalue())

    for file in archivoZIP.filelist:
        file.create_system = 0    
    
    archivoZIP.close()

    return response


@role_required(role='profesor')
@login_required
def descarga_evaluacion_alumno(request,slug,alumno):
    import csv
    import StringIO
    import zipfile

    from cuestionario.models import Evaluacion
    from tarea.models import Pregunta as PreguntaActividad

    profile = request.user.get_profile()
    k_info = get_info(request,profile,slug)


    evaluaciones = Evaluacion.objects.filter(tarea__actividades__asignatura__slug__iexact=slug,realizado=True,user__username=alumno)

    ### SEGURIDAD ###
    """ Si viene referenciado no devuelve nada, si intenta acceder sin referenciar da ERROR404 """

    if request.META.has_key( 'HTTP_REFERER' ):
        if evaluaciones.count() == 0:
            return HttpResponseRedirect(request.META['HTTP_REFERER'])
    elif evaluaciones.count() == 0:
        raise PermissionDenied


    # Cabecera
    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename="'+alumno.encode('utf-8')+'-Evaluaciones.zip"'

    # Archivo zip
    archivoZIP = zipfile.ZipFile(response,'w')   ## write zip to response

    for evaluacion in evaluaciones:
        preguntas_tarea = PreguntaActividad.objects.filter(actividad__id=evaluacion.tarea.actividades.id,realizador__username=alumno).exclude(pregunta_evaluada=None)

        # Manejador de archivo
        archivoHandle = StringIO.StringIO()

        # Archivo CSV
        archivoCSV = csv.writer(archivoHandle,dialect='excel')
        archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta","Puntuacion","Comentario"])

        # Preguntas Evaluadas
        for pregunta in preguntas_tarea.all():
            if pregunta.realizador == evaluacion.user:
                if pregunta.pregunta_evaluada.type != 1:
                    eleccion = pregunta.pregunta_evaluada.tarea_eleccion_pregunta.all()[0]
                    archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,eleccion.name.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
                else:
                    if pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all():
                        respuesta = pregunta.pregunta_evaluada.tarea_respuesta_pregunta.all()[0]
                        puntuacion = pregunta
                        archivoCSV.writerow([pregunta.pregunta_evaluada.nr, pregunta.pregunta_evaluada.text.encode('utf-8'), pregunta.pregunta_evaluada.type, pregunta.val,respuesta.respuesta.encode('utf-8'),pregunta.tarea_eleccion_pregunta.all()[0].val,pregunta.comentario.encode('utf-8')])
                    else:
                        raise PermissionDenied

        archivoZIP.writestr(str(evaluacion.tarea.actividades.nr).encode('utf-8') +'-'+evaluacion.tarea.actividades.text.encode('utf-8')+'-Puntuacion.csv', archivoHandle.getvalue())

        # Manejador de archivo
        archivoHandle = StringIO.StringIO()

        # Archivo CSV
        archivoCSV = csv.writer(archivoHandle,dialect='excel')
        archivoCSV.writerow(["Numero", "Pregunta", "Tipo","Valor","Respuesta"])

        # Cuestionario
        for pregunta in evaluacion.cuestionario.pregunta_cuestionario.all():
            if pregunta.realizador == evaluacion.user:

                if pregunta.type != 1:
                    if pregunta.eleccion_pregunta.all():
                        eleccion = pregunta.eleccion_pregunta.all()[0]
                        archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,eleccion.name.encode('utf-8')])
                else:
                    if pregunta.tarea_respuesta_pregunta.all():
                        respuesta = pregunta.respuesta_pregunta.all()[0]
                        archivoCSV.writerow([pregunta.nr, pregunta.text.encode('utf-8'), pregunta.type, pregunta.val,respuesta.respuesta.encode('utf-8')])
                    else:
                        raise PermissionDenied

        archivoZIP.writestr(str(evaluacion.tarea.actividades.nr).encode('utf-8') +'-'+evaluacion.tarea.actividades.text.encode('utf-8')+'-Cuestionario.csv', archivoHandle.getvalue())
        #return HttpResponse(response, mimetype="application/json")

    for file in archivoZIP.filelist:
        file.create_system = 0    
    
    archivoZIP.close()

    return response
#                        return HttpResponse(pregunta.eleccion_pregunta.all(), mimetype="application/json")
