# Lezione 7 - Esercizione
# Creare un sistema per gestire le prenotazioni aeree per una compagnia aerea.
#
# 1. Il programma inizia chiedendo all'utente se vuole effettuare una nuova prenotazione o
#    modificare/cancellare una prenotazione esistente.
#    Risposte ammesse: "nuova", "modifica", "cancella". Risposte diverse causano la terminazione del
#    programma con un messaggio di errore.
#
# 2. Se l'utente sceglie "nuova":
#    - Chiedere la destinazione (es: "Roma", "Milano", "New York").
#    - Chiedere la classe di viaggio ("economica", "business", "prima classe").
#    - Chiedere se desidera aggiungere extra come "bagaglio extra" o "pasto speciale". Rispondere
#      con "sì" o "no".
#    - Calcolare il prezzo base del biglietto: 200€ per economica, 500€ per business, 1000€ per
#      prima classe.
#    - Aggiungere costi aggiuntivi se necessario: 50€ per bagaglio extra, 30€ per pasto speciale.
#    - Stampare il costo totale del biglietto.
#
# 3. Se l'utente sceglie "modifica":
#    - Chiedere il numero di prenotazione.
#    - Verificare che il numero di prenotazione esista (le prenotazioni esistenti sono indicate nel
#      database sottostante). Se non esiste, stampare un messaggio di errore e terminare.
#    - Chiedere quale aspetto della prenotazione desidera modificare ("destinazione", "classe",
#      "extra").
#    - Permettere all'utente di inserire il nuovo valore per l'opzione scelta e stampare un 
#      messaggio di conferma della modifica.
#
# 4. Se l'utente sceglie "cancella":
#    - Chiedere il numero di prenotazione.
#    - Verificare che il numero di prenotazione esista (vedi database sottostante).
#    - Se esiste, confermare la cancellazione e terminare il programma. Se non esiste, stampare un
#      messaggio di errore.
#    - Nota: ovviamente in questo esercizio non è possibile cancellare le prenotazioni, dal momento
#      che i dati sono fissi nel database. Quindi è sufficiente verificare che la prenotazione
#      esista e stampare un messaggio di conferma di cancellazione.
#
# Note e consigli:
# - Risolvere l'esercizio in modo generale, senza utilizzare i dati specifici delle prenotazioni, che
#   sono forniti solo a titolo di esempio.
# - Assicurarsi che tutti gli input siano validati adeguatamente.
# - Utilizzare if-elif-else annidati per gestire le varie opzioni e sotto-opzioni.
# - Commentare il codice per chiarire la logica e le decisioni di progettazione.
# - Mantenere una struttura chiara e leggibile, nonostante la complessità delle operazioni richieste.

# DATABASE:
# - Prenotazione 1:
numero_prenotazione_1 = 1001
destinazione_1 = "New York"
classe_1 = "economica"
extra_bagaglio_1 = "sì"
extra_pasto_1 = "no"

# - Prenotazione 2:
numero_prenotazione_2 = 1002
destinazione_2 = "Tokyo"
classe_2 = "prima classe"
extra_bagaglio_2 = "no"
extra_pasto_2 = "sì"

# Soluzione:
operazione = input("Vuoi effettuare una nuova prenotazione, modificarne una esistente o cancellarne una? (nuova/modifica/cancella): ")

