#!/bin/bash

configError() {
    echo "Error: No valid configuration found, exiting"
    notify-send "based-sync" "Error: No valid configuration found, exiting"
    exit 1
}

# check dependencies
for prog in internal-ip rsync nc notify-send; do
    if ! command -v "$prog" > /dev/null 2>&1; then
        echo "$prog is not detected" 1>&2
        notify-send "$prog is not detected"; exit 1
    fi
done

# set dirs
configDir="${XDG_CONFIG_HOME:-$HOME/.config}"
cacheFile="/tmp/norisa/based-sync-cache"

# read config files
[ -f "$HOME/.config/based-sync/dirs" ] || configError
[ -f "$HOME/.config/based-sync/cons" ] || configError
dirs="$(cat "$configDir/based-sync/dirs")"
cons="$(grep -v "$(internal-ip)" < "$configDir/based-sync/cons")"

# reset cachefile safely
[ -d ${cacheFile%/*} ] || mkdir -p ${cacheFile%/*}
if [ -f $cacheFile ]; then
    rm $cacheFile; touch $cacheFile
else
    touch $cacheFile
fi

# check each connection via netcat
for con in $cons; do
    if nc -zv -w 1 "${con/*@}" 22 2>&1 | grep -q "succeeded"; then
        echo "$con ON" | tee $cacheFile
    else
        echo "$con OFF"
    fi
done

sed -i "s/ ON//g" $cacheFile

# exit when no working connection found
[ -s $cacheFile ] || configError

# choose remote on which to sync the dirs to
ip=$(dmenu -i -l 30 < $cacheFile)

# sync dirs via rsync
for dir in $dirs; do
    remoteUser=${ip/@*}
    rsync -uvrP --delete-after -e \
        'ssh -T -c aes128-gcm@openssh.com -o Compression=no' \
        "${dir/\~/$HOME}/" "$ip:${dir/\~/\/home\/$remoteUser}"
done

# success message
echo "Success: File syncing is finished"
notify-send "Success: File syncing is finished"
