import sqlite3, os, argv

class db_work:
    def __init__(self,db_file = str ) -> None:
        self.db_file = db_file
        self.script_folder = os.path.dirname(os.path.realpath(__file__))

    def create_db(self):
        if not os.path.exists(self.db_file):
            with sqlite3.connect(self.db_file) as con_db:
                cursor = con_db.cursor()
                sql_code =  """
                            CREATE TABLE IF NOT EXISTS movies(
                                'id' INTEGER PRIMARY KEY AUTOINCREMENT,
                                'name' TEXT,
                                'filmgenres' TEXT,
                                'year' TEXT,
                                'format',
                                'persönlich' TEXT
                                ); """
                cursor.execute(sql_code)
            
                sql_code =  """
                            CREATE TABLE IF NOT EXISTS filmgenres(
                            'genre' TEXT PRIMARY KEY,
                            'beschreibung' TEXT                        
                            ); """
                cursor.execute(sql_code)
            
                sql_code = """
INSERT INTO filmgenres(genre, beschreibung) 
                      VALUES 
                      ( 'horror', 'ist ein Genre der spekulativen Fiktion, das verängstigen, erschrecken oder verekeln soll.Oft kann die zentrale Bedrohung eines Werkes des Horrors als Metapher für größere Ängste einer Gesellschaft interpretiert werden.'),
                      ( 'action', 'Der Actionfilm (von engl. action: Tat, Handlung, Bewegung) ist ein Filmgenre des Unterhaltungskinos, in welchem der Fortgang der äußeren Handlung von zumeist spektakulär inszenierten Kampf- und Gewaltszenen vorangetrieben und illustriert wird. Es geht eher um stimulierende Aktionen als um inhaltliche Zusammenhänge, empathisches Miterleben der Gefühlswelt der Protagonisten oder künstlerisch-ästhetische Bildwelten. Hauptbestandteile von Actionfilmen sind daher meist aufwendig gedrehte Stunts, Nahkampf-Szenen, Schießereien, Explosionen und Verfolgungsjagden. '),
                      ( 'science-fiction', 'Die Darstellung spekuliert mit wissenschaftlichen Fakten und Vorausdeutungen auf zukünftig Mögliches.'),
                      ( 'drama', 'Das Drama ist nach antiker Definition eine Gattung der Dichtung und bezeichnet eine Handlung mit verteilten Rollen. ');
                      """
                cursor.execute(sql_code)
                con_db.commit()
            return "db create"
        else:
            return "db exists"

    def add_value_db(self):
        with sqlite3.connect(self.db_file) as con_db:
            cursor = con_db.cursor()
            while True:
                ##Abfrage Name

                name = input("Name des Films: ")
                if not name:
                    break
                ##Abfrage Genre

                while True:
                    movie_genre = input("Genre: ")
                    sql = """Select * from filmgenres where genre = '{genre}'""".format(genre=movie_genre)
                    cursor.execute(sql)
                    if cursor.fetchone():
                        print("Genre existiert!")
                        break
                    else:
                        print("Genre existiert nicht gib es bitte nochmal ein :")
                        sql = """Select genre from filmgenres"""
                        print("Folgende Genres sind angelegt :")
                        self.ausgabe_abfrage(sql_abfrage="""Select genre from filmgenres""")
                  
                #Abfrage Jahr
                while True:      
                    movie_year = input("Jahr: ")
                    if len(str(movie_year)) == 4 and movie_year.isdigit() is True:
                        break
                    else:
                        print("Das Jahr muss 4 Zeichen haben und aus Zahlen bestehen.")

                #Abfrage Format
                while True: 
                    format = input("Format :")
                    if format == "blue-ray" or format == "dvd" or format == "platte" or format == "sd":
                        break
                    else:
                        print("blue-ray", "dvd", "platte", "sd")
                #Abfrage Meinung
                per_info = input("Meinung : ").lower()

                sql = """Select * from movies WHERE name = '{name}';""".format(name=name)
                cursor.execute(sql)
                if not cursor.fetchone():
                    print("Film wird angelgt ")
                    self.speicher_aktion(movie=name, filmgenre=movie_genre, year=movie_year, persönlich=per_info, format=format)
                else:
                    print("Film bereits vorhanden !")
        print("Eingabevorgang wurde beendet.")
    
    def speicher_aktion(self, movie = str, filmgenre = str, year = str, persönlich = str, format = str):
        with sqlite3.connect(self.db_file) as verbindung:
            cursor = verbindung.cursor()
            sql = """INSERT INTO movies(name, filmgenres, year, format, 'persönlich' ) 
                      VALUES ( '{movie}', '{filmgenre}', '{year}', '{format}','{persönlich}' );""".format(
                          movie=movie, 
                          filmgenre=filmgenre,
                          year=year,
                          format = format,
                          persönlich=persönlich)
            
            cursor.execute(sql)
        
    def ausgabe_abfrage(self, sql_abfrage):
        with sqlite3.connect(self.db_file) as daten:
            try:
                zeiger = daten.cursor()
                zeiger.execute(sql_abfrage)
                for datensatz in zeiger:
                    for wert in datensatz:
                        wert = str(wert)
                        print('| ', wert, " " * (9 - len(wert)), end="")
                    print("|")
            except sqlite3.OperationalError:
                    print("Tabelle nicht gefunden!")
            except:
                    print("Daten konnten nicht bearbeitet werden!")
        
if __name__ == "__main__":
    script_folder = os.path.dirname(os.path.realpath(__file__))
    db_file_full = script_folder + os.sep + "my_moviedb.db"
    my_db = db_work(db_file=db_file_full)
    print(my_db.create_db())

    for query in  argv.sys.argv[1:]:
        if query == '-q':
            if argv.argv_value('-q') is None:
                my_db.ausgabe_abfrage(sql_abfrage="""SELECT * FROM movies;""")
            else:
                my_db.ausgabe_abfrage(sql_abfrage="""Select * from movies WHERE name like '%{search}%';""".format(search=argv.argv_value('-q')))
        if query == '-a':
            my_db.add_value_db()

    
    #my_db.create_db()
    #add_value_to_db = my_db.add_value_db()
    #print (add_value_to_db)