#!/bin/bash
#
# The inception.
#

# Parameters
BASENAME="`basename $0`"
DIRNAME="$(cd `dirname $0` &> /dev/null && pwd)"
EXCLUDES="--exclude=local --exclude=stowpkg/tree"

# Make sure we're running git directly and not any existing wrapper
GIT="/usr/bin/git"

# Usage
function inception_usage {
  echo "usage: $BASENAME <action> [options]"
  exit 1
}

# Initialize
function inception_init {
  (
    cd $DIRNAME

    echo "Initializing submodules..."
    $GIT submodule sync          --recursive
    $GIT submodule update --init --recursive

    if [ ! -e "$HOME/.dotfiles" ]; then
      echo "Cloning default dotfiles..."
      ./metadot/metadot clone default
    else
      echo "Updating dotfiles..."
      ./metadot/metadot update
    fi

    #echo "Checking latest tag..."
    #cd $HOME/.dotfiles
    #$DIRNAME/utils-git/git-check-tag

    #echo "Checking out the latest tag..."
    #$DIRNAME/utils-git/git-checkout-tag

    echo "Checking dotfiles..."
    $DIRNAME/metadot/metadot version
  )

  echo ""
  echo "Please manually verify dotfiles version and tag from the above output."
  echo "If everything is fine, proceed running this command again with the 'load' parameter."
}

# Load
function inception_load {
  (
    cd $DIRNAME

    BUNDLE="$2"
    DEPENDENCIES="$3"

    if [ "$BUNDLE" == "--all" ]; then
      echo "Loading all dotfiles..."
      ./metadot/metadot load --all

      if [ "$DEPENDENCIES" == "--deps" ]; then
        ./metadot/metadot deps --all
      fi
    elif [ -z "$BUNDLE" ]; then
      echo "Loading $BUNDLE dotfiles..."
      ./metadot/metadot load-bundle $BUNDLE

      if [ "$DEPENDENCIES" == "--deps" ]; then
        ./metadot/metadot deps-bundle $BUNDLE
      fi
    fi
  )

  echo "Done. Logout and login again to apply all changes."
}

# Install
function inception_install {
  $0 init
  $0 load $*
}

# Deploy
function inception_deploy {
  if [ ! -z "$2" ]; then
    REMOTES="$*"

    for REMOTE in $REMOTES; do
      REMOTE="$2"
      MODULES="`$DIRNAME/metadot/metadot installed | xargs`"

      # Sync apps
      if [ -e "$HOME/apps" ]; then
        rsync -avz --delete $EXCLUDES $HOME/apps/ $REMOTE:apps/
      fi

      # Sync dotfiles
      if [ -e "$HOME/.dotfiles" ]; then
        rsync -avz --delete $HOME/.dotfiles/ $REMOTE:.dotfiles/
      fi

      # Sync loaded modules
      ssh -T $REMOTE <<EOF
      ##### BEGIN REMOTE SCRIPT #####
      for module in $MODULES; do
        \$HOME/apps/metadot/metadot load \$module
      done
      ##### END REMOTE SCRIPT #######
EOF
    done
  fi
}

# Version information
function inception_version {
  echo "master branch:"
  echo "=============="
  echo ""
  ( cd $DIRNAME && $GIT log --show-signature -n 1 )

  echo ""
  echo "origin/master branch:"
  echo "====================="
  echo ""
  ( cd $DIRNAME && $GIT log --show-signature -n 1 --remotes --branches=origin/master )
}

# Fetch
function inception_fetch {
  ( cd $DIRNAME && $GIT fetch --all && $GIT log --show-signature -n 1 --remotes --branches=origin/master )
}

# Merge
function inception_merge {
  (
  cd $DIRNAME && $GIT merge origin/master                 && \
                 $GIT submodule sync          --recursive && \
                 $GIT submodule update --init --recursive
  )
}

# Main
if [ -z "$1" ]; then
  inception_usage
elif [ "$1" == "init" ]; then
  inception_init
elif [ "$1" == "load" ]; then
  inception_load $*
elif [ "$1" == "install" ]; then
  inception_install $*
elif [ "$1" == "deploy" ]; then
  inception_deploy $*
elif [ "$1" == "version" ]; then
  inception_version
elif [ "$1" == "fetch" ]; then
  inception_fetch
elif [ "$1" == "merge" ]; then
  inception_merge
else
  inception_usage
fi