from estructura import *


crear( "persona", "rut nombre telef")
crear( "nodo", "raiz izq der")

def archivoAListaPersonas(file):
    #Abrimos la configuracion para leer la info del file
    archivo = open(file, 'r')       

    #Guardamos la info en una variable
    datos_personas = archivo.read() 
    
    #Generamos una lista por cada linea de texto
    datos_personas = datos_personas.splitlines()

    #Partimos con una lista vacia
    lista_Personas = []

    #recorremos cada valor que tiene la lista datos_personas 
    for info_personal in datos_personas:
        #Separa la info cada vez que hay un espacio
        rut_nombre_telefono = info_personal.split(' ')

        #Asignamos 3 variables a la vez, son los valores de la lista rut_nombre_telefono
        rut, nombre, telefono = rut_nombre_telefono

        #Cramos una persona con esa info
        info_persona = persona(rut, nombre, telefono)

        #Ponemos la info de una persona en la lista de personas
        lista_Personas.append(info_persona)

    return lista_Personas



listaPersonas = archivoAListaPersonas("personas.txt")

        
def ordena_LP_por_Parametro(LP, parametro):

    #Largo de la lista
    largo_LP = len(LP)

    
    #Recorro cada valor de la lista
    #i, j son posiciones en la lista ListaPersonas
    for i in range(largo_LP):
        for j in range(0, largo_LP - i -1):

            #Persona en la posicion j
            persona_actual = LP[j]
            #Persona en la posicion siguiente a j
            siguiente_persona = LP[j+1]

            if parametro == "telefono":
                #Asumimos que la condicion es False
                condicion = False

                #Si es que actual es mayor entonces la condicion es True
                if int(persona_actual.telef) > int(siguiente_persona.telef):
                    condicion = True

            elif parametro == 'nombre':
                #Asumimos que la condicion es False
                condicion = False
                #Si es que actual es mayor entonces la condicion es True
                if persona_actual.nombre > siguiente_persona.nombre:
                    condicion = True

            #parametro que no queremos
            else:
                print("Paramtero no reconocido")

            if condicion == True:
                #Cambio el valor de LP[j] y LP[j+1] entr si
                
                #Guardo el valor de LP[j]
                valor = LP[j]
                #Actualizo el valor de LP[j]
                LP[j] = LP[j+1]
                #Actualizo el valor de LP[j+1]
                LP[j+1] = valor
    return LP

        
ListaOrdenada = ordena_LP_por_Parametro(listaPersonas, "telefono")



def creaABB(LP, left_index, right_index):

    #left_index y right_index me marcan el rango de valores que quiero ingresar

    #Dejo de iterar pq es el CB
    if left_index > right_index:
        return None

    #Queremos acceder al valor de al medio, para que sea la raiz
    index_medio =   (left_index + right_index)//2

    #Creamos un nodo
    valor = LP[index_medio]
    Parteizq = creaABB(LP, left_index, index_medio-1)
    Parteder = creaABB(LP, index_medio+1, right_index)
        
    nodo_actual = nodo(valor, Parteizq, Parteder)

    return nodo_actual


from lista import *            
l = lista(3,lista(2,lista(3,lista(4,lista(5,None)))))

def filtro(L, funcion, valor):
    
    assert esLista(L)
    if vacia(L):
       return listaVacia
    else:
        if funcion(cabeza(L), valor) :
            return lista(cabeza(L),filtro(cola(L),funcion, valor))
        else:
            return filtro(cola(L),funcion, valor)

def mapa(L,funcion):
     assert esLista(L)
     if L == listaVacia:
         return listaVacia
     y = funcion(cabeza(L))
     return lista(y, mapa(cola(L),funcion))


#P2  a)
l2 = lista("hola", lista("z", listaVacia))
l4= mapa(l2,lambda n: len(n))
#print(l4)
#   b)
l5 = lista(1, lista(2,lista(9,None)))
l6 = filtro(l5,lambda n, divisor: n%divisor == 0,2)
#print(l6)

#    c)
l7 = lista(100, lista(2, listaVacia))
l8 = mapa(l7,lambda x: x%10)
print(l8)


l = lista(3,lista(2,lista(3,lista(4,lista(5,None)))))
L9 = filtro(l, lambda n,m : n>m, cabeza(l))
print(L9)














    


    
