#! /bin/bash

DEST=`pwd`

cd `dirname $0`
ROOT=`pwd`

DEP="$ROOT/dependencies"
PLAT=`uname -s`
TYPE="Debug"
GEN="Unix Makefiles"
UTOPIA_EXTRA_CMAKE_OPTS=${UTOPIA_EXTRA_CMAKE_OPTS:-}

if [ "${PLAT:0:5}" = "MINGW" ]; then
    PLAT="Win32"
    GEN="MSYS Makefiles"
fi

echo "=============================================================================="
echo "                       U T O P I A    D O C U M E N T S"
echo "=============================================================================="
echo

usage () {

    cat <<EOF
    usage: $0 [OPTIONS] - configure utopia build environment

    where OPTIONS include:

        --dep <dir>            - specify another dependencies dir
        --plat <platform>      - platform name [$PLAT]
        --builddir <dir>       - build directory [build/$PLAT-$TYPE]
        --ninja                - use ninja instead of default generator
        --json                 - generate json project output
        --debug                - configure for debug build
        --release              - configure for release build
        --variant <name>       - configure for variant

EOF
    exit 1
}


VARIANTS=()
while [ $# -gt 0 ]
do
    case "$1" in

        -h|--help)
            usage
            exit 1
            ;;
        -d|--dep*)
            shift
            DEP=$1
            ;;
        -p|--plat*)
            shift
            PLAT=$1
            ;;
        -b|--builddir*)
            shift
            SUGGEST=$1
            ;;
        -n|--ninja)
            GEN="Ninja"
            ;;
        -j|--json)
            UTOPIA_EXTRA_CMAKE_OPTS="-DCMAKE_EXPORT_COMPILE_COMMANDS=on ${UTOPIA_EXTRA_CMAKE_OPTS}"
            ;;
        -g|--debug)
            TYPE="Debug"
            ;;
        -r|--release)
            TYPE="Release"
            ;;
        -v|--variant)
            shift
            VARIANTS+=("$1")
            ;;
    esac
    shift
done

cd "$DEST"

if [ -e CMakeLists.txt ]; then
    PWD=`pwd`
    if [[ -z "$SUGGEST" ]]; then
        SUGGEST="$PWD/build/$PLAT-$TYPE"
    fi
    echo "It is advisable to build in a subdirectory."
    echo "Would you prefer to configure in '$SUGGEST'?"
    select yn in "Yes" "No"; do
        case $yn in
            Yes)
                mkdir -p "$SUGGEST"
                DEST="$SUGGEST"
                break
                ;;
            No) break
                ;;
        esac
    done
fi

if [ -e CMakeCache.txt ]; then
    echo "This directory is already configured; reconfigure losing changes?"
    select yn in "Yes" "No"; do
        case $yn in
            Yes)
                rm -f CMakeCache.txt
                break
                ;;
            No)
                echo "Aborted configuration."
                exit 1
                ;;
        esac
        done
fi

if [ ! -e "$DEP/dependencies.cmake" -o ! -e "$DEP/CMakeCache.txt" ]; then
    echo "The dependencies have not been built; configure and build them now?"
    select yn in "Yes" "No"; do
        case $yn in
            Yes)
                cd "$DEP"
                UTOPIA_VARIANT_CMAKE_OPTS=""
                for VARIANT in "${VARIANTS[@]}"; do
                    VARIANT_FILE="CMakeConfig/configurations/variant-$VARIANT.txt"
                    if [ -e "$VARIANT_FILE" ]; then
                        UTOPIA_VARIANT_CMAKE_OPTS='$UTOPIA_VARIANT_CMAKE_OPTS -C "$VARIANT_FILE"'
                    fi
                done

                cmake -D "CMAKE_BUILD_TYPE:STRING=$TYPE" \
                    -C "CMakeConfig/configurations/$PLAT.txt" \
                    -C "CMakeConfig/configurations/common.txt" \
                    -D "UTOPIA_CONFIGURED_PLATFORM:STRING=$PLAT" \
                    $UTOPIA_VARIANT_CMAKE_OPTS \
		    -G "$GEN" . || exit 1

                if [[ "$GEN" == "Ninja" ]]; then
                    ninja || exit 1
                else
                    make || exit 1
                fi
                break
                ;;
            No)
                exit 1
                ;;
        esac
        done
fi

cd "$DEST"

UTOPIA_VARIANT_CMAKE_OPTS=""
for VARIANT in "${VARIANTS[@]}"; do
    VARIANT_FILE="$ROOT/CMakeConfig/configurations/variant-$VARIANT.txt"
    if [ -e "$VARIANT_FILE" ]; then
        UTOPIA_VARIANT_CMAKE_OPTS="$UTOPIA_VARIANT_CMAKE_OPTS -C $VARIANT_FILE"
    fi
done

cmake ${UTOPIA_EXTRA_CMAKE_OPTS} -D "UTOPIA_DEPENDENCIES_DIR:STRING=$DEP" \
    -D "CMAKE_BUILD_TYPE:STRING=$TYPE" \
    -C "$ROOT/CMakeConfig/configurations/$PLAT.txt" \
    -C "$ROOT/CMakeConfig/configurations/common.txt" \
    -D "UTOPIA_CONFIGURED_PLATFORM:STRING=$PLAT" \
    $UTOPIA_VARIANT_CMAKE_OPTS -G "$GEN" "$ROOT"

echo "=============================================================================="
echo
echo "Configured a $PLAT $TYPE build of $ROOT"
echo "Building in $DEST"
echo "Uses dependencies from $DEP"
echo
echo "To build:"
echo
echo "cd \"$DEST\""
if [[ "$GEN" == "Ninja" ]]; then
    echo "ninja"
else
    echo "make -j4"
fi
echo
echo "=============================================================================="
