from estructura import *
from lista import *

#P1

estructura.crear("juego", "nombre genero precio ventas")

cuphead = juego("Cuphead", "Plataformas", 10000, 30000)
left4dead = juego("Left4Dead", "Accion", 20000, 25000)
portal2 = juego("Portal 2", "Puzzle", 12000, 20000)
halflife3 = juego("Half-Life 3", "Accion", 20000, 30000)

juegos = crearLista(cuphead, crearLista(left4dead, crearLista(portal2, \
                                                    crearLista(halflife3, None))))

left4dead_descuento_accion = juego("Left4Dead", "Accion", 10000, 25000)
halflife3_descuento_accion = juego("Half-Life 3", "Accion", 10000, 30000)

juegos_descuento_accion = crearLista(cuphead, crearLista(left4dead_descuento_accion,\
                        crearLista(portal2, crearLista(halflife3_descuento_accion, None))))

left4dead_descuento_menor = juego("Left4Dead", "Accion", 14000, 25000)
portal2_descuento_menor = juego("Portal 2", "Puzzle", 8400, 20000)

juegos_descuento_menor = crearLista(cuphead, crearLista(left4dead_descuento_menor,\
                        crearLista(portal2_descuento_menor, crearLista(halflife3, None))))

#descuentoAccion: lista(juego) -> lista(juego)
#aplica un 50% de descuento a todos los juegos de accion
#ej: descuentoAccion(juegos) es juegos_descuento_accion
def descuentoAccion(juegos):
    if juegos == None:
        return None
    j = cabeza(juegos)
    if j.genero == "Accion":
        nuevo_juego = juego(j.nombre, j.genero, j.precio*0.5, j.ventas)
        return crearLista(nuevo_juego, descuentoAccion(cola(juegos)))
    else:
        return crearLista(j, descuentoAccion(cola(juegos)))

assert descuentoAccion(juegos) == juegos_descuento_accion


#suma: lista(juego) -> int
#entrega la suma de ventas de una lista de juegos
#ej: suma(juegos) es 105000
def suma(juegos):
    if juegos == None:
        return 0
    else:
        juego = cabeza(juegos)
        return juego.ventas + suma(cola(juegos))

assert suma(juegos) == 105000

#suma: lista(juego) -> int
#entrega el total de juegos
#ej: total(juegos) es 4
def total(juegos):
    if juegos == None:
        return 0
    else:
        return 1 + total(cola(juegos))

assert total(juegos) == 4

#promedio: lista(juego) -> int
#entrega el promedio de venta de los juegos
#ej: promedio(juegos) es 26250
def promedio(juegos):
    return suma(juegos)/total(juegos)

assert promedio(juegos) == 26250

p = promedio (juegos)

#descuentoMenor: lista(juego) -> lista(juego)
#aplica un 30% de descuento a los juegos que vendan menos que el promedio
#ej: descuentoMenor(juegos) es juegos_descuento_menor
def descuentoMenor(juegos):
    if juegos == None:
        return None
    j = cabeza(juegos)
    if j.ventas < p:
        nuevo_juego = juego(j.nombre, j.genero, j.precio*0.7, j.ventas)
        return crearLista(nuevo_juego, descuentoMenor(cola(juegos)))
    else:
        return crearLista(j, descuentoMenor(cola(juegos)))

assert descuentoMenor(juegos) == juegos_descuento_menor

#P2

estructura.crear("artista", "nombre nacionalidad generos seguidores")

#Ejemplos. Generos sobresimplificados. Numeros sacados de Spotify
radiohead = artista("Readiohead", "Inglaterra", crearLista("Alternativo", crearLista("Rock", None)), 7490273)
daft_punk = artista("Daft Punk", "Estados Unidos", crearLista("Electronica", None), 7940846)
skrillex = artista("Skrillex", "Estados Unidos", crearLista("Electronica", None), 140848469)
metallica = artista("Metallica", "Estados Unidos", crearLista("Metal", crearLista("Rock",  None)), 9931705)
mac_demarco = artista("Mac DeMarco", "Canada", crearLista("Folk",crearLista("Alternativo", None)), 2189038)
metronomy = artista("Metronomy", "Inglaterra", crearLista("Pop", crearLista("Alternativo", None)), 1392108)
gepe = artista("Gepe", "Chile", crearLista("Alternativo", crearLista("Folk", None)), 592640)
javiera_mena = artista("Javiera Mena", "Chile", crearLista("Pop", crearLista("Electronica", None)), 291084)

artistas = crearLista(radiohead, crearLista(daft_punk, crearLista(skrillex, \
                                crearLista(metallica, crearLista(mac_demarco, \
                                crearLista(metronomy, crearLista(gepe, \
                                crearLista(javiera_mena, None))))))))

principales = crearLista(radiohead, crearLista(daft_punk, crearLista(skrillex, \
                                crearLista(metallica, None))))

electronicos = crearLista(daft_punk, crearLista(skrillex, crearLista(javiera_mena, None)))

#artistasPrincipales: lista(artista) -> lista(artista)
#entrega una lista con los artistas con mas de cinco millones seguidores
#ej: artistasPrincipales(artistas) es principales

def artistasPrincipales(artistas):
    if artistas == None:
        return None
    a = cabeza(artistas)
    if a.seguidores > 5000000:
        return crearLista(a, artistasPrincipales(cola(artistas)))
    else:
        return artistasPrincipales(cola(artistas))

assert artistasPrincipales(artistas) == principales


#encontrar: lista(string) string -> bool
#verifica si un string se encuentra en una lista de strings
#ej: encontrar(crearLista("1", crearLista("2", None)), "2") es True

def encontrar(l, s):
    if l == None:
        return False
    elif cabeza(l) == s:
        return True
    else:
        return encontrar(cola(l), s)

assert encontrar(crearLista("1", crearLista("2", None)), "2") == True

#artistasElectronicos: lista(artista) -> lista(artista)
#entrega una lista con los artistas de electronica
#ej: artistasElectronicos(artistas) es electronicos
def artistasElectronicos(artistas):
    if artistas == None:
        return None
    a = cabeza(artistas)
    if encontrar(a.generos, "Electronica"):
        return crearLista(a, artistasElectronicos(cola(artistas)))
    else:
        return artistasElectronicos(cola(artistas))

assert artistasElectronicos(artistas) == electronicos

#artistaNacional: lista(artista) -> artista
#entrega el artista nacional mas popular
#ej: artistaNacional(artistas) es gepe

def artistaNacional(artistas, nacional = artista("nadie", "Chile", "nada", 0)):
    if artistas == None:
        return nacional
    a = cabeza(artistas)
    if a.nacionalidad == "Chile" and a.seguidores > nacional.seguidores:
        return artistaNacional(cola(artistas), a)
    else:
        return artistaNacional(cola(artistas), nacional)

assert artistaNacional(artistas) == gepe
                    
    
