﻿#!/bin/bash
# guiguishow.info - licence : GPL v3 (https://www.gnu.org/licenses/gpl-3.0.html)

# git, jq and moreutils packages are required!


# User editable variables
gitRep=https://github.com/telegeography/www.submarinecablemap.com.git

outputDir=$(dirname `readlink -f $0`)
cablesFile="${outputDir}/cables.json"
landingsFile="${outputDir}/landings.json"
summaryFile="${outputDir}/summary.txt"

summaryHeader="[[https://www.submarinecablemap.com/|Original work]] (on Google Maps).
[[https://www2.telegeography.com/submarine-cable-faqs-frequently-asked-questions|Original Frequently Asked Questions]].

**Last update**: $(date '+%F').

**Cables**:\n"

# Inutile. Ces options peuvent aussi être configurées sur le calque et être héritées
# popupShape = Panel  => afficher description dans panneau latéral quand clic sur câble ou icône
# iconClass  = Circle => les icônes sont des cercles (plus petits que réglage par défaut)
#umapCablesParam="\"_umap_options\": {
#  \"popupShape\": \"Panel\",
#  \"opacity\": \"1\"
#}"
#umapLandingsParam="\"_umap_options\": {
#  \"iconClass\": \"Circle\",
#  \"popupShape\": \"Panel\"
#}"
# End of user editable variables


# Internal / temporary variables
tmpDir=$(mktemp -d)

cablesDir="${tmpDir}/public/api/v2/cable/"
cablesListTmp="${tmpDir}/cablesList.tmp"

landingsDir="${tmpDir}/public/api/v2/landing-point/"
landingsListTmp="${tmpDir}/landingsList.tmp"
# End of internal variables


# Fallback function
final_clean () {
  echo -e "\nRemoving temporary workdir ${tmpDir}…"
  rm -rf --preserve-root "$tmpDir"
}

set -e
trap ">&2 echo -e ' ERROR! UNEXPECTED END!' && final_clean ; exit 1" ERR


# main()
# command -v and type fail if alias
if ! hash git jq 2>/dev/null
then
  >&2 echo 'ERROR: git or jq command not found!'
  false # trap ;)
fi


# On récupère la matière première
echo -n 'Retrieving datas from remote git repo…'
git clone -q "$gitRep" "$tmpDir"

cablesDir="${tmpDir}/public/api/v2/cable/"
mv "${cablesDir}/cable-geo.json" "$cablesListTmp"
mv "${landingsDir}/landing-point-geo.json" "$landingsListTmp"


# On traite les câbles
echo -ne '\n\nWorking on cables: '

nbCables=$(jq '.features | length' "$cablesListTmp")
for ((i=0; i < nbCables; i++))
do
  printf "%03d/%03d…\b\b\b\b\b\b\b\b" $((i + 1)) $nbCables

  # On identifie le fichier de définition de ce câble
  cableDefineFile="${cablesDir}/"$(jq -r ".features[$i].properties.slug" "$cablesListTmp").json

  # On récupère, à l'aide de son slug, le nom du câble dans son fichier de définition
  cableName=$(jq -r '.name' "$cableDefineFile")

  # On récupère les caractéristiques du câble (date de mise en service, longueur, proprios, etc.) dans son fichier de définition sauf si pas remplies (= null)
  # On formate pour umap
  description=$(sed "s/’/'/" "$cableDefineFile" | jq -r '"**Ready For Service**: \(.rfs)\n**Cable Length**: \(.length)\n**Owners**:\n * \(.owners | gsub(", ";"\n *"))\n**URL**: \(.url)\n**Notes**: \(.notes)"' | grep -v null)

  # On récupère les stations d'atterrissement par lesquelles passe ce câble (sed remplace la virgule entre les coordonnées latitude/longitude)
  # On formate pour umap (lien vers les coordonnées géo de chaque station)
  landings=$(jq -r '.landing_points[] | " * [[#12/\(.latlon)|\(.name)]]"' "$cableDefineFile" | sed 's#,#/#')

  # Dans le fichier des câbles, on modifie la définition du câble :
  #  * On ajoute son nom ;
  #  * Ses caractéristiques techniques + stations d'atterrissement ;
  #  * On ajoute des propriétés compréhensibles par umap : couleur (qu'il faut préfixer par « # ») + voir $umapCablesParam ;
  #  * On supprime les informations inutilisables par umap : ancien attribut stockant la couleur, slug.
  jq ".features[$i].properties += { \"name\": \"${cableName}\"} \
    | .features[$i].properties += { \"description\": \"${description}\n\n**Landing Points**:\n${landings}\"} \
    | .features[$i].properties += { ${umapCablesParam} } \
    | .features[$i].properties._umap_options += { \"color\": \"#\(.features[$i].properties.color)\"  } \
    | del(.features[$i].properties.color) \
    | del(.features[$i].properties.slug)" "$cablesListTmp" | sponge "$cablesListTmp"
done

mv "$cablesListTmp" "$cablesFile"


# On traite les stations d'atterrissement
echo -ne '\n\nWorking on landings: '

nbLandings=$(jq '.features | length' "$landingsListTmp")
for ((i=0; i < nbLandings; i++))
do
  printf "%04d/%04d…\b\b\b\b\b\b\b\b\b\b" $((i + 1)) $nbLandings

  # Identification
  landingDefineFile="${landingsDir}/"$(jq -r ".features[$i].properties.slug" "$landingsListTmp").json

  # On récupère le nom des câbles qui passent par cette station d'atterrissement
  cablesName=$(jq -r '" * \(.cables[].name)"' "$landingDefineFile")

  # Dans le fichier des stations d'atterrissement, on modifie la définition de la station :
  #  * On ajoute la liste des câbles qui passent par cette station en description + formatage umap ;
  #  * On ajoute des propriétés compréhensibles par umap : voir $umapLandingsParam ;
  #  * On supprime les informations inutilisables par umap : slug, id.
  jq ".features[$i].properties += { \"description\": \"**Cables:**\n${cablesName}\"} \
    | .features[$i].properties += { ${umapLandingsParam} } \
    | del(.features[$i].properties.slug) \
    | del(.features[$i].properties.id)" "$landingsListTmp" | sponge "$landingsListTmp"
done

mv "$landingsListTmp" "$landingsFile"


# On récupère la liste de tous les câbles pour la description de la carte
echo -e '\n\nRetrieving cables name list…'
echo -ne "$summaryHeader" > "$summaryFile"
jq -r '" * \(.features[].properties.name)"' "$cablesFile" >> "$summaryFile"


final_clean


echo -e "\nEnd. Files to use with OSM: ${cablesFile} and ${landingsFile} . Cable list for map summary: ${summaryFile} ."
exit 0