# Opzioni ammesse: operazione == "nuova", operazione == "modifica" e operazione == "cancella". Tutto
# il resto non va bene.
if operazione == "nuova":
    destinazione = input("Inserisci la destinazione del volo: ")
    classe = input("Inserisci la classe di viaggio (economica/business/prima classe): ")
    extra_bagaglio = input("Desideri aggiungere un bagaglio extra? (sì/no): ")
    extra_pasto = input("Desideri aggiungere un pasto speciale? (sì/no): ")

    PREZZO_CLASSE_ECONOMICA = 200
    PREZZO_CLASSE_BUSINESS = 500
    PREZZO_PRIMA_CLASSE = 1000
    PREZZO_EXTRA_BAGAGLIO = 50
    PREZZO_EXTRA_PASTO = 30

    # Opzioni NON ammesse: tutto ciò che non è economica/business/prima classe
    # Se classe != "economica" e classe != "business" e classe != "prima classe" -> errore
    # In tutti gli altri casi, la classe va bene e possiamo fare i nostri calcoli
    if classe != "economica" and classe != "business" and classe != "prima classe":
        print("Classe di viaggio non valida.")
        # exit(0) - Non serve perché a prescindere, il codice dopo non viene eseguito.
    else:
        costo = 0

        # Calcolo del prezzo base del biglietto in base alla classe di viaggio scelta
        if classe == "economica":
            costo = PREZZO_CLASSE_ECONOMICA
        elif classe == "business":
            costo = PREZZO_CLASSE_BUSINESS
        else:  # Non serve scrivere elif classe == "business", perché se arriviamo a questo else,
               # allora classe è PER FORZA uguale a "prima classe", grazie alla condizione che
               # abbiamo scritto prima nell'if (sopra)
            costo = PREZZO_PRIMA_CLASSE
        
        # Calcolo del nuovo prezzo del biglietto in base alla scelta dell'extra bagaglio dell'utente
        if extra_bagaglio == "sì":
            costo += PREZZO_EXTRA_BAGAGLIO  # Equivalente a: costo = costo + PREZZO_EXTRA_BAGAGLIO
        elif extra_bagaglio == "no":
            print("Il bagaglio extra non è stato aggiunto, come richiesto.")
        else:
            print("Il bagaglio extra non è stato aggiunto perché la risposta non è valida.")

        # Calcolo del nuovo prezzo del biglietto in base alla scelta del pasto speciale dell'utente
        if extra_pasto == "sì":
            costo += PREZZO_EXTRA_PASTO
        elif extra_pasto == "no":
            print("Il pasto speciale non è stato aggiunto, come richiesto.")
        else:
            print("Il pasto speciale non è stato aggiunto perché la risposta non è valida.")

        print(f"Il prezzo totale del biglietto per {destinazione} in classe {classe} è di {costo}€.")
