#!/bin/bash

# Build, Package (docker image) & Deploy Memgraph

function print_help () {
    echo "Usage: $0 [OPTION] --version MAJOR.MINOR.PATCH"
    echo "Optional arguments:"
    echo -e "  -h|--help           Print help."
    echo -e "  --skip-compile      Skip compilation process."
    echo -e "  --skip-deploy       Skip deployment process."
    echo -e "  --docker-image-name Custom docker image name, otherwise the image name will be the same as the package name."
    echo -e "  -s|--server         Deployment server address. -|"
    echo -e "  -u|--user           Deployment server user.    -| -> Required if deployment isn't skipped."
    echo -e "  -k|--key            Deployment server SSH key. -|"
}

working_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
project_dir="${working_dir}/.."

# argument parsing
required_args_no=0
skip_compile=false
skip_deploy=false
version=0
docker_image_name=""
while [[ $# -gt 0 ]]
do
    case $1 in
        -h|--help)
        print_help
        exit -1
        ;;
        -s|--server)
        deploy_server="$2"
        required_args_no=$((required_args_no+1))
        shift # past argument
        ;;
        -u|--user)
        deploy_user="$2"
        required_args_no=$((required_args_no+1))
        shift # past argument
        ;;
        -k|--key)
        deploy_key="$2"
        required_args_no=$((required_args_no+1))
        shift # past argument
        ;;
        --skip-compile)
        skip_compile=true
        ;;
        --skip-deploy)
        skip_deploy=true
        ;;
        --docker-image-name)
        docker_image_name="$2"
        shift
        ;;
        --version)
        version=$2
        required_args_no=$((required_args_no+1))
        shift
        ;;
        *)
        # unknown option
        ;;
    esac
    shift # past argument or value
done

# arguments validation
# version validation (semantic versioning)
if [[ ! ${version} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo -e "Something is wrong with your version number. Semantic version number is required (MAJOR.MINOR.PATCH).\n"
    print_help
    exit 1
fi
# validate --skip-deploy, --version, --server, --user, --key
if [[ "${skip_deploy}" == false ]]; then
    if [[ ${required_args_no} -ne 4 ]]; then
        print_help
        exit 1
    fi
else # if deploy is skipped server, user and key are not required
    if [[ ${required_args_no} -ne 1 ]]; then
        print_help
        exit 1
    fi
fi

echo "Skip compile: ${skip_compile}"
echo "Skip deploy: ${skip_deploy}"
if [[ "${skip_deploy}" == false ]]; then
    echo "Deploy server: ${deploy_server}"
    echo "Deploy user: ${deploy_user}"
    echo "Deploy key: ${deploy_key}"
fi

## build binary
if [[ "${skip_compile}" == true ]]; then
    ${working_dir}/build_interpreter --skip-compile --version ${version}
else
    ${working_dir}/build_interpreter --build-type Release --version ${version}
fi
 
## build package (docker image)
cd ${working_dir}
package_name=`ls -t -d memgraph_*/ | head -1 | sed 's/.$//'`
# for some reason docker image has to be lowercase string
# and because our package name is based on the cmake build type
# string (which can be camel case) the package name has to be transformed
if [[ "${docker_image_name}" == "" ]] ; then
    docker_image_name=$(echo "${package_name}"| tr '[:upper:]' '[:lower:]')
fi
docker build -t ${docker_image_name} -f ${working_dir}/alpha.dockerfile --build-arg build_name=${package_name} .
docker save ${docker_image_name} > ${docker_image_name}.tar.gz

if [[ "${skip_deploy}" == false ]]; then
    ## deploy
    # copy package
    scp -i ${deploy_key} ${docker_image_name}.tar.gz ${deploy_user}@${deploy_server}:/home/${deploy_user}
    # load package
    ssh -i ${deploy_key} ${deploy_user}@${deploy_server} docker load -i /home/${deploy_user}/${docker_image_name}.tar.gz
    # spin up the instance
    public_port=$(echo ${package_name} | grep -o "memgraph_[0-9]*_" | sed 's/[^0-9]*//g')
    ssh -i ${deploy_key} ${deploy_user}@${deploy_server} docker run -d --name ${docker_image_name} -p ${public_port}:7687 ${docker_image_name}
fi
