#!/bin/bash
# Release Candidate

apply_debug_settings() {
    # 在子脚本中应用调试设置
    [[ "$BASH_XTRACE" == "1" ]] && set -x
    [[ "$BASH_VERBOSE" == "1" ]] && set -v
    [[ "$BASH_ERREXIT" == "1" ]] && set -e
}
apply_debug_settings

[ -z ${CUBRIDGE_HOME+x} ] && CUBRIDGE_HOME=$HOME
[ -n "${WCUDA_HOME}" ] && CUBRIDGE_HOME=${WCUDA_HOME}
[ -z ${CUCC_PATH+x} ] && export CUCC_PATH=${MACA_PATH}/tools/cu-bridge/
TEMP_DIR_NAME="cu-bridge"
if [ ! -z "$USE_WCUDA_FOR_MULTI_JOB" ]; then
    DST_WCUDA="$CUBRIDGE_HOME/${TEMP_DIR_NAME}/${TEMP_DIR_NAME}-$PPID"
else
    DST_WCUDA="$CUBRIDGE_HOME/${TEMP_DIR_NAME}"
fi

rm -rf $DST_WCUDA

check_python() {
    local cmd=$1
    local name=$2
    if command -v "$cmd" &> /dev/null; then
        local version=$($cmd --version 2>&1)
        #echo "$name is installed: $version"
        # is python 3.x
        if $cmd -c "import sys; exit(0 if sys.version_info[0] >= 3 else 1)" 2>/dev/null; then
            #echo "$name is version 3.x or higher ✓"
            return 0
        else
            #echo "$name is version 2.x ✗"
            return 1
        fi
    else
        #echo "$name is not installed ✗"
        return 1
    fi
}

check_python "python" "Python"
if [ $? -eq 0 ]; then
    :
else
    check_python "python3" "Python3"
    if [ $? -eq 0 ]; then
        :
    else
        echo "**** Python3 is required, please install it first.***"
        exit 1
    fi
fi

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export CUDA_PATH=$DST_WCUDA/CUDA_DIR
export PATH=$DST_WCUDA/bin:$CUDA_PATH/bin:$PATH
echo "going to execute cmake from cmake_mock"

python3 ${SCRIPT_DIR}/mock/virtualDir.py cmake  -r ${DST_WCUDA}

function deal_build_param() {
    para_len=$#
    if [[ ${para_len} -eq 1 ]];then
        # cmake --build
        cmake $*
        return
    fi

    dir=""
    newparam=()
    target=()
    transfer_param=()
    transfer_flag=0
    generator='make'

    for ((i = 1; $i <= $(($para_len)); i++ )); do
        #echo "${i}:${!i}"
        ii=$((i + 1))
        case ${!i} in
        "--build" )
            dir=${!ii}
            ;;
        "--target" | "-t")
            # not only on target
            while [ ${ii} -le ${para_len} ]
            do
                if [[ "${!ii}" == "-"* ]] ; then
                    break
                fi
                target+=(${!ii})
                let ii++
            done
            ;;
        "--parallel" | "-j" )
            newparam+=("-j")
            newparam+=(${!ii})
            ;;
        "--config" )
            #echo "ignore --config ${!ii} "
            ;;
       "--verbose" | "-v")
            #echo "ignore ${!i} "
            ;;
        "--")
            transfer_flag=${i}
            ;;
        * )
         #echo "ignore unknow ${!i} "
            ;;
        esac
    done

    if [ ${transfer_flag} -gt 0 ] ; then
        for ((i = $((transfer_flag + 1)); $i <= $(($para_len)); i++ )); do
            transfer_param+=(${!i})
        done
    fi
    cd ${dir}
    [ -f "build.ninja" ] && generator="Ninja"
    [ "${generator}" == "make" ] && \
        make_cmd="make_maca ${newparam[@]} ${target[@]} ${transfer_param[@]}"
    [ "${generator}" == "Ninja" ] && \
        make_cmd="ninja_maca ${newparam[@]} ${target[@]} ${transfer_param[@]}"

    echo "dir:${dir}, transfer param:${transfer_param[@]}, cmd:${make_cmd}"
    ${make_cmd}
    cd -
}

paramlen=$#

listp=()
for i in "$@"; do
    # echo "${i}"
    macro_reg_blank_str="^-D\S+=\"\S+([[:blank:]]+\S+)+[[:blank:]]*\""
    macro_reg_str="^-D\S+=\"\S+\""
    macro_reg="^-D\S+=\S+([[:blank:]]+\S+)+[[:blank:]]*"
    if [[ "${i}" =~  $macro_reg_blank_str ]]; then
        flag="${i/=/=\"\\}"
        flag="${flag/%\"/\\\"\"}"
        # echo "lpf ${i} 3--> ${flag}"
    elif [[ "${i}" =~  $macro_reg_str ]]; then
        flag="${i/=/=\\}"
        flag="${flag/%\"/\\\"}"
        # echo "lpf ${i} 2-->${flag}"
    elif [[ "${i}" =~  $macro_reg ]]; then
        flag="${i/=/=\"}"
        flag="${flag}\""
    else
        flag="${i//;/\\;}"
    fi

    if [ "${flag}" == "Unix Makefiles" ]; then
        flag="\\\"Unix\\ Makefiles\\\""
    fi
    if [ "${flag}" == "-GUnix Makefiles" ]; then
        flag="\\\"-GUnix\\ Makefiles\\\""
    fi

    listp+=(${flag})
done
# echo "listp:${#listp[@]} ${listp[@]}"


if [[ $paramlen -ge 1 ]]; then
    if [[ $* == *"--build"* ]]; then
        deal_build_param ${listp[@]}
    else
        full_cmd=(cmake ${listp[@]})
        eval ${full_cmd[@]}
    fi
fi