elif operazione == "modifica":
    numero_prenotazione = int(input("Inserisci il numero di prenotazione del volo che vuoi modificare: "))

    # Verifichiamo se il numero di prenotazione scelto dall'utente è un numero di prenotazione che esiste
    if numero_prenotazione == numero_prenotazione_1:
        aspetto_da_modificare = input("Cosa desideri modificare? (destinazione/classe/extra): ")

        # Verifichiamo che l'aspetto da modificare scelto dall'utente sia un aspetto da modificare consentito
        if aspetto_da_modificare == "destinazione":
            # Se l'utente vuole modificare la destinazione, chiediamo la nuova destinazione e la inseriamo nella variabile apposita
            destinazione_1 = input("Inserisci la nuova destinazione: ")
            print(f"La destinazione è stata modificata in: {destinazione_1}")
        elif aspetto_da_modificare == "classe":
            # Se l'utente vuole modificare la classe, chiediamo la nuova classe, verifichiamo che sia consentita e, se lo è, la modifichiamo
            classe_modificata = input("Inserisci la nuova classe di viaggio (economica/business/prima classe): ")

            if classe_modificata != "economica" and classe_modificata != "business" and classe_modificata != "prima classe":
                print("La classe scelta da modificare non è valida.")
            else:
                classe_1 = classe_modificata  # Assegnare una variabile (classe_modificata) a un'altra variabile (classe_1),
                                              # significa inserire in classe_1 il valore che contiene classe_modificata.
                print(f"La classe di viaggio è stata modificata in: {classe_1}")
        elif aspetto_da_modificare == "extra":
            # Se l'utente vuole modificare gli extra, gli chiediamo se vuole modificare la preferenza
            # per ognuno di essi, e in base alla sua risposta, modifichiamo le variabili apposite.
            modifica_extra_bagaglio = input(f"Qual è la tua nuova preferenza (attualmente: {extra_bagaglio_1}) per il bagaglio extra? (sì/no): ")

            if modifica_extra_bagaglio == "sì" or modifica_extra_bagaglio == "no":
                extra_bagaglio_1 = modifica_extra_bagaglio
            else:
                print(f"La risposta scelta non va bene. La preferenza per l'extra bagaglio non è stata modificata ed è rimasta: {extra_bagaglio_1}.")

            modifica_extra_pasto = input(f"Qual è la tua nuova preferenza (attualmente: {extra_pasto_1}) per il pasto extra? (sì/no): ")

            if modifica_extra_pasto == "sì" or modifica_extra_pasto == "no":
                extra_pasto_1 = modifica_extra_pasto
            else:
                print(f"La risposta scelta non va bene. La preferenza per l'extra pasto non è stata modificata ed è rimasta: {extra_pasto_1}.")

            print(f"Gli extra sono stati modificati. Ora sono:\nBagaglio extra: {extra_bagaglio_1}\nPasto speciale: {extra_pasto_1}")
        else:
            print("L'aspetto da modificare scelto non è valido. Nessuna modifica effettuata.")
    elif numero_prenotazione == numero_prenotazione_2:
        aspetto_da_modificare = input("Cosa desideri modificare? (destinazione/classe/extra): ")

        # Verifichiamo che l'aspetto da modificare scelto dall'utente sia un aspetto da modificare consentito
        if aspetto_da_modificare == "destinazione":
            # Se l'utente vuole modificare la destinazione, chiediamo la nuova destinazione e la inseriamo nella variabile apposita
            destinazione_2 = input("Inserisci la nuova destinazione: ")
            print(f"La destinazione è stata modificata in: {destinazione_2}")
        elif aspetto_da_modificare == "classe":
            # Se l'utente vuole modificare la classe, chiediamo la nuova classe, verifichiamo che sia consentita e, se lo è, la modifichiamo
            classe_modificata = input("Inserisci la nuova classe di viaggio (economica/business/prima classe): ")

            if classe_modificata != "economica" and classe_modificata != "business" and classe_modificata != "prima classe":
                print("La classe scelta da modificare non è valida.")
            else:
                classe_2 = classe_modificata  # Assegnare una variabile (classe_modificata) a un'altra variabile (classe_2),
                                              # significa inserire in classe_2 il valore che contiene classe_modificata.
                print(f"La classe di viaggio è stata modificata in: {classe_2}")
        elif aspetto_da_modificare == "extra":
            # Se l'utente vuole modificare gli extra, gli chiediamo se vuole modificare la preferenza
            # per ognuno di essi, e in base alla sua risposta, modifichiamo le variabili apposite.
            modifica_extra_bagaglio = input(f"Qual è la tua nuova preferenza (attualmente: {extra_bagaglio_2}) per il bagaglio extra? (sì/no): ")

            if modifica_extra_bagaglio == "sì" or modifica_extra_bagaglio == "no":
                extra_bagaglio_2 = modifica_extra_bagaglio
            else:
                print(f"La risposta scelta non va bene. La preferenza per l'extra bagaglio non è stata modificata ed è rimasta: {extra_bagaglio_2}.")

            modifica_extra_pasto = input(f"Qual è la tua nuova preferenza (attualmente: {extra_pasto_2}) per il pasto extra? (sì/no): ")

            if modifica_extra_pasto == "sì" or modifica_extra_pasto == "no":
                extra_pasto_2 = modifica_extra_pasto
            else:
                print(f"La risposta scelta non va bene. La preferenza per l'extra pasto non è stata modificata ed è rimasta: {extra_pasto_2}.")

            print(f"Gli extra sono stati modificati. Ora sono:\nBagaglio extra: {extra_bagaglio_2}\nPasto speciale: {extra_pasto_2}")
        else:
            print("L'aspetto da modificare scelto non è valido. Nessuna modifica effettuata.")
    else:
        print("Errore: Il numero di prenotazione inserito non è tra le prenotazioni esistenti.")
elif operazione == "cancella":
    numero_prenotazione = int(input("Inserisci il numero di prenotazione da eliminare: "))

    if numero_prenotazione == numero_prenotazione_1:
        print(f"Prenotazione {numero_prenotazione_1} cancellata.")
    elif numero_prenotazione == numero_prenotazione_2:
        print(f"Prenotazione {numero_prenotazione_2} cancellata.")
    else:
        print("Numero di prenotazione non valido.")
else:
    print("L'operazione scelta non è valida.")