#!/bin/bash

# Ansi color code variables
expand_bg="\e[K"
blue_bg="\e[0;44m${expand_bg}"
red_bg="\e[0;41m${expand_bg}"
green_bg="\e[0;42m${expand_bg}"
red="\e[0;31m"
blue="\e[0;34m"
green="\e[0;32m"
cyan="\e[0;36m"
yellow="\e[0;33m"
white="\e[0;37m"
magenta="\e[0;35m"
bold="\e[1m"
uline="\e[4m"
reset="\e[0m"

top_menu() {
  clear
	echo -e ${blue}"         ========================================================="
	echo -e "         =     VERIFICATION des données GPS dans les images      ="
	echo -e "         ========================================================="${reset}  
}


press_enter() {
  echo ""
  echo -n -e "${green}	Appuyer sur Entrée pour continuer ${reset}"
  read
  clear
}

nettoyage() {
if [ -f "liste_fichiers_GPS.txt" ]; then rm liste_fichiers_GPS.txt ; fi
if [ -f "liste_fichiers_incomplets.txt" ]; then rm liste_fichiers_incomplets.txt ; fi
if [ -f "lfi_display.txt" ]; then rm lfi_display.txt ; fi
if [ -f "liste_fichiers_noGPS.txt" ]; then rm liste_fichiers_noGPS.txt ; fi
if [ -f "liste_fichiers_noGPS_1.txt" ]; then rm liste_fichiers_noGPS_1.txt ; fi
if [ -f "liste.csv" ]; then rm liste.csv ; fi
if [ -f "lfi_sorted.txt" ]; then rm lfi_sorted.txt ; fi
if [ -f "lfino_sorted.txt" ]; then rm lfino_sorted.txt ; fi
}

creation_liste() {
nogps=0
nbreimages=0
# on crée le fichier csv à partir de la liste des images
clear
echo ""
top_menu
echo ""
echo -e "                    ${green}${bold}  \033[5m>>> Opération en cours <<<\033[0m  ${reset}"
echo -e ""
echo -e "                       ${green}${bold}  Merci de patienter...  ${reset}"
exiftool -ext jpg -ext png -r -csv -filename -GPS:GPSLatitude -GPS:GPSLongitude "$dossier" >> liste.csv
# on vérifie que le fichier n'est pas vide, sinon pas d'images à traiter
if [ -s liste.csv ] ; then
	calcul
else
	clear
	top_menu
	echo ""
	echo -e "     ${red}Aucun fichier image de trouvé ! :("
	echo -e "     Si le chemin comporte des espaces, mettez-le entre guillements."${reset}
	echo ""
	echo -e "     ${white}Exemple d'utilisation :"
	echo -e '     GPS-EXIFTOOL.sh "/Edata/Mes Images/2012/Pornichet/"'${reset}
	echo -e '     ou pour le répertoire courant :'
	echo -e '     GPS-EXIFTOOL.sh .'${reset}
	echo ""
fi
}

calcul() {
# pour faciliter le traitement du fichier liste.csv (pb de file separator)	
# on utilise la technique de  "Bash process substition" et une boucle while/do/done
# la ligne done reçoit en entrée la liste des fichiers à traiter
# puis on lit les champs du fichier csv pour décompte des données GPS
while IFS="," read -r source filename latitude longitude
do
  nbreimages=$((nbreimages+1))
  if [ -z "$latitude" ] || [ -z "$longitude" ] ; then
	nogps=$((nogps+1))
	echo "$filename" >> liste_fichiers_noGPS.txt
  else
	echo "$filename" >> liste_fichiers_GPS.txt
  fi
# on supprime la première ligne du fichier liste.csv (les headers de colonnes)
done < <(tail -n +2 ./liste.csv)
# on compte les images avec données GPS
fichiersGPS=$(cat liste_fichiers_GPS.txt | wc -l)
# on retire liste.csv du ficher des images sans données GPS
sed '/liste.csv/d' liste_fichiers_noGPS.txt > liste_fichiers_noGPS_1.txt
# on classe les listes de fichiers
sort liste_fichiers_noGPS_1.txt > lfino_sorted.txt 
sort liste_fichiers_GPS.txt > lfi_sorted.txt 
# on calcule les pourcentages
prcent_gps=$(bc <<< "scale=2;$fichiersGPS*100/$nbreimages")
prcent_cor=$(bc <<< "scale=2;$nogps*100/$nbreimages")
menu_result
}

