#!/usr/bin/env nix-shell
#!nix-shell -i bash -p bash -p rsync -p sane-scripts.sync-from-iphone -p sane-scripts.sync-music

usage() {
  echo "sync [flags ...] [<host> [<host> ...]] [passthrough flags ...]"
  echo "where:"
  echo "  host: all|desko|lappy|moby"
  echo "  - defaults to 'all' if omitted"
  exit 1
}

debug() {
  if [ -n "$SYNC_DEBUG" ]; then
    echo "$@"
  fi
}

ifExists() {
  local path="$1"
  shift
  local cmd="$@"
  if test -d "$path"; then
    debug "${cmd[@]}"
    ${cmd[@]}
  else
    debug "skipping action because $path doesn't exist"
  fi
}

homeMountFor() {
  local want=$1
  local me=$(hostname)
  if [ "$want" = "$me" ]; then
    echo "$HOME"
  else
    echo "/mnt/$want/home"
  fi
}

sync_pkm() {
  local host=$1
  local me=$(hostname)
  ssh "$host" "set -eux; remote=$me; "'cd ~/knowledge; old=$(git rev-parse --abbrev-ref HEAD); [ "$old" = master ]; st=$(git stash create); git reset --hard HEAD; git branch -D sync || true; git checkout -b sync; git fetch $remote master && git rebase $remote/master && (if [ -n "$st" ]; then git stash apply "$st"; fi) && git branch --move --force master || (git --reset-hard HEAD; git checkout "$old"; (if [ -n "$st" ]; then git stash apply "$st"; fi); false)'
}

sync_music() {
  local host=$1
  shift
  local deskoHome=$(homeMountFor desko)
  local lappyHome=$(homeMountFor lappy)
  local mobyHome=$(homeMountFor moby)
  case $host in
    (desko)
      ifExists /mnt/servo/media/Music/Various.Artists \
        sane-sync-music --compat /mnt/servo/media/Music "$deskoHome/Music" "$@"
      ;;
    (lappy)
      ifExists /mnt/servo/media/Music/Various.Artists \
        sane-sync-music --compress --compat /mnt/servo/media/Music "$lappyHome/Music" "${syncFlags[@]}"
      ;;
    (moby)
      ifExists /mnt/servo/media/Music/Various.Artists \
        sane-sync-music --compat /mnt/servo/media/Music "$mobyHome/Music" "${syncFlags[@]}"
      ;;
    (*)
      ;;
  esac
}

sync_books() {
  local host="$1"
  local deskoHome=$(homeMountFor desko)
  local lappyHome=$(homeMountFor lappy)
  local mobyHome=$(homeMountFor moby)
  case $host in
    (moby)
      ifExists /mnt/servo/media/Books/Audiobooks \
        rsync -arv --delete /mnt/servo/media/Books/Audiobooks/ "$mobyHome/Books/Audiobooks/"
      # copy books from servo to moby; delete old/untracked ones, but keep KOreader state files (sdr)
      ifExists /mnt/servo/media/Books/Books \
        rsync -arv --delete --exclude '*.sdr' /mnt/servo/media/Books/Books/ "$mobyHome/Books/Books/"
      # TODO: recover servo Books/Visual collection, and then re-enable syncing
      # ifExists /mnt/servo/media/Books/Visual \
      #   rsync -arv --delete --exclude '*.sdr' /mnt/servo/media/Books/Books/ "$mobyHome/Books/Visual/"
      ;;
    (*)
      ;;
  esac
}

sync_photos() {
  local host=$1
  local deskoHome=$(homeMountFor desko)
  local lappyHome=$(homeMountFor lappy)
  local mobyHome=$(homeMountFor moby)
  case $host in
    (desko)
      sane-sync-from-iphone
      ;;
    (moby)
      # copy photos/screenshots from moby to desko:
      rsync -arv --exclude servo-macros "$mobyHome/Pictures/" "$deskoHome/Pictures/from/moby/"
      ;;
    (*)
      ;;
  esac
}

hosts=()
targets=()
passthruArgs=()
parseArgs() {
  while [[ $# -ge 1 ]]; do
    local arg=$1
    case $arg in
      (desko|lappy|moby)
        hosts+=("$arg")
        shift
        ;;
      (all)
        hosts+=(desko lappy moby)
        shift
        ;;
      (pkm|music|books|photos)
        targets+=("$arg")
        shift
        ;;
      (--verbose)
        if [[ "${#hosts[@]}" -eq 0 ]]; then
          SYNC_DEBUG=1
          shift
        else
          # it's a passthru flag
          break
        fi
        ;;
      (--help)
        usage
        shift
        ;;
      (*)
        break
        ;;
    esac
  done

  passthruArgs+=("$@")

  if [[ ${#hosts[@]} -eq 0 ]]; then
    hosts+=(desko lappy moby)
  fi

  if [[ ${#targets[@]} -eq 0 ]]; then
    targets+=(pkm music photos books)
  fi
}

parseArgs "$@"
debug "hosts:" "${hosts[@]}"
debug "targets:" "${targets[@]}"
for target in "${targets[@]}"; do
  for host in "${hosts[@]}"; do
    sync_"$target" "$host" "${passthruArgs[@]}"
  done
done
