""" Utilizando la programación orientada a objetos, cree un programa que se encargue de agregar las peliculas
a un catalogo. Al momento de realizar una busqueda de la 
pelicula esta debe devolver: 
- El nombre
- El año
- Una breve descripción sobre la trama de la pelicula
- El genero (comedia, accion, entre otros.)
- El director
- El elenco
- Por ultimo, debe decir si  se encuentra alquilada o disponible, en caso de estar alquilada preguntar 
si se desea devolver la pelicula para que este disponible nuevamente y en caso de estar disponible preguntar 
si se desea alquilar. 
- Los métodos de busqueda deben ser por año, por nombre de la película, por director, actor y por coincidencia de
busqueda serciorando que aparezcan todas las peliculas que esten relacionadas con la busqueda."""

# Las peliculas que debes agregar al programa son un total de 10 y son las siguientes:

#1
"Nombre: Maestras del engaño" 
"Año: 2019" 
"Descripción: Penny y Josephine son artistas del engaño, una de clase baja y la otra de clase alta, que hacen equipo para acabar con los hombres que les hicieron daño." 
"Género: Comedia | Crimen" 
"Director: Chris Addison" 
"Elenco: Anne Hathaway, Rebel Wilson, Alex Sharp, Timothy Simons, Douggie McMeekin, Casper Christensen, Ingrid Oliver, Nicholas Woodeson, Celine Abrahams"

#2
"Nombre: Ni en tus sueños" 
"Año: 2019" 
"Descripción: El periodista Fred Flarsky se reencuentra con su amor de infancia, Charlotte Field, ahora una de las mujeres más influyentes del mundo. Mientras se prepara para postularse para la presidencia, Charlotte contrata a Fred como escritor y surgen chispas entre ellos." 
"Género: Comedia | Romance" 
"Director: Jonathan Levine" 
"Elenco: Charlize Theron, Seth Rogen, June Diane Raphael, O'Shea Jackson Jr., Ravi Patel, Bob Odenkirk, Andy Serkis, Randall Park, Tristan D. Lalla, Alexander Skarsgård"

#3
"Nombre: Shaft" 
"Año: 2019" 
"Descripción: John Shaft Jr., un especialista en ciber seguridad graduado del MIT, pide ayuda a su padre para descubrir la verdad por detrás de la muerte prematura de su amigo." 
"Género: Acción | Comedia | Crimen"
"Director: Tim Story" 
"Elenco: Samuel L. Jackson, Jessie T. Usher, Richard Roundtree, Regina Hall, Alexandra Shipp, Matt Lauria, Titus Welliver, Method Man, Isaach De Bankolé"

4#
"Nombre: Quizás para siempre" 
"Año: 2019" 
"Descripción: La famosa chef Sasha y el músico Marcus son un par de amigos de infancia que no se veían hace muchos años y se enamoran, teniendo dificultades para juntar sus vidas increíblemente diferentes." 
"Género: Comedia | Romance" 
"Director: Nahnatchka Khan" 
"Elenco: Keanu Reeves, Ali Wong, Miya Cech, Randall Park, Charlyne Yi, Daniel Dae Kim, Karan Soni, Casey Wilson, Susan Park, Michelle Buteau, Karen Holness, Ashley Liao"

5#
"Nombre: Brightburn: Hijo de la oscuridad" 
"Año: 2019" 
"Descripción: ¿Y si un niño de otro mundo se estrellara en la Tierra, pero en vez de convertirse en un héroe para la humanidad, termine siendo algo mucho más siniestro?" 
"Género: Terror | Ciencia ficción" 
"Director:David Yarovesky" 
"Elenco: Elizabeth Banks, David Denman, Jackson A. Dunn, Abraham Clinkscales, Christian Finlayson, Jennifer Holland, Emmie Hunter, Matt Jones, Meredith Hagner"

