#!/usr/bin/env bash
# reset environment variables that could interfere with normal usage
unset -v GREP_OPTIONS
# put all utility functions here

# make a temporary file
git_extra_mktemp() {
    mktemp -t "$(basename "$0")".XXXXXXX
}

git_extra_default_branch() {
    local extras_default_branch init_default_branch
    extras_default_branch=$(git config --get git-extras.default-branch)
    init_default_branch=$(git config --get init.defaultBranch)
    if [ -n "$extras_default_branch" ]; then
        echo "$extras_default_branch"
    elif [ -n "$init_default_branch" ]; then
        echo "$init_default_branch"
    else
        echo "main"
    fi
}
#
# check whether current directory is inside a git repository
#

is_git_repo() {
  git rev-parse --show-toplevel > /dev/null 2>&1
  result=$?
  if test $result != 0; then
    >&2 echo 'Not a git repo!'
    exit $result
  fi
}

is_git_repo
# Based on https://gist.github.com/gnarf/5406589 and https://gist.github.com/jhnns/d654d9d6da6d3b749986
TO_MERGE=

pull() {
  local remote="$1"
  local id="$2"
  local branch="$3"
  local ref="refs/pull/$id/head"

  if [ -n "$TO_MERGE" ]; then
    ref="refs/pull/$id/merge"
  fi

  git fetch -fu "$remote" "$ref:$branch" && \
  git checkout "$branch" && \
  git config --local --replace "branch.$branch.merge" "$ref" && \
  git config --local --replace "branch.$branch.remote" "$remote"
}

pull_pr_if_matched() {
  if [[ $1 =~ ^(.*):([0-9]+)|(https?://[^/]+/.+)/pull/([0-9]+).*$ ]]; then
    if [[ -n ${BASH_REMATCH[2]} ]]; then
        remote="${BASH_REMATCH[1]:-origin}"
        id="${BASH_REMATCH[2]}"
    else
        remote="${BASH_REMATCH[3]}.git"
        id="${BASH_REMATCH[4]}"
    fi

    branch=pr/$id
    pull "$remote" "$id" "$branch"
    return $?
  fi

  echo "$1 doesn't match the pr id pattern."
  return 1
}

for arg in "$@"; do
    case "$arg" in
        -m|--merge)
            TO_MERGE=1
            ;;
        *)
            # set the argument back
            set -- "$@" "$arg"
            ;;
    esac

    shift
done

test -z "$1" && echo "pr number required." 1>&2 && exit 1

if test "$1" = "clean"; then
  git for-each-ref refs/heads/pr/* --format='%(refname)' | while read -r ref; do
    git branch -D "${ref#refs/heads/}"
  done

elif [[ "$1" =~ ^[0-9]+$ ]]; then
  remote_pref=${2:-$(git config --get git-extras.pr.remote)}
  remote=${remote_pref:-origin}
  id=$1
  branch=pr/$id
  pull "$remote" "$id" "$branch"

else
  rc=1
  while [ "$1" != "" ]; do
    pull_pr_if_matched "$1"
    rc=$?
    shift
  done

  exit "$rc"
fi
