#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

ROOT=$(cd $(dirname "${BASH_SOURCE[0]}")/../..; pwd -P)

# import golang vars
WITH_GOLANG=true
source $ROOT/hack/lib/vars.sh
source $ROOT/hack/lib/image.sh

function build::in_docker::fake_passwd() {
    mkdir -p ${VAR_CACHE_DIR}
    fake_passwd_file=$(cd ${VAR_CACHE_DIR}; pwd -P)/fake_passwd
    echo "git-user:x:$(id -u):$(id -g):Git User:/home/git:/bin/bash" > ${fake_passwd_file}
}

function build::in_docker::del_fake_passwd() {
    fake_passwd_file=$(cd ${VAR_CACHE_DIR}; pwd -P)/fake_passwd
    rm ${fake_passwd_file}
}

function build::in_docker::build_args() {
    declare -n _args=$1
    case $VAR_PRIVATE_REPO_DOWNLOAD_TYPE in
    ssh)
    	_args+=" -e PRIVATE_REPO_DOWNLOAD_TYPE=ssh"
        os=$(uname -s)
        case $os in
        Linux)
    		_args+=" -v ${SSH_AUTH_SOCK}:/home/git/ssh-agent:ro"
    		_args+=" -e SSH_AUTH_SOCK=/home/git/ssh-agent"
            ;;
        Darwin)
    		# use magic path /run/host-services/ssh-auth.sock
    		# See https://github.com/docker/for-mac/issues/410#issuecomment-577064671
    		_args+=" -v /run/host-services/ssh-auth.sock:/home/git/ssh-agent:ro"
    		_args+=" -e SSH_AUTH_SOCK=/home/git/ssh-agent"
            ;;
        *)
            echo "Unknown os $os, now only support Linux and Darwin"
            exit -1
            ;;
        esac
        ;;
    netrc)
    	_args+=" -e PRIVATE_REPO_DOWNLOAD_TYPE=netrc"
    	_args+=" -v ${HOME}/.netrc:/home/git/.netrc:ro"
        ;;
    *)
        echo "Invalid VAR_PRIVATE_REPO_DOWNLOAD_TYPE: ${VAR_PRIVATE_REPO_DOWNLOAD_TYPE}, please see ./hack/lib/vars.sh#VAR_PRIVATE_REPO_DOWNLOAD_TYPE"
        exit -1
        ;;
esac
}


function build::in_docker::run_docker() {
    build::in_docker::fake_passwd
    build::in_docker::build_args args
    local workdir=$(go list -m)
    docker run -it --rm \
    	-w /go/src/${workdir} \
    	-u $(id -u):$(id -g) \
    	-v $(pwd):/go/src/${workdir} \
    	-v ${VAR_GOCACHE}:/go/.cache:cached \
    	-v ${VAR_GOMODCACHE}:/go/pkg/mod:cached \
    	-v ${fake_passwd_file}:/etc/passwd:ro \
    	--mount type=tmpfs,destination=/home/git \
    	-e HOME=/home/git \
    	-e VAR_GOCACHE=/go/.cache \
        -e VAR_GOMODCACHE=/go/pkg/mod \
    	-e VAR_GOPROXY=${VAR_GOPROXY} \
        -e VAR_PLATFORMS=${VAR_PLATFORMS} \
        -e VAR_PRIVATE_REPO_DOWNLOAD_TYPE=${VAR_PRIVATE_REPO_DOWNLOAD_TYPE} \
    	${args} \
    	golang:1.18 \
            ./hack/build/in_docker.sh --docker ${@}

    build::in_docker::del_fake_passwd
}

function build::in_docker::build_script() {
    if [[ $VAR_PRIVATE_REPO_DOWNLOAD_TYPE == "ssh" ]]; then
        mkdir -p ~/.ssh
        ssh-keyscan github.com >> ~/.ssh/known_hosts
        git config --global url."git@github.com:tidbcloud".insteadOf "https://github.com/tidbcloud"
    fi

    ./hack/build/go.sh ${@}
}

case $1 in
--docker)
    shift
    build::in_docker::build_script ${@}
    ;;
*)
    build::in_docker::run_docker ${@}
    ;;
esac

