#!/usr/bin/env bash
source "$PLUGIN_CORE_AVAILABLE_PATH/common/property-functions"
source "$PLUGIN_AVAILABLE_PATH/git/functions"
source "$PLUGIN_AVAILABLE_PATH/git/internal-functions"
set -eo pipefail
[[ $DOKKU_TRACE ]] && set -x

trigger-git-git-from-directory() {
  declare desc="updates a repository from a directory"
  declare trigger="git-from-directory"
  declare APP="$1" SOURCECODE_WORK_DIR="$2" USER_NAME="${3:-Dokku}" USER_EMAIL="${4:-automated@dokku.sh}"

  local APP_ROOT="$DOKKU_ROOT/$APP"
  local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")"
  local REV
  local TMP_WORK_DIR=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
  local TMP_WORK_DIR_2=$(mktemp -d "/tmp/dokku-${DOKKU_PID}-${FUNCNAME[0]}.XXXXXX")
  trap "rm -rf '$TMP_WORK_DIR' '$TMP_WORK_DIR_2' >/dev/null" RETURN INT TERM EXIT

  local has_code=true
  local git_objects="$(fn-git-cmd "$APP_ROOT" count-objects 2>/dev/null || true)"
  if [[ -z "$git_objects" ]] || [[ "$git_objects" == "0 objects, 0 kilobytes" ]]; then
    local has_code=false
  fi

  dokku_log_info1 "Updating git repository with specified build context"
  if [[ "$has_code" == "false" ]]; then
    # setup new repo
    local DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")"
    cp -rT "$SOURCECODE_WORK_DIR" "$TMP_WORK_DIR"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" init
    suppress_output fn-git-cmd "$TMP_WORK_DIR" checkout -b "$DEPLOY_BRANCH"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" config init.defaultBranch "$DEPLOY_BRANCH"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" config user.name "$USER_NAME"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" config user.email "$USER_EMAIL"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" add --all
    suppress_output fn-git-cmd "$TMP_WORK_DIR" commit -m "Initial commit"

    REV="$(fn-git-cmd "$TMP_WORK_DIR" rev-parse HEAD)"
    fn-git-create-hook "$APP"
    fn-git-clone "$APP" "$TMP_WORK_DIR" "$DEPLOY_BRANCH"
  else
    # update existing repo
    GIT_TERMINAL_PROMPT=0 suppress_output git clone "$APP_ROOT" "$TMP_WORK_DIR_2"
    cp -rT "$SOURCECODE_WORK_DIR" "$TMP_WORK_DIR"
    mv "$TMP_WORK_DIR_2/.git" "$TMP_WORK_DIR/.git"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" config user.name "$USER_NAME"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" config user.email "$USER_EMAIL"
    suppress_output fn-git-cmd "$TMP_WORK_DIR" add --all
    suppress_output fn-git-cmd "$TMP_WORK_DIR" update-index --refresh
    if suppress_output fn-git-cmd "$TMP_WORK_DIR" diff-index --quiet HEAD --; then
      dokku_log_warn "No changes detected, skipping git commit"
      dokku_log_warn "Call 'ps:rebuild' on app to rebuild the app from existing source"
      return 1
    fi

    suppress_output fn-git-cmd "$TMP_WORK_DIR" commit -m "Automated commit @ $(date +%s)"

    REV="$(fn-git-cmd "$TMP_WORK_DIR" rev-parse HEAD)"
    fn-git-fetch "$APP" "$TMP_WORK_DIR" "$REV"
  fi

  rm -rf "$TMP_WORK_DIR" "$TMP_WORK_DIR_2" >/dev/null
  if git_receive_app "$APP" "$REV"; then
    return
  else
    local exit_code=$?
    local DOKKU_DEPLOY_BRANCH="$(fn-git-deploy-branch "$APP")"
    if [[ "$has_code" == "false" ]]; then
      fn-git-cmd "$APP_ROOT" update-ref -d HEAD
    else
      fn-git-cmd "$APP_ROOT" update-ref "refs/heads/$DOKKU_DEPLOY_BRANCH" "$DOKKU_DEPLOY_BRANCH^"
    fi
    return "$exit_code"
  fi
}

trigger-git-git-from-directory "$@"
