#!/bin/bash

# unrm--Searches the deleted files archive for the specified file or
#   directory. If there is more than one matching result, it shows a list 
#   of results ordered by timestamp and lets the user specify 
#   which one to restore.

archivedir="$HOME/.deleted-files"
realrm="$(which rm)"
move="$(which mv)"

dest=$(pwd)

if [ ! -d $archivedir ] ; then
  echo "$0: No deleted files directory: nothing to unrm" >&2 ; exit 1
fi

cd $archivedir

# If given no arguments, just show a listing of the deleted files
if [ $# -eq 0 ] ; then
  echo "Contents of your deleted files archive (sorted by date):"
  ls -FC | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{5\}//g' \
    -e 's/^/  /' 
  exit 0
fi

# Otherwise, we must have a user-specified pattern to work with. 
#   Let's see if the pattern matches more than one file or directory
#   in the archive.

matches="$(ls -d *"$1" 2> /dev/null | wc -l)"

if [ $matches -eq 0 ] ; then
  echo "No match for \"$1\" in the deleted file archive." >&2
  exit 1
fi

if [ $matches -gt 1 ] ; then
  echo "More than one file or directory match in the archive:"
  index=1
  for name in $(ls -td *"$1")
  do
    datetime="$(echo $name | cut -c1-14| \
      awk -F. '{ print $5"/"$4" at "$3":"$2":"$1 }')"
    filename="$(echo $name | cut -c16-)"
    if [ -d $name ] ; then
     filecount="$(ls $name | wc -l | sed 's/[^[:digit:]]//g')"
      echo " $index)   $filename  (contents = ${filecount} items," \ 
           " deleted = $datetime)"
    else
      size="$(ls -sdk1 $name | awk '{print $1}')"
      echo " $index)   $filename  (size = ${size}Kb, deleted = $datetime)"
    fi
    index=$(( $index + 1))
  done
  echo ""
  echo -n "Which version of $1 do you want to restore ('0' to quit)? [1] : "
  read desired
  if [ ! -z “$(echo $desired | sed 's/[[:digit:]]//g')” ] ; then
    echo “$0: Restore canceled by user: invalid input.” >&2
    exit 1
  fi

  if [ ${desired:=1} -ge $index ] ; then
    echo "$0: Restore canceled by user: index value too big." >&2
    exit 1
  fi

  if [ $desired -lt 1 ] ; then
    echo "$0: restore canceled by user." >&2 ; exit 1
  fi

  restore="$(ls -td1 *"$1" | sed -n "${desired}p")"
  
  if [ -e "$dest/$1" ] ; then
    echo "\"$1\" already exists in this directory. Cannot overwrite." >&2
    exit 1
  fi

  echo -n "Restoring file \"$1\" ..."
  $move "$restore" "$dest/$1"
  echo "done."

  echo -n "Delete the additional copies of this file? [y] " 
  read answer
  
  if [ ${answer:=y} = "y" ] ; then
    $realrm -rf *"$1"
    echo "deleted."
  else
    echo "additional copies retained."
  fi
else
  if [ -e "$dest/$1" ] ; then
    echo "\"$1\" already exists in this directory. Cannot overwrite." >&2
    exit 1
  fi

  restore="$(ls -d *"$1")"

  echo -n "Restoring file \"$1\" ... " 
  $move "$restore" "$dest/$1"
  echo "done."
fi

exit 0
