#!/bin/bash

# Welcome screen

echo "                                                                                        ";
echo "     ((((((  ((((((                                                                     ";
echo "   (((       (    (((    ██╗███╗   ██╗███████╗██╗     ███████╗ █████╗ ██████╗ ███╗   ██╗";
echo " (((   ((,  ((      ((,  ██║████╗  ██║██╔════╝██║     ██╔════╝██╔══██╗██╔══██╗████╗  ██║";
echo " ((       (((        ((  ██║██╔██╗ ██║█████╗  ██║     █████╗  ███████║██████╔╝██╔██╗ ██║";
echo " ((         ((,      ((  ██║██║╚██╗██║██╔══╝  ██║     ██╔══╝  ██╔══██║██╔══██╗██║╚██╗██║";
echo "  ((    (((((((((    ((  ██║██║ ╚████║██║     ███████╗███████╗██║  ██║██║  ██║██║ ╚████║";
echo "   (((           ((( ((  ╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═══╝";
echo "      (((((((((((((((((                                                                 ";
echo "                                                                                        ";
echo "Git deploy 자동화 스크립트";
echo ""

# Script to deploy to test branch

usage() {
    err_msg "사용법: git-deploy [-h | --help] [-T | --include-test-branch]"
    exit 1
}

exit_on_failed() {
    echo "$@";
    exit 1;
}

err_msg() { echo "$@" ;} >&2

# long 옵션 처리
A=""
is_override=0
local_deploy_branch="test"
remote_deploy_branch="origin/test"
working_branch=$(git branch --show-current)
while true; do
    [ $# -eq 0 ] && break
    case $1 in
        --include-test-branch)
            is_override=1
            echo "현재 브랜치를 test 브랜치 위로 리베이스한 뒤 test 브랜치로 push 합니다."
            shift; continue
            ;;
        --help)
            usage
            shift; continue
            ;;
        --*)
            err_msg "알 수 없는 옵션: $1"
            usage;
            ;;
    esac

    A=$A$([ -n "$A" ] && echo -e "\a")$1
    shift
done

# $@' 값에 short 옵션만 남기기
IFS=$(echo -e "\a"); set -f; set -- $A; set +f; IFS=$(echo -e " \n\t")

# short 옵션 처리
while getopts "Th" opt; do
    case $opt in
        T)
            is_override=1
            usage
            echo "현재 브랜치를 test 브랜치 위로 리베이스한 뒤 test 브랜치로 push 합니다."
            ;;
        h)
            usage
            ;;
        *)
            # err_msg "알 수 없는 옵션: -$OPTARG"
            usage
            ;;
    esac
done

shift $(( OPTIND - 1 ))

# Delete $local_deploy_branch with -f option
echo "🗑 로컬 $local_deploy_branch 브랜치를 삭제합니다."
echo "git branch -D $local_deploy_branch"
git branch -D $local_deploy_branch

echo ""

# Create new branch 'test' and checkout to this
echo "$working_branch 브랜치에서 🆕 $local_deploy_branch 브랜치를 체크아웃합니다."
echo "git checkout -b $local_deploy_branch"
git checkout -b $local_deploy_branch || exit_on_failed "오류가 발생했습니다. 문제를 해결하고 다시 시도하거나 수동으로 진행해주세요"

echo ""

# Rebase $local_deploy_branch onto $remote_deploy_branch branch when --include-test-branch option is specified
if [ $is_override -eq 1 ]
  then
  echo "현재 브랜치($local_deploy_branch)를 $remote_deploy_branch 브랜치 위로 리베이스합니다."
  echo "git fetch"
  git fetch
  echo "git rebase $remote_deploy_branch"
  git rebase $remote_deploy_branch || exit_on_failed "오류가 발생했습니다. 문제를 해결하고 다시 시도하거나 수동으로 진행해주세요"

  echo ""
fi

# Push local branch onto the remote branch with -f option
echo "🆙 로컬 $local_deploy_branch 브랜치를 리모트로 강제 푸시합니다."
echo "git push -f origin $local_deploy_branch"
git push -f origin $local_deploy_branch || exit_on_failed "오류가 발생했습니다. 문제를 해결하고 다시 시도하거나 수동으로 진행해주세요"

echo ""

# Checkout back to initial branch

echo "🆗 시작 브랜치로 돌아옵니다."
echo "git checkout $working_branch"
git checkout "$working_branch" || exit_on_failed "오류가 발생했습니다. 문제를 해결하고 다시 시도하거나 수동으로 진행해주세요"

echo ""

# Delete 'test' branch

echo "🆓 $local_deploy_branch 브랜치를 삭제합니다."
echo "git branch -D $local_deploy_branch"
git branch -D "$local_deploy_branch"

echo ""

# Bye!

echo "👽 안녕!"
