#!/bin/bash
#
# metadot: a dotfile management system
#

# Parameters
OPT="$1"
DATE="`date +%Y%m%d%I%M%S`"
BASENAME="`basename $0`"
DOT="$HOME/.dotfiles"
MODULES="$DOT/modules"
BACKUPS="$HOME/.backups/$DATE"

# Backup a file
function metadot_backup {
  local file="$HOME/$1"
  
  if [ -e "$file" ] || [ -h "$file" ]; then
    local folder="$BACKUPS/`dirname $1`"

    #echo "Backing up `basename $1`..."
    mkdir -p $folder
    mv $file $folder
  fi
}

# Find contents of a module
function metadot_find {
  local module="$1"
  ( cd $MODULES/$module && find -name '*.link' -or -name '*.dot.link' ) | sed -e 's|./||'
}

# Load a module
function metadot_load {
  local module="$1"
  local destname
  local dirname

  if [ -d "$MODULES/$module" ]; then

    echo "Loading module $module..."

    for file in `metadot_find $module`; do
      echo "Processing $file..."

      # Get the dirname, replacing string.dot with .string
      dirname="`echo $file | sed -e 's|\([^/]*\).dot/|.\1/|g'`"
      dirname="`dirname $dirname`"

      if echo $file | grep -q '.dot.link'; then
        destname=".`basename $file .dot.link`"
      else
        destname="`basename $file .link`"
      fi

      if [ "$dirname" != "." ]; then
        #echo "Creating $HOME/$dirname..."
        mkdir -p $HOME/$dirname
      else
        dirname=""
      fi

      metadot_backup "$dirname/$destname"

      #echo "Installing symlink $dirname/$destname..."
      ln -s $MODULES/$module/$file $HOME/$dirname/$destname

    done
  else
    echo "No such module $module"
  fi
}

# Parsing.
if [ -z "$OPT" ]; then
  echo "usage: $BASENAME <option> [arguments]"
  exit 1
elif [ "$OPT" == "ls" ]; then
  ls -1 $MODULES
elif [ "$OPT" == "update" ]; then
  ( cd $DOT && git pull origin master && git submodule update --init )
elif [ "$OPT" == "backup" ]; then
  shift
  metadot_backup $1
elif [ "$OPT" == "load" ]; then
  shift

  if [ -z "$1" ]; then
    echo "usage: $BASENAME load [module(s)|--all]"
  fi

  if [ "$1" == "--all" ]; then
    modules="`ls $MODULES`"
  else
    modules="$*"
  fi

  for module in $modules; do
    metadot_load $module
  done
  echo "Backups saved at $BACKUPS."
fi