#!/usr/bin/env bash
PROGRAM=$0
PRIMARY_BRANCH=""
SECONDARY_BRANCH=""
FF="--ff"
CONTINUE="no"

function current_branch() {
    git rev-parse --abbrev-ref HEAD
}

function usage()
{
    echo "USAGE: ${PROGRAM} PRIMARY_BRANCH [SECONDARY_BRANCH] [--no-ff]"
    echo "USAGE: ${PROGRAM} --continue"
    echo ""
    echo "OPTIONS:"
    echo "  --no-ff:			Force rebase commit."
    echo "  -c|--continue:		Continue after the user updates conflicts."
}

while [[ $# > 0 ]]
do
  key="$1"
  
  case $key in
      --no-ff)
      FF="--no-ff"
      ;;
      -c|--continue)
      CONTINUE=yes
      ;;
      *)
      if [[ "$PRIMARY_BRANCH" == "" ]]; then
          PRIMARY_BRANCH=$key
      elif [[ "$SECONDARY_BRANCH" == "" ]]; then
          SECONDARY_BRANCH=$key
      else
          usage
          exit 20  # Error during arguments parsing
      fi
      ;;
  esac
  shift  # past argument or value
done

if [[ "$SECONDARY_BRANCH" == "" ]]; then
    SECONDARY_BRANCH=$(current_branch)
fi

if [[ "$CONTINUE" == "yes" ]]; then
    TARGET_BRANCH=$(current_branch)
    set $(echo "$TARGET_BRANCH" | sed -e "s/-rebased-on-top-of-/\n/g")
    if [[ $# != 2 ]]; then
        echo "Couldn't continue rebasing on ${TARGET_BRANCH}"
        exit 30  # Impossible to detect PRIMARY_BRANCH AND SECONDARY_BRANCH
    fi

    SECONDARY_BRANCH=$1
    PRIMARY_BRANCH=$2

    echo "Continuing rebasing of $SECONDARY_BRANCH on top of $PRIMARY_BRANCH"
    git commit || exit 51
    git branch -d ${SECONDARY_BRANCH}  || exit 52
    git branch -m ${TARGET_BRANCH} ${SECONDARY_BRANCH} || exit 53

elif [[ "$PRIMARY_BRANCH" == "" ]]; then
    usage
    exit 10  # Missing arguments PRiMARY_BRANCH
else
    echo "Rebasing $SECONDARY_BRANCH on top of $PRIMARY_BRANCH"
    TARGET_BRANCH="${SECONDARY_BRANCH}-rebased-on-top-of-${PRIMARY_BRANCH}"

    git checkout ${PRIMARY_BRANCH} || exit 41
    git checkout -b ${TARGET_BRANCH} || exit 42
    git merge ${SECONDARY_BRANCH} ${FF} \
        -m "Psycho-rebased branch ${SECONDARY_BRANCH} on top of ${PRIMARY_BRANCH}"

    if [[ $? == 0 ]]; then
        git branch -d ${SECONDARY_BRANCH} || exit 43
        git branch -m ${TARGET_BRANCH} ${SECONDARY_BRANCH} || exit 44
    else
        echo "Resolve the conflict and run ``${PROGRAM} --continue``."
        exit 1
    fi
fi
