# Soluzione Esercitazione 11 dicembre

# In questo programma useremo le librerie per manipolare file
# di dati serializzati nei formati JSON e CSV.
# Per utilizzare le librerie usiamo la keyword import

import csv
import json

# La prima funzionalità richiesta è la lettura e la memorizzazione
# dei dati contenuti nei due file.

# Il file csv si può aprire con il costrutto with open e successivamente
# Per leggere i dati del csv utilizo la funzione reader della libreria

with open('presenze.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    datiCSV = list(reader) # converto il reader in una lista.
#datiCSV è ora una lista di liste.


# Ora apro il file json e copio tutto il contenuto in una unica stringa.
# successivamente utilizzo la funione loads della libreria json
# per trasformare la stringa in dati python.

with open('spese_medie.json') as jsonFile:
    myjsonData = "" # stringa inizialmente vuota che ospiterà i dati
    for i in jsonFile:
        myjsonData += i #aggiungo la riga i del file alla stringa
    datiJson = json.loads(myjsonData) # trasformo la stringa formato json in dati
# datiJson è ora una lista di dizionari.

# Verifico i dati raccolti
print(datiCSV)
print(datiJson)

# Ora implementiamo la prima funzione.
# Questa funzione ha un argomento che chiamiamo regione.
# il valore di regione verrà passato alla funzione nel momento in
# cui verrà utilizzata.
# La funzione esamina gli elementi di datiCSV per trovare le liste
# che hanno il valore dell'elemento "provenienza" (ovvero con indice 4)
# uguale al nome di regione passato alla funzione (contenuto nel
# parametro regione)
def presenzeDaRegione(regione):
    totale=0
    for riga in datiCSV: #per ogni elemento di datiCSV
        if riga[4] == regione: # se all'indice 4 la lista contiene una stringa
                               # uguale a quella contentua nel parametro "regione"
            totale += int(riga[6]) # incrementa il totale del valore di
                               # presenze contenuto all'indice 6 e trasformato
                               # in intero
    return totale # restituisci il valore della variabile "totale"


# la funzione calcoloSpesa ha come argomento una stringa
# uguale al nome di una regione. La funzione deve restituire
# il prodotto tra la spesa media per quella regione e il
# numero di presenze dei turisti provenienti da quella regione.
# La spesa media è da prelevare dal dato json.

# La variabile datijson ha due chiavi per ogni dizionario.
# queste sono "REGIONE" e "SPESA_MEDIA".
def calcoloSpesa(regione):
    spesaMedia=0
    for r in datiJson: # per ogni elemento dei datiJson (sono dizionari)
        if r['REGIONE'] == regione: # verifica se il valore dell'elemento
                                    # con chiave "REGIONE" è uguale al valore
                                    # di regione
            spesaMedia=r['SPESA_MEDIA'] # e preleva il valore della spesa media

    # Ora calcoliamo la spesa totale come numero di presenze moltiplicato
    # per la spesa media. Il numero di presenze lo otteniamo dalla funzione
    # precendente.
    spesaTotale=spesaMedia*presenzeDaRegione(regione)
    # Infine creiamo il dizionario richiesto e lo  restituiamo.
    spesa={'REGIONE':regione,"SPESA_TOTALE":spesaTotale}
    return spesa

# Verifichiamo il funzionamento.
print(presenzeDaRegione("Lazio"))
print(calcoloSpesa("Lazio"))

# Ora, per ogni regione dentro il JSON si deve calcolare la spesa con la funzione
# calcoloSpesa e tutti i risultati vanno aggiunti ad una lista inizialmente vuota.

elaborazione = []
for r in datiJson:
    nomeRegione = r['REGIONE']
    elaborazione += [calcoloSpesa(nomeRegione)]

# Infine salviamo la lista così ottenuta in un formato json.
# Per farlo creaiamo  la stringa da scrivere sul file usando
# la funzione dumps.
# Poi creaiamo un file usando il costrutto
# with open in modalità write e usiamo il metodo write
# del wrapper per scrivere sul file.
stringaJson=json.dumps(elaborazione,indent=4)
with open("risultato.json","w") as risultatoJson:
    risultatoJson.write(stringaJson)
