# Lezione 18 - Esercizio 2
# Si suppone di avere un'applicazione che consente agli utenti di registrare
# nuove specie biologiche nel nostro database. Ogni specie ha un nome e alcune
# caratteristiche associate. Scrivere un programma Python che permetta agli utenti
# di inserire il nome di una nuova specie e le sue caratteristiche, e salvarli
# in un dizionario. Scrivere ogni specie e valore associato in un file txt.

# Suggerimento: iterare sugli elementi da scrivere e ricordarsi di inserire il
# carattere “\n” per andare a capo!

def leggi_database(percorso_file: str) -> dict[str, int]:
    """
    Legge il file e memorizza le informazioni in esso contenute in un dizionario.

    :param percorso_file: Il percorso del file da leggere
    :return: Il dizionario con il nome della specie come chiave e caratteristica come valore
    """
    database = {}
    file = open(percorso_file, 'r')
    righe = file.readlines()  # righe = ["Lupo 100", "Orca 800", "Elefante 300"]
    file.close()
    for riga in righe:
        elementi_nella_riga = riga.split(" ")  # elementi_nella_riga = ["Lupo", "100"]
        specie = elementi_nella_riga[0]
        caratteristica = elementi_nella_riga[1]
        # specie, caratteristica = riga.split(" ")  # riga.split(" ") = ["Lupo", "100"]
        database[specie] = int(caratteristica)
    
    return database

def aggiungi_specie(specie: str, caratteristica: int, file_path: str) -> dict[str, int]:
    """
    Permette agli utenti di aggiungere una nuova specie e la corrispondente caratteristica al database.

    :param specie: la nuova specie da inserire
    :param caratteristica: la caratteristica della nuova specie
    :param file_path: percorso del file dove salvare la nuova specie
    """
    database = leggi_database(file_path)

    # database = {"Lupo": 100, ...}

    if specie.capitalize() in database:
        print("Specie già presente.")
    else:
        database[specie] = caratteristica
        # database = {"Lupo": 100, ..., "Biero": 1000}
        file = open(file_path, 'w')
        for specie, caratteristica in database.items(): # it. 1 -> specie = "Lupo", caratteristica = 100
                                                        # it. 2 -> specie = "Orca", caratteristica = 800
                                                        # ...
                                                        # it. 4 -> specie = "Biero", caratteristica = 1000
            file.write(f"{specie.capitalize()} {caratteristica}\n")  # it. 1 -> Lupo 100 (scritto in una riga del file)
                                                                     # it. 2 -> Orca 800 (============================)
                                                                     # ...
                                                                     # it. 4 -> Biero 1000 (scritto ....)
        # Con l'append sarebbe stato più semplice:
        # file = open(file_path, 'a')
        # file.write(f"{specie.capitalize()} {caratteristica}\n")
        file.close()
        print("Specie aggiunta con successo")
    
    return database

def menu(database: dict[str, int], file_path: str) -> None:
    """
    Fornisce un menu all'utente per interagire con il database biologico.

    :param database: il database biologico
    :param file_path: il percorso del file dove si trova il database
    """
    while True:
        print("\nMenu:")
        print("1. Visualizza tutte le specie e le caratteristiche")
        print("2. Ottieni il valore di caratteristica per una specie")
        print("3. Aggiungi una nuova specie")
        print("4. Esci")

        scelta = input("Inserisci la tua scelta: ")

        if scelta == '1':
            stampa_dizionario_in_modo_bello(database)
        elif scelta == '2':
            specie = input("Inserisci il nome della specie di cui visualizzare il valore di Caratteristica1: ").strip()
            if specie.capitalize() in database:
                print(f"La caratteristica di {specie} è: {database[specie.capitalize()]}")
            else:
                print("Specie non trovata nel database")
        elif scelta == '3':
            nuova_specie = input("Inserisci il nome della specie da aggiungere: ").strip()
            nuova_caratteristica = int(input("Inserisci la corrispondente nuova caratteristica: "))
            database = aggiungi_specie(nuova_specie, nuova_caratteristica, file_path)
        elif scelta == '4':
            print("Ciao ciao")
            break
        else:
            print("Scelta non valida. Riprova")

def stampa_dizionario_in_modo_bello(dizionario: dict) -> None:
    """
    Funzione che stampa un dizionario come una lista puntata

    :param dizionario: il dizionario da stampare
    """
    for chiave, valore in dizionario.items():
        print(f" - {chiave}: {valore}")

def main() -> None:
    """
    Programma principale.
    """
    percorso_database = "database_biologico.txt"
    database = leggi_database(percorso_database)

    if database:
        menu(database, percorso_database)
    else:
        print("C'è stato un errore nella lettura del file, oppure il file è vuoto.")

if __name__ == "__main__":
    main()