6#
"Nombre: La peor noche de mi vida" 
"Año: 2019" 
"Descripción: El sueño de una reportera de convertirse en una presentadora se ve en peligro luego de que en una aventura de una noche se queda sin telefono, auto, identificación ni dinero. Y sólo tiene 8 horas para llegar a la entrevista de trabajo más importante de su vida." 
"Género: Comedia" 
"Director: Steven Brill" 
"Elenco: Elizabeth Banks, James Marsden, Gillian Jacobs, Sarah Wright, Ethan Suplee, Bill Burr, Ken Davitian, Lawrence Gilliard Jr., Alphonso McAuley, Da'Vone McDonald, Eric Etebari, Oliver Hudson, Jacob Timothy Manown, Carol Mansell, Bryan Callen"

7#
"Nombre: Bumblebee" 
"Año: 2019" 
"Descripción: En 1987, Bumblebee encuentra refugio en un depósito de chatarra en un pequeño pueblo de California. Charlie, a punto de cumplir 18 y queriendo hallar su lugar en el mundo, lo encuentra, averiado y deteriorado."
"Género: Acción | Aventura | Ciencia ficción"
"Director: Travis Knight"
"Elenco: Hailee Steinfeld, Jorge Lendeborg Jr., John Cena, Jason Drucker, Pamela Adlon, Stephen Schneider, Ricardo Hoyos, John Ortiz, Glynn Turman, Len Cariou, Kollin Holtz"

8#
"Nombre: Mi vida a los 17"
"Año: 2016"
"Descripción: Cuando Nadine se entera que su mejor amiga Krista comenzó a salir con su hermano mayor, su vida en la escuela se hace más insoportable. Pronto se da cuenta de la importancia de crecer, y lo difícil que es hacerlo."
"Género: Comedia | Drama"
"Director: Kelly Fremon Craig"
"Elenco: Hailee Steinfeld, Haley Lu Richardson, Blake Jenner, Kyra Sedgwick, Woody Harrelson, Hayden Szeto, Alexander Calvert, Eric Keenleyside, Nesta Cooper, Daniel Bacon, Lina Renna, Ava Grace Cooper, Christian Michael Cooper, Jena Skodje, Josh Simpson"

#9
"Nombre: Más notas perfectas 2"
"Año: 2015"
"Descripción: Después de una actuación humillante en el Lincoln Center, las Barden Bellas se inscriben en una competición internacional de canto a capela que nunca ningún grupo de Estados Unidos ha ganado. De esta manera ellas buscan recuperar su status y su derecho para cantar. Será un gran desafío."
"Géneros: Comedia | Música"
"Director: Elizabeth Banks"
"Elenco: Anna Kendrick, Rebel Wilson, Hailee Steinfeld, Brittany Snow, Skylar Astin, Adam DeVine, Katey Sagal, Anna Camp, Ben Platt, Alexis Knapp, Hana Mae Lee, Ester Dean, Chrissie Fit, Birgitte Hjort Sørensen, Flula Borg"

#10
"Nombre: Operación Red Sparrow"
"Año: 2018"
"Descripción: La bailarina Dominika Egorova es reclutada por un servicio ruso de inteligencia donde es obligada a usar su cuerpo como un arma. Su primera misión, que tiene como objetivo un agente de la CIA, amenaza la seguridad de ambas naciones."
"Género: Drama | Misterio | Suspenso"
"Director: Francis Lawrence"
"Elenco: Jennifer Lawrence, Joel Edgerton, Matthias Schoenaerts, Charlotte Rampling, Mary-Louise Parker, Ciarán Hinds, Joely Richardson, Bill Camp, Jeremy Irons, Thekla Reuten"

# El ejercicio comienza aqui:

import pickle

class Pelicula():

    def __init__(self, nombre, año, descripcion, genero, director, elenco, estado):
        self.nombre = nombre.upper()
        self.año = año
        self.descripcion = descripcion.upper()
        self.genero = genero.upper()
        self.director = director.upper()
        self.elenco = elenco.upper()
        self.estado = estado.upper()
        print("Se ha guardado la pelicula {} correctamente".format(self.nombre))

    def __str__(self):
        return ("""\
Nombre:\t\t {}
Año:\t\t {}
Descripción:\t {}
Género:\t\t {}
Director:\t {}
Elenco:\t\t {}
Estado:\t\t {}\n""".format(self.nombre, self.año, self.descripcion, self.genero, self.director, self.elenco, self.estado))

