#!/bin/bash

#############################################
# Documentation des codes d'erreur          #
#############################################
# 1 : DL impossible du fichier de villes    #
# 2 : La saisie du menu n'est pas un nombre #
# 3 : Erreur de syntaxe. Aide affichée      #
#############################################




##############
# Paramètres #
##############

# Nom et chemin de stockage du fichier de villes
citiesFile="/tmp/cities.csv"

# URL du fichier de villes
citiesURL="https://www.data.gouv.fr/fr/datasets/r/51606633-fb13-4820-b795-9a2a575a72f1"


#############
# Fonctions #
#############

# Fonction pour récupérer la liste des villes dans un fichier temporaire
getCities() {
    echo "Téléchargement des données des villes..."
    # le paramètre -q permet de désactiver l'affichage des informations.
    # --show-progress permet d'afficher la barre de progression même avec le -q
    # Cela permet de n'avoir que l'affichage de la barre de progression d'affichée.
    wget -q --show-progress -O ${citiesFile} ${citiesURL}
    return $?
}

# Fonction pour quitter après avoir supprimé les fichiers temporaires utilisés,
# en renvoyant le code de retour transmis en paramètre
quitterProgramme() {
    echo "Nettoyage des fichiers temporaires..."
    rm -f ${citiesFile}
    exit $1
}

# Est-ce un nombre ?
isNumber() {
    [ $1 -eq 1 ] 2> /dev/null
    if [ $? -eq 0 -o $? -eq 1 ]
    then
        # C'est un nombre, on renvoit vrai.
        return 0
    else
        # Ce n'est pas un nombre, on renvoit faux.
        return 1
    fi
}

# Fonction de localisation de la ville
localiserVille() {
    # On efface l'écran pour rendre le résultat plus lisible...
    clear
    
    # On récupère la 4e, la 5e et la 6e colonne avec cut, puis on filtre le résultat avec grep et on l'enregistre dans une variable
    # Et pour avoir en plus le département et la région, on rajoute les colonnes 7 et 10
    localisationVille=$(cut -d, -f4,5,6,7,10 ${citiesFile} | grep -i ^$1,)
    
    # On vérifie si on a un résultat...
    if [ -n "${localisationVille}" ]
    then
        # On utilise à nouveau cut pour afficher les valeurs qui nous intéresse au bon endroit de la phrase dans le résultat précédent.
        # Attention, le nombre de colonnes n'est plus le même que dans le fichier ! On n'a plus que 5 colonnes suite au filtrage précédent !
        echo "Ville : $1"
        echo "Département : $(echo ${localisationVille} | cut -d, -f4)"
        echo "Région :  $(echo ${localisationVille} | cut -d, -f5)"
        echo
        echo "Coordonnées GPS de $1 (Latitude,Longitude) : $(echo ${localisationVille} | cut -d, -f2),$(echo ${localisationVille} | cut -d, -f2)"
        echo "URL pour calculer un trajet jusqu'à cette ville : https://www.google.com/maps/dir//$(echo ${localisationVille} | cut -d, -f2),$(echo ${localisationVille} | cut -d, -f3)"
    else
        echo "Aucune ville trouvée..."
    fi
}

# Lister les villes d'un département
villesCP() {
    # On efface l'écran pour rendre le résultat plus lisible...
    clear
    
    # On récupère la 3e et la 4e colonne avec cut, puis on filtre le résultat avec grep et on l'enregistre dans une variable
    # On met bien des guillemets autour du $() pour conserver les sauts de lignes dans la variable !
    listeVillesCP="$(cut -d, -f3,4 ${citiesFile} | grep ^$1,)"
    
    # On vérifie si on a un résultat...
    if [ -n "${listeVillesCP}" ]
    then
        # On utilise à nouveau cut pour afficher les valeurs qui nous intéresse, comme précédemment :
        echo "Liste des villes pour le code postal $1 :"
        # On boucle avec for sur l'ensemble des résultats :
        # La variable IFS permet de définir les sauts de ligne comme unique délimiteur pour le for (et bien d'autres éléments dans bash)
        IFS=$'\n'
        for ville in $(echo "${listeVillesCP}" | cut -d, -f2)
        do
            echo ${ville}
        done
        # On supprime la variable IFS pour rétablir le comportement normal de bash
        unset IFS
    else
        echo "Aucune ville trouvée..."
    fi
}


# Menu principal
menuPrincipal() {
    # On efface l'écran :
    clear

    # On affiche le menu :
    echo "1) Localiser une ville"
    echo "2) Lister les villes correspondant à un code postal"
    echo "9) Quitter"

    # On demande le choix de l'utilisateur :
    echo "Que souhaitez-vous faire ?"
    read choixAction

    # On vérifie si c'est un nombre ou non et si la saisie est juste
    # La validité de la saisie sera contrôlée avec le case
    if isNumber ${choixAction}
    then
        # On exécute l'action correspondante au choix demandé.
        case ${choixAction} in
            1)
                read -p "Saisissez le nom d'une ville à rechercher : " nomVille
                localiserVille ${nomVille}
                echo 
                read -p "Appuyez sur Entrer pour continuer..."
                menuPrincipal
                ;;
            2)
                read -p "Saisissez un code postal : " cpVille
                villesCP ${cpVille}
                echo 
                read -p "Appuyez sur Entrer pour continuer..."
                menuPrincipal
                ;;
            9)
                quitterProgramme 0
                ;;
            *)
                echo "Choix inexistant."
                quitterProgramme 3
        esac
    else
        echo "Saisie incorrecte. Arrêt du programme".
        quitterProgramme 2
    fi
}


##################
# Code principal #
##################

# On efface l'écran
clear

# On commence par récupérer le fichier de villes. Si ça fonctionne, on exécute le script,
# sinon, on  quitte en indiquant la raison.
if getCities
then
    menuPrincipal
    quitterProgramme 0
else
    erreurWGet=$?
    echo "Erreur : Impossible de télécharger le fichier de villes. Code de retour de WGet : ${erreurWGet}"
    quitterProgramme 1
fi

