#!/bin/sh

# Default config file
conf_path="/etc/forked-daapd.conf"

usage() {
  echo
  echo "Interactive script pair Remote with forked-daapd"
  echo
  echo "Usage: ${0##*/} -h | [ <config-file> ]"
  echo
  echo "Parameters:"
  echo "  -h           Show this help"
  echo " <config-file> Config file (default: $conf_path)"
  echo
  echo "NOTE: forked-daapd needs to be running..."
  exit 0
}

case $1 in
  -h|--help) usage;;
  -*)
    echo "Unrecognized option $1 (try -h for usage)"
    exit 1
    ;;
esac

[ -n "$1" ] && conf_path=$1

if [ ! -f "$conf_path" ]; then
  echo "Couldn't find config file '$conf_path' (try -h for usage)"
  exit 1
fi

logfile=`awk '$1=="logfile"{print $3}' $conf_path`
logfile="${logfile%\"}"
logfile="${logfile#\"}"
[ -z "$logfile" ] && logfile="/var/log/forked-daapd.log"
if [ ! -r "$logfile" ]; then
  echo "Error: Couldn't read logfile '$logfile'"
  echo "Verify 'logfile' setting in config file '$conf_path'"
  exit 1
fi

library_path=`awk '$1=="directories"{print}' $conf_path`
library_path="${library_path#*\"}"
library_path="${library_path%%\"*}"
if [ -z "$library_path" ]; then
  echo "Couldn't find 'directories' setting in config file '$conf_path'"
  exit 1
fi
if [ ! -d "$library_path" ]; then
  echo "Error: Couldn't find library '$library_path'"
  echo "Verify 'directories' setting in config file '$conf_path'"
  exit 1
fi

rf="$library_path/pair.remote"
[ -f "$rf" ] && rm -f "$rf"
[ -f "$rf" ] && echo "Unable to remove existing pairing file '$rf'" && exit 1

echo "This script will help you pair Remote with forked-daapd"
echo "Please verify that these paths are correct:"
echo "  Log file: '$logfile'"
echo "  Library:  '$library_path'"
read -p "Confirm? [Y/n] " yn
case "$yn" in
  [N]*|[n]*) exit;;
esac

echo "Please start the pairing process in Remote by selecting Add library"
read -p "Press ENTER when ready..." yn
printf %s "Looking in $logfile for Remote announcement..."

n=5
while [ $n -gt 0 ]; do
  n=`expr $n - 1`
  remote=`tail -50 "$logfile" | grep "Discovered remote" | tail -1 | grep -o "'.*' ("`
  remote="${remote%\'\ \(}"
  remote="${remote#\'}"
  [ -n "$remote" ] && break
  sleep 2
done

if [ -z "$remote" ]; then
  echo "not found!"
  exit 1
fi
echo "found"

read -p "Ready to pair Remote '$remote', please enter PIN: " pin
if [ -z "$pin" ]; then
  echo "Error: Invalid PIN"
  exit 1
fi

echo "Writing pair.remote to $library_path..."
printf "$pin" > "$rf"
if [ ! -f "$rf" ]; then
  echo "Unable to create '$rf' - check directory permissions"
  exit 1
fi

# leave enough time for deferred file processing on BSD
n=20
echo "Waiting for pairing to complete (up to $n secs)..."
while [ $n -gt 0 ]; do
  n=`expr $n - 1`
  result=`tail -1000 "$logfile" | sed -n "/.*remote:/ s,.*remote: ,,p" | awk '/^Discovered remote/{ f="" } /^Kickoff pairing with pin/ { f=$0; } END { print f }'`
  [ -n "$result" ] && break
  sleep 1
done
if [ -z "$result" ]; then
  echo "forked-daap doesn't appear to be finding $rf..."
  echo "Check $logfile, removing pair.remote"
  rm "$rf"
  exit 1
fi
echo "Pairing file pair.remote read, removing it"
rm "$rf"

n=5
while [ $n -gt 0 ]; do
  n=`expr $n - 1`
  result=`tail -1000 "$logfile" | sed -n "/.*remote:/ s,.*remote: ,,p" | awk '/^Discovered remote/{ f="" } /^Pairing succeeded/ { f=$0; } END { print f }'`
  if [ -n "$result" ]; then
    echo "All done"
    exit
  fi
  sleep 1
done
echo "Pairing appears to have failed... check $rf for details"
exit 1