# Aquí comienza el catalogo, donde agregaremos las películas a un fichero binario:

class Catalogo():

    peliculas = []

    def __init__(self): # Al iniciarse el programa el constructor realiza la siguiente labor:
        self.cargar() # Llama a la función cargar que la definiremos a continuación

    def cargar(self): # Se ejecuta la función cargar gracias al constructor, y esta función cargará el fichero donde se guardarán nuestras peliculas, si no existe lo creará y si existe lo cargará a nuestro codigo.
        fichero = open("catalogo.pckl","ab+") # Lo abrimos en modo append binario "ab+" para no sobreescribir nada al abrirlo en caso de que ya exista el fichero, es decir; la primera vez que se ejecute el codigo este no existira y se creara, pero luego que se use el programa y se agreguen peliculas, ya el fichero contendra información que no debe ser borrada
        fichero.seek(0) # Situamos el puntero al inicio para poder agregar nuevas peliculas y que no se sobreescriban las existentes
        try:
            self.peliculas = pickle.load(fichero) # Le pasamos self.peliculas que viene siendo nuestra lista de peliculas y lo igualamos a pickle.load(fichero) para decirle a pickle que lea dicha lista en nuestro fichero.
        except:    
            print("El fichero está vacio")
        finally:
            fichero.close()
            if len(self.peliculas) == 1:
                print("Se ha cargado {} pelicula\n".format(len(self.peliculas)))
            else:
                print("Se han cargado {} peliculas\n".format(len(self.peliculas)))
        
    def agregar(self, p): # Esta función le permitirá al usuario agregar peliculas
        self.peliculas.append(p) # Agrega la pelicula a la lista para que luego esta lista con la función guardar la escriba en el fichero.
        self.guardar() # Llama la función guardar que tiene como función abrir nuevamente el fichero

    def guardar(self):
        fichero = open("catalogo.pckl", "wb") # Al abrir nuevamente el fichero en modo de escritura binaria "wb" guardará borrara los datos anteriores pero escribira nuevamente, los datos anteriores + los nuevos que se hayan agregado.
        fichero.seek(0)                        
        pickle.dump(self.peliculas, fichero)  # pickle.dump() le decimos que escriba todo en el fichero
        fichero.close()                       # y al cerrar acá el fichero guardará los cambios.

    def mostrar(self):
        if len(self.peliculas) == 0:
            print("El catalogo está vacio")
        for p in self.peliculas:
            print(p)
    
    def borrar(self): # Función que se encargará de borrar una pelicula en caso de que ya no esté disponible en el catalogo
        print('¿Cuál pelicula deseas borrar?:\n')
        for i,p in enumerate(self.peliculas):
            i = i+1
            print(i,"{}".format(")"),p.nombre)
        indice = int(input("\nIntroduce el número correspondiente a la pelicula: "))-1 # Al indice le restamos 1 porque en programación los indices comienzan desde 0
        print("\nSe ha borrado la pelicula\n\n{}".format(self.peliculas.pop(indice)))  # entonces al pedirle al usuario que introduzca el número debe mostrarse a partir de 1 y no de 0 cuando el usuario introduzca el 1 en realidad estará introduciendo un 0
        self.guardar()
        
    def alquilar(self,nombre): # Función que se encargará de cambiar el estado Disponible al Estado alquilado de la pelicula
        nombre = input("Introduce el nombre de tu pelicula: ")
        for p in self.peliculas:
            estado = p.estado.split()
            if nombre.upper() == p.nombre:
                if p.estado == "Disponible".upper():
                    p.estado = "Alquilado".upper()
                    print("La pelicula ha sido alquilada satisfactoriamente")
                else:
                    p.estado = "Disponible".upper()
        self.guardar()
        
    def buscar(self, nombre = None): # Función que buscara la pelicula por, nombre, año, director, actor y por coincidencia para cada una de las anteriores
                     # según lo que se escriba al momento de buscar es decir: "La peor noche de mi vida"
                     # si se escribe al momento de buscar"La peor" pues esta busqueda debe mostrar todas las peliculas que lleven esa palabra
                     # Nota importante: Para que esta función haga todas estas busquedas se debe crear un menú que le pregunte al usuario.
        
        if nombre == None:
            print("Debes introducir un nombre para la busqueda")
        elif nombre == "":
            print("Debes introducir un nombre para la busqueda")
        else:
            # Busqueda por nombre de pelicula
            for p in self.peliculas:
                if nombre.upper() == p.nombre or nombre.upper() == p.nombre[:len(nombre)]:
                    print("Resultados de busqueda por titulo de \"{}\":\n\n{}".format(nombre,p))
            
            # Busqueda por director de pelicula
            for p in self.peliculas:
                if nombre.upper() == p.director or nombre.upper() == p.director[:len(nombre)]:
                    print("Resultados de busqueda por director de \"{}\":\n\n{}".format(nombre,p))
        
            # Busqueda por año de la pelicula
            for p in self.peliculas:
                if nombre.upper() == p.año or nombre.upper() == p.año[:len(nombre)]:
                    print("Resultados de busqueda para el año de \"{}\":\n\n{}".format(nombre,p))

            # Busqueda por actor de la pelicula
            for p in self.peliculas: # hacemos un for a la lista de peliculas para poder trabajar con el p.elenco
                elenco = p.elenco.split(", ") # Hago un split a p.elenco(", ") para transformarlo en una lista ya que este se encuentra en cadena de texto y así poder buscar el nombre del actor dentro de ella
                for i in elenco: # hacemos un for dentro del for anterior para poder seguir trabajando con el p.elenco la variable i toma el valor de cada uno de los actores del elenco
                    if nombre.upper() == i or nombre.upper() == i[:len(nombre.upper())]:
                        print("Resultados de busqueda para el actor \"{}\":\n\n{}".format(nombre,p))

            # Busqueda por género de la pelicula
            for p in self.peliculas:
                genero = p.genero.split(" | ")
                for i in genero:
                    if nombre.upper() == i or nombre.upper() == i[:len(nombre.upper())]:
                        print("Resultados de busqueda para el género \"{}\":\n\n{}".format(nombre,p))
                        
            # Al terminar la busqueda se le pregunta al usuario si desea alquilar la pelicula:
            
            print("¿Deseas alquilar o devolver alguna de estas peliculas?:\n1) Si\n2) No")
            opcion = input("")
            if opcion == "1":
                self.alquilar(nombre)
            else:
                print("Saliendo del programa...")
    
c = Catalogo()
#c.agregar(Pelicula("Más notas perfectas 2", "2015", "Después de una actuación humillante en el Lincoln Center, las Barden Bellas se inscriben en una competición internacional de canto a capela que nunca ningún grupo de Estados Unidos ha ganado. De esta manera ellas buscan recuperar su status y su derecho para cantar. Será un gran desafío." ,"Comedia | Música", "Elizabeth Banks", "Anna Kendrick, Rebel Wilson, Hailee Steinfeld, Brittany Snow, Skylar Astin, Adam DeVine, Katey Sagal, Anna Camp, Ben Platt, Alexis Knapp, Hana Mae Lee, Ester Dean, Chrissie Fit, Birgitte Hjort Sørensen, Flula Borg", "Disponible"))
#c.agregar(Pelicula("Mi vida a los 17", "2016", "Cuando Nadine se entera que su mejor amiga Krista comenzó a salir con su hermano mayor, su vida en la escuela se hace más insoportable. Pronto se da cuenta de la importancia de crecer, y lo difícil que es hacerlo.", "Comedia | Drama", "Kelly Fremon Craig", "Hailee Steinfeld, Haley Lu Richardson, Blake Jenner, Kyra Sedgwick, Woody Harrelson, Hayden Szeto, Alexander Calvert, Eric Keenleyside, Nesta Cooper, Daniel Bacon, Lina Renna, Ava Grace Cooper, Christian Michael Cooper, Jena Skodje, Josh Simpson", "Disponible"))
#c.buscar("hailee")
c.mostrar() # Listo
#c.alquilar("más notas perfectas 2") # Listo
# Aquí termina el catalogo