# Lezione 18 - Esercizio 3
# Scrivere un programma Python che apre e legge una lista di nomi di studenti
# da un ﬁle di testo, dove ogni riga contiene il nome di uno studente. Il programma
# deve dividere la lista di studenti letta dal ﬁle in due gruppi: una per la prima
# metà degli studenti e una per la seconda metà degli studenti. Stampare i due gruppi.
import random

def leggi_studenti(file_path: str) -> list[str]:
    """
    Legge i nomi degli studenti da un file di testo.

    :param file_path: percorso del file con la lista di nomi degli studenti
    :return: la lista dei nomi degli studenti
    """
    studenti = []
    with open(file_path, 'r') as file:
        for riga in file:
            studenti.append(riga.strip())
        # studenti = [riga.strip() for riga in file]  # List comprehension
    # Equivalenti a:
    # file = open(file_path, 'r')
    # righe_file = file.readlines()  # ["Giovanni ", " Giampiero", "Franco ", " Giuseppe"]
    # for riga in righe_file:
    #     studenti.append(riga.strip())  # ["Giovanni", "Giampiero", "Franco", "Giuseppe"]
    # file.close()
    
    random.shuffle(studenti)
    return studenti

def dividi_gruppi(studenti: list[str]) -> tuple[list[str], list[str]]:
    """
    Divide la lsita degli studenti in due gruppi (1o gruppo 1a metà, 2o gruppo 2a metà).

    :param studenti: la lista degli studenti
    :return: tupla con i due gruppi
    """
    metà = len(studenti) // 2
    gruppo1 = studenti[:metà]
    gruppo2 = studenti[metà:]
    return gruppo1, gruppo2

def main() -> None:
    """
    Programma principale.
    """
    file_path = "studenti.txt"
    studenti = leggi_studenti(file_path)

    if not studenti:
        print("Il file non contiene studenti")
        return
    
    primo_gruppo, secondo_gruppo = dividi_gruppi(studenti)

    print("Gruppo 1:")
    stampa_lista_in_modo_bello(primo_gruppo)

    print("Gruppo 2:")
    stampa_lista_in_modo_bello(secondo_gruppo)

def stampa_lista_in_modo_bello(lista: list) -> None:
    for elemento in lista:
        print(f" - {elemento}")

if __name__ == "__main__":
    main()