#!/usr/bin/env bash
# ref: https://github.com/jekyll/jekyll

set -eu  # Exit on error or unset variable

PAGES_BRANCH="gh-pages"

SITE_DIR="_output"

_backup_dir="$(mktemp -d)"


init() {
  # Check if the script is running in a GitHub Actions environment
  if [[ -z ${GITHUB_ACTION+x} ]]; then
    echo "ERROR: Not allowed to deploy outside of the GitHub Action environment."
    exit 1
  fi
}

build() {
  # clean
  if [[ -d $SITE_DIR ]]; then
    rm -rf "$SITE_DIR"
  fi

  # Run the Ruby script to generate the output
  bundle exec ruby "./scaffold.rb"
}

setup_gh() {
  if [[ -z $(git branch -av | grep "$PAGES_BRANCH") ]]; then
    git checkout -b "$PAGES_BRANCH"
  else
    git checkout "$PAGES_BRANCH"
  fi
}

backup() {
  mv "$SITE_DIR"/* "$_backup_dir"
  mv .git "$_backup_dir"

  if [[ -f CNAME ]]; then
    mv CNAME "$_backup_dir"
  fi
}

flush() {
  rm -rf ./*
  rm -rf .[^.] .??*

  shopt -s dotglob nullglob

  mv "$_backup_dir"/* .
}

deploy() {
  # Configure Git user for the commit
  git config --global user.name "ZhgChgLiBot"
  git config --global user.email "no-reply@zhgchg.li"

  # Reset the current HEAD to prepare for new commits
  git update-ref -d HEAD
  git add -A
  git commit -m "[Automation] Site update No.${GITHUB_RUN_NUMBER}"

  # Push the new branch to the remote repository
  git push -u origin "$PAGES_BRANCH" --force
}

main() {
  init
  build
  setup_gh
  backup
  flush
  deploy
}

# Execute the main function
main