#encoding=utf8
from scheduler.models import *
from random import randint


DIAS = ['','lun','mar','mie','jue','vie','sab']

class HorarioTable(object):

    def __init__(self):
        self.alumno = '';
        self.horarios_list = []
        self.CSSEMPTY = 'vacio'
        self.CSSTIME = 'hora'
        self.CSSSUBJECT = 'materia'
        self.CSSUNION = 'empalme'

    '''
    Función que permite asignar el alumno para obtener la lista de horarios de
    la que se desea hacer una tabla en este caso en forma de arreglo.
    '''
    def setAlumno(self,alumno):
        self.alumno = alumno

    '''
    Función que crea un arreglo que puede ser usado en un tabla de HTML.
    Este arreglo es bidimensional y representa el horario de un alumno
    de una manera gráfica
    '''
    def createTableArray(self):
        self.horarios_info=[]
        self.colorGen = MateriaColorGenerator()
        '''
        Crear arreglo de horarios_info
        '''
        for x in range(14):
            self.horarios_info.append([])
            for y in range(7):
                if y == 0:
                    element = HorarioElement("%(time)d:00" % \
                                                    {'time':x+7},self.CSSTIME)
                    self.horarios_info[x].append(element)
                else :
                    element = HorarioElement(' ','vacio')
                    self.horarios_info[x].append(element)

        self.horarios_list = self.alumno.horario_set.all()

        for horario in self.horarios_list:
            x = 0 
            for hora in range(7,21):
                y = 0
                for dia in range(7):
                    '''
                    Las horas del dia.
                    '''
                    if y == 0:
                        element = HorarioElement("%(time)d:00" % \
                                                    {'time':hora}, self.CSSTIME)
                        self.horarios_info[x][y] = element                    
                    elif horario.hora == hora and horario.dia.id == dia :
                        '''
                        Configuracion del elemento del horario.
                        '''                        
                        nombreMateria = horario.clase.materia.nombre
                        element = HorarioElement(nombreMateria,self.CSSSUBJECT)
                        element.color = self.colorGen.getColorMateria(horario.clase.materia.clave)
                        empalme = HorarioElement('EMPALME', self.CSSUNION)
                        '''
                        Duracion de la materia.
                        '''
                        #Si dura solamente una hora.
                        if self.horarios_info[x][y].info == ' ':
                            self.horarios_info[x][y] = element
                            
                        else:
                            empalme.tooltip = "Tienes un empalme entre "+nombreMateria+" y "+self.horarios_info[x][y].info
                            self.horarios_info[x][y] = empalme
                        #Si dura 2 horas.
                        if horario.duracion >= 120:
                            if self.horarios_info[x+1][y].info == ' ':
                                self.horarios_info[x+1][y] = element
                            else:
                                empalme.tooltip = "Tienes un empalme entre "+nombreMateria+" y "+self.horarios_info[x+1][y].info
                                self.horarios_info[x+1][y] = empalme
                        #Si dura 3 horas
                        if horario.duracion == 180:
                            if self.horarios_info[x][y].info == ' ':
                                self.horarios_info[x+2][y] = element
                            else:
                                empalme.tooltip = "Tienes un empalme entre "+nombreMateria+" y "+self.horarios_info[x+2][y].info
                                self.horarios_info[x+2][y] = empalme
                    y += 1
                x += 1                
        return self.horarios_info;

    def createMateriasSeleccionadasArray(self):
        self.seleccionadas = MateriasSeleccionadasList()
        horarios = self.alumno.horario_set.all()
        for horario in horarios:
            seleccionada = MateriasSeleccionadasElement(horario.clase.materia, horario.clase.maestro, horario.clase.grupo)
            if seleccionada not in self.seleccionadas:
                self.seleccionadas.append(seleccionada)
        return self.seleccionadas

    def getMateriasPorSemestre(self, semestre):
        datosAlumno = DatosEscolares.objects.get(alumno = self.alumno)
        materiasEnCarrera = MateriaCarrera.objects.filter(semestre = semestre, carrera = datosAlumno.carrera)
        materias = list()
        for materiaEnCarrera in materiasEnCarrera:
            materias.append(materiaEnCarrera.materia)
        return materias
             
        
        
    
        

class MateriasArray(object):
        def makeMateriasArray(self,materias):
            self.materiasArray = list()
            for materia in materias:
                self.materiasArray.append(materia)                
            for materia in self.materiasArray:
                materia.maestros = list()
                for maestro in materia.maestro_set.all():
                    materia.maestros.append(maestro)
                    maestroMaterias = MaestroMateria.objects.filter(materia=materia,maestro=maestro)
                    maestro.grupos = list()
                    for maestroMateria in maestroMaterias:
                        maestro.grupos.append(maestroMateria.grupo.codigo)
                print maestro.grupos
                self.materiasArray.append(materia)
            return self.materiasArray;

class HorarioElement(object):
    def __init__(self,info,cssClass):
        self.info = info
        self.css = cssClass
    def __str__(self):
        return self.info+" "+self.css

class MateriasSeleccionadasElement(object):
    def __init__(self,materia,maestro,grupo):
        self.materia = materia
        self.maestro = maestro
        self.grupo = grupo

class MateriasSeleccionadasList(list):
    """
    Clase para hacer listas de materias seleccionadas.
    Esta clase de listas tienen como elementos objetos del tipo MateriasSeleccionadasElement.
    Se implementa el metodo __contains__ para poder evitar que se repita la informacion.
    Para mas informacion leer acerca del metodo __contains__ de Python.
    """
    def __contains__(self,item):
        result = False
        for x in self:
            if x.materia == item.materia:
                result = True
                break
        return result
        

class MateriaColorGenerator(object):
    """
    Clase para generar un color diferente a cada materia.
    Los colores estan en la forma de 3 digitos hexadecimales.
    """
    TANGO_COLORS = {0:'edd400',
                    1:'f57900',
                    2:'c17d11',
                    3:'73d216',
                    4:'3465a4',
                    5:'75507b',
                    6:'d3d7cf',
                    7:'555753',
                    8:'fce94f',
                    9:'e9b96e',
                    10:'ad7fa8',
                    }
    def __init__(self):
        self.tablaColores = {}
        self.numColor = 0

    def getColorMateria(self, materia):
        if materia in self.tablaColores:            
            return self.tablaColores[materia]
        else:            
            color = self.generarColor()             
            self.tablaColores[materia] = color
            return self.tablaColores[materia]

    def generarColor(self):        
        color = MateriaColorGenerator.TANGO_COLORS.get(self.numColor)
        self.numColor += 1
        return color
    
    def checkColorRepetido(self, color):
        for x in self.tablaColores:
            if self.tablaColores[x] == color:
                return True
                break
            else:
                return False