menu_result() {
	clear
# exiftool a ajouté le fichier liste.csv à sa liste, on fait donc -1 sur le total d'images et les "nogps"
nbreimages=$((nbreimages-1))
nogps=$((nogps-1))
	echo ""
	top_menu
	echo ""
	echo -e "         ${yellow}Dossier analysé :  ""$dossier"" ${reset}"
	echo ""
	echo -e "         - ${white}Nombre total de photos = " "$nbreimages"${reset}
	if [ $fichiersGPS -eq 0 ] ; then
	echo -e "         - Nombre total de tags GPS = " ${red}"$fichiersGPS"${reset}
	else
	echo -e "         - Nombre total de tags GPS = " ${cyan}"$fichiersGPS" "(soit" "$prcent_gps""%)"${reset}
	fi
	if [ $nogps -eq 0 ] ; then
	echo -e "         - Nombre total de données GPS absentes = " ${green}"$nogps"${reset}
	else
	echo -e "         - Nombre total de données GPS absentes = " ${red}"$nogps"  "(soit" "$prcent_cor""%)"${reset} 
	echo ""
	echo -e ${blue}"         Que voulez-vous faire ?"${reset}
	echo ""
	echo "         1  -  Sauvegarder la liste des fichiers avec et sans données GPS"
    echo "         0  -  Quitter"
    echo""
    echo -n "  Entrer votre sélection: "
    read selection
    case $selection in
    1 ) menu_liste_fichiers ;;
    0 ) echo "" ; nettoyage ; exit ;;
    * ) clear ; incorrect_selection ; press_enter ; menu_result ;; 
   esac 
	fi
}

menu_liste_fichiers() {
	cp lfino_sorted.txt ~/liste_fichiers_sans_données_GPS.txt
	cp lfi_sorted.txt ~/liste_fichiers_avec_données_GPS.txt
	echo ""
	echo -e ${white}"     Les fichiers :"
	echo -e  ${yellow}"     - liste_fichiers_avec_données_GPS.txt"
	echo -e  ${yellow}"     - liste_fichiers_sans_données_GPS.txt"
	echo -e  ${white}"     ont été sauvegardé dans votre répertoire Home."${reset}
	echo ""
	nettoyage
	exit
}


incorrect_selection() {
  echo -e "               ${red}************************************************"
  echo -e "               * Sélection incorrecte ! Veuillez recommencer. *"
  echo -e "               ************************************************${reset}"  
}


#################
# début du script
#################

# On teste d'abord les dépendances
if ! command -v exiftool &> /dev/null
then
	top_menu
	echo ""
    echo -e ${red}"          Vous devez installer ${bold}exiftool${red} pour utiliser ce script."
    echo ""
    echo -e ${green} "         La commande est : ${white}sudo apt install exiftool"
    echo ""
    echo ""
    exit
fi

if ! command -v bc &> /dev/null
then
	top_menu
	echo ""
    echo -e ${red}"          Vous devez installer ${bold}bc (Basic Calculator)${red} pour utiliser ce script."
    echo ""
    echo -e ${green} "         La commande est : ${white}sudo apt install bc"
    echo ""
    echo ""
    exit
fi


# Pius on teste le répertoire $1
if [ -z "$1" ] ; then
	clear
	top_menu
	echo ""
	echo -e ${red}"     Aucun répertoire indiqué ! :("
	echo -e "     Si le chemin comporte des espaces, mettez-le entre guillements."${reset}
	echo ""
	echo -e ${white}"     Exemple d'utilisation :"
	echo -e ${green}'     $ GPS-in-EXif.sh "/Edata/Mes Images/2012/Pornichet/"'
	echo -e ${white}"     ou"
	echo -e ${green}"     $ GPS-in-EXif.sh ."${reset}
	echo ""
	exit
else
# on transforme le relative path en full path
	dossier=$(readlink -f "$1")
	creation_liste
fi

# on crée la liste des fichiers à analyser
#find "$1" -type f \( -name '*.JPG' -o -name "*.jpg" -o -name "*.png" \)  > liste_images.txt 


