#!/usr/bin/env bash

# Run this script to deploy the app to Github Pages

# Parse cmd arguments

SRC_BRANCH="master"
DEPLOY_BRANCH="gh-pages"

USAGE_MSG="usage: deploy [-h|--help] [-u|--user] [-s|--src SRC_BRANCH] [-d|--deploy DEPLOY_BRANCH] [--verbose] [--no-push]"

while [[ $# > 0 ]]; do
    key="$1"

    case $key in
        -h|--help)
        echo $USAGE_MSG
        exit 0
        ;;
        -u|--user)
        SRC_BRANCH="source"
        DEPLOY_BRANCH="master"
        ;;
        -s|--src)
        SRC_BRANCH="$2"
        shift
        ;;
        -d|--deploy)
        DEPLOY_BRANCH="$2"
        shift
        ;;
        --verbose)
        set -x
        ;;
        --no-push)
        NO_PUSH="--no-push"
        ;;
        *)
        echo "Option $1 is unknown." >&2
        echo $USAGE_MSG >&2
        exit 1
        ;;
    esac
    shift
done

# Exit if any subcommand fails
set -e

echo "Deploying..."
echo "Source branch: $SRC_BRANCH"
echo "Deploy branch: $DEPLOY_BRANCH"

read -r -p "Do you want to proceed? [y/N] " response
if [[ ! $response =~ ^([yY][eE][sS]|[yY])+$ ]]
then
    echo "Aborting."
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
fi

# Check if there are any uncommitted changes
if ! git diff-index --quiet HEAD --; then
    echo "Changes to the following files are uncommitted:"
    git diff-index --name-only HEAD --
    echo "Please commit the changes before proceeding."
    echo "Aborting."
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
fi

# Check if there are any untracked files
if ! test -z "$(git ls-files --exclude-standard --others)"; then
    echo "There are untracked files:"
    git ls-files --exclude-standard --others
    echo "Please commit those files or stash them before proceeding."
    echo "Aborting."
    [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1
fi

# Switch to source branch (creates it if necessary from the current branch)
if [ `git branch | grep $SRC_BRANCH | tr ' ' '\n' | tail -1` ]
then
    git checkout $SRC_BRANCH
else
    git checkout -b $SRC_BRANCH
fi

# Checkout DEPLOY_BRANCH branch
if [ `git branch | grep $DEPLOY_BRANCH` ]
then
  git branch -D $DEPLOY_BRANCH
fi
git checkout -b $DEPLOY_BRANCH

# Export JEKYLL_ENV=production
export JEKYLL_ENV=production

# Build site
bundle exec jekyll build

# Delete and move files
find . -maxdepth 1 ! -name '_site' ! -name '.git' ! -name 'CNAME' ! -name '.gitignore' -exec rm -rf {} \;
mv _site/* .
rm -R _site/

# Create `.nojekyll` file (bypass GitHub Pages Jekyll processing)
touch .nojekyll

# Push to DEPLOY_BRANCH
git add -fA
git commit --allow-empty -m "$(git log -1 --pretty=%B) [ci skip]"
[[ ${NO_PUSH} ]] || git push -f -q origin $DEPLOY_BRANCH

# Move back to SRC_BRANCH
git checkout $SRC_BRANCH

echo "Deployed successfully!"

exit 0
