# Scrivere il corpo delle funzioni aprifile e contaparole.
# La funzione aprifile prende in ingresso una stringa
# che contiene il nome di un file. La funzione restituisce
# il wrapper del file aperto in modalità lettura.
# Se l'operazione non va a buon fine, gestire l'errore
# facendo restituire None. 
# La funzione contaparole prende in ingresso due argomenti:
# il primo è un wrapper al file, il secondo è una stringa.
# Si suppone che la stringa passata sia composta da una parola.
# La funzione deve contare quante volte la parola data
# è presente nel file, indifferentemente che sia maiuscola
# o minuscola, e restituire questo valore.
# Gestire il caso in cui il primo argomento non è un
# file wrapper valido scrivendo a video la stringa "Errore I/O"
# e restituendo -1
# I test vengono eseguiti usando due file.
# Il primo è questo file (il nome è
# contenuto nella variabile globale __file__).
# Il secondo è un file vuoto creato dal test appositamente.
# Esempio: se il file "titolo1" contiene il testo
# "Il mare e il cielo"
# la funzione contaparole(aprifile("titolo1"),"il") restituisce 2.

# Opzionale: per rimuovere i caratteri di punteggiatura
# da una stringa si può usare il metodo translate che
# utilizza il metodo di maketrans della classe str e
# la variabile punctuation della libreria string che contiene
# tutti i caratteri di punteggiatura.
# Esempio di utilizzo:
# stringa = "a, asd ."
# senzaPunteggiatura = stringa.translate(str.maketrans('', '', string.punctuation))
# --> 'a asd '


# Per eseguire i test e togliere la punteggiatura
# utilizzo alcuni elementi di queste due librerie
import string
import _io


# Prima funzione
def aprifile(nomefile):
    #Provo ad aprire il file
    try:
        mioWrapper = open(nomefile,"r", encoding="utf-8")
    except:
        # Se l'apertura del file non riesce
        # allora restituisce Mone
        return None
    #se tutto va a buon fine restituisce il wrapper
    return mioWrapper



# Seconda funzione
def contaparole(fileWrapper, parola):
    # creo una stringa vuota che useremo per copiare
    # il testo scritto sul file
    contenuto = ""
    #provo a utilizzare il wrapper
    try:
        # mi sposto all'inizio del file
        fileWrapper.seek(0)
        # per ogni linea...
        for line in fileWrapper:
            # copio il contenuto della linea
            # (senza il carattere di fine linea)
            # nella stringa creata prima
            contenuto += line[:-1]
    except:
        # Se l'utilizzo del wrapper non va a buon fine
        # stampa a video il messaggio di errore
        print("ERRORE I/O")
        #e restituisce -1 (come richiesto nel testo)
        return -1
    # rimuovo i segni di punteggiatura usando la funzione
    # suggerita nel testo
    contenuto = contenuto.translate(str.maketrans('', '', string.punctuation))
    # Ora divido la stringa in tante parole.
    # Split senza argomenti divide la stringa
    # dove trova il carattere " " (spazio)
    parole = contenuto.split()
    # parole è una lista. Posso contare le occorrenze
    # di un dato valore usando il metodo count.
    # quindi restituisco il valore del count eseguito
    # sulla lista di parole con argomento la parola
    # cercata
    return parole.count(parola)


#Prova
#print(contaparole(aprifile(__file__),"il"))

#TEST: non modificare questa parte
if type(aprifile(__file__)) == _io.TextIOWrapper:
    print("Test 1: OK")
else:
    print("Test 1: NON SUPERATO")

if aprifile("nomeNonEsistente"):
    print("Test 2: NON SUPERATO")
else:
    print("Test 2: OK")

if contaparole(aprifile(__file__),"è") > 0:
    print ("Test 3: OK")
else: print ("Test 3: NON SUPERATO")

if contaparole(aprifile(__file__)," ") == 0:
    print ("Test 4: OK")
else: print ("Test 4: NON SUPERATO")

if contaparole(aprifile("sadsdas")," ")==-1:
    print("Test 5: OK")
else:
    print("Test 5: NON SUPERATO")

with open("test","w") as emptyFile:
    pass
if contaparole(aprifile("test"),"prova") == 0:
    print ("Test 6: OK")
else: print ("Test 6: NON SUPERATO")
