#encoding=utf8
from scheduler.models import AlumnoHorario
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.template.loader import get_template
from scheduler.models import Materia
from scheduler.forms import *
from scheduler.classes import *

def populate_database(request):
    template = get_template("populate_database.html")
    variables = RequestContext(request,{                         
                         'page_body':'Poblar la base de datos, con los datos contenidos en el archivo CSV.',
                         'button_text':'Poblar Base de Datos',                         
                         })
    output = template.render(variables)
    return HttpResponse(output)


def main_page(request):
    template = get_template("main_page.html")
    variables = RequestContext(request,{
                         'page_body':'Ayuda para la elección de horarios.',
                         })
    output = template.render(variables)
    return HttpResponse(output)

def logout_page(request):
    logout(request)
    return HttpResponseRedirect('/')

def register_page(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():            
            user = User.objects.create_user(
                    username    = form.cleaned_data['username'],
                    password    = form.cleaned_data['password1'],
                    email       = form.cleaned_data['email'])
            user.first_name  = form.cleaned_data['first_name']
            user.last_name   = form.cleaned_data['last_name']
            user.save()
            datosAlumno = DatosEscolares()
            datosAlumno.facultad    = form.cleaned_data['facultad']
            datosAlumno.carrera     = form.cleaned_data['carrera']
            datosAlumno.matricula   = form.cleaned_data['matricula']
            datosAlumno.alumno  = user
            datosAlumno.save()

            return HttpResponseRedirect('/register/success/')
    else:
        form = RegistrationForm()
    variables = RequestContext(request, {
                        'form': form
                        })
    template = get_template("registration/register.html")
    output = template.render(variables)
    return HttpResponse(output)

@login_required
def make_horario(request, username):
    '''
    Verficamos la existencia del usuario.
    '''
    try:
        user = User.objects.get(username=username)
    except:
        raise Http404('El usuario no existe.')
    if not request.user.username == user.username:
        redirectUrl = "/guh/"+request.user.username+"/"
        return HttpResponseRedirect(redirectUrl)
    '''
    Verificamos si nos envia de que semestre desea ver las materias.
    '''
    if request.method == 'POST':
        form = SemestreChoice(request.POST)
        if form.is_valid():
            semestre = form.cleaned_data['semestre']
    else:
        form = SemestreChoice()
        semestre = 1
    
    
    horarioTable = HorarioTable()
    horarioTable.setAlumno(request.user)
    materias    = horarioTable.getMateriasPorSemestre(semestre)
    template    = get_template('user_horario.html')
    variables   = RequestContext(request,{
                    'form': form,
                    'username': user.username,
                    'page_body':'Hola '+user.first_name,
                    'user'  : user,
                    'materias' : materias,
                    'horarios_info': horarioTable.createTableArray(),
                    'seleccionadas': horarioTable.createMateriasSeleccionadasArray(),
                    })
    output      = template.render(variables)
    return HttpResponse(output)

def materias_seleccionadas(request):
    try:
        alumno  = request.user
    except:
        raise Http404('Datos erroneos.')
    horarioTable = HorarioTable()
    horarioTable.setAlumno(alumno)

    variables = RequestContext(request,{
                'seleccionadas': horarioTable.createMateriasSeleccionadasArray(),
                })
    return render_to_response("seleccionadas.html",variables)

def grupos_search(request, materiaId, maestroId, mode = None):
    if mode is None:
        mode = 'html'
    maestro = Maestro.objects.get(id=maestroId)
    materia = Materia.objects.get(id=materiaId)
    maestroMateriaList = Clase.objects.filter(materia=materia,maestro=maestro)
    grupos = list()
    for maestroMateria in maestroMateriaList:
        grupos.append(maestroMateria.grupo)
    variables   = RequestContext(request,{
                'grupos': grupos,
                'maestro': maestro,
                'materia':materia})
    if mode == 'html':
        return render_to_response("grupos_list.html",variables)
    else:
        raise Http404('Datos Erroneos.')


'''
Nota: Este método solo toma en cuenta un solo horario por alumno.
Si se quiere manejar mas de 1 horario se debe de tomar en cuenta la
propiedad numero_horario al hacer el query.
'''
def register_horario(request, materiaId, maestroId, grupoId, mode = None):
    if mode is None:
        mode = 'html'
    alumno = request.user
    materia = Materia.objects.get(id = materiaId)
    grupo   = Grupo.objects.get(id = grupoId)
    maestro = Maestro.objects.get(id = maestroId)
    '''
    Primero se verifica que la materia no esté repetida.
    '''
    alumno_horarios = AlumnoHorario.objects.filter(alumno = alumno)
    '''
    Si esta repetida la se elimina de las materias del alumno.
    '''
    for alumnoHorario in alumno_horarios:
        if alumnoHorario.horario.clase.materia == materia:
            alumnoHorario.delete()
    '''
    Se agrega los horarios que concuerden con el maestro, materia y grupo al alumno.
    '''
    clase = Clase.objects.get(materia = materia, maestro = maestro, grupo = grupo)
    horarios = Horario.objects.filter(clase = clase)
    for horario in horarios:
        alumnoHorario           = AlumnoHorario()
        alumnoHorario.alumno    = alumno
        alumnoHorario.horario   = horario
        alumnoHorario.numero_horario = 1
        alumnoHorario.save()        
            
    horarioTable = HorarioTable()
    horarioTable.setAlumno(request.user)
    variables   = RequestContext(request,{
                   'user'  : request.user,
                   'materias' : Materia.objects.all(),
                    'horarios_info': horarioTable.createTableArray(),
                    'ciclo' : '2009B'
                    })
    if mode == 'html':
        return render_to_response("horarios_list.html",variables)
    else:
        raise Http404('Datos Erroneos.')

def delete_horario(request, materiaId, mode = None):
    if mode is None:
        mode = 'html'
    alumno      = request.user    
    materia = Materia.objects.get(id = materiaId)
    alumnoHorarios = AlumnoHorario.objects.filter(alumno = alumno)
    for alumnoHorario in alumnoHorarios:
        if alumnoHorario.horario.clase.materia == materia:
            alumnoHorario.delete()
    horarioTable = HorarioTable()
    horarioTable.setAlumno(alumno)

    variables = RequestContext(request,{
                    'horarios_info': horarioTable.createTableArray(),
                    })
    if mode == 'html':
        return render_to_response("horarios_list.html", variables)
    else:
        raise Http404('Datos Erroneos.')

def print_horario(request):
    try:
        alumno = request.user
    except:
        raise Http404('Debe Iniciar Sesión.')
    horarioTable = HorarioTable()
    horarioTable.setAlumno(alumno)
    variables = RequestContext(request,{
                                'horarios_info' : horarioTable.createTableArray(),
                                'seleccionadas' : horarioTable.createMateriasSeleccionadasArray(),
                                'printing'      : True,
                                })
    return render_to_response('print_horario.html', variables)

def carreras_search(request, facultadId, mode):
    try:
        facultad = Facultad.objects.get(id = facultadId)
    except:
        raise Http404('Datos incorrectos.')
    carreras = facultad.carrera_set.all()
    if mode == 'html':
        variables = RequestContext(request,{
                                    'carreras' : carreras,
                                    })
        return render_to_response('carreras.html', variables)
