#
# General build instructions
#

FOLDER=build_gcc
OS=Linux
COMPILE=gcc
COMPILEPP=g++
OBJ_POSTFIX=.o
EXE_POSTFIX=
FLAGS=
FLAG_OBJ="-c -o "
FLAG_EXE="-o "
LINK_FLAGS="-lm -lX11 -lXi -lXcursor -lGL"

if    [ "$2" = "gcc" ]; then
  FOLDER=build_gcc
  COMPILE=gcc
  COMPILEPP=g++
elif  [ "$2" = "clang" ]; then
  FOLDER=build_clang
  COMPILE=clang
  COMPILEPP=clang++
elif  [ "$2" = "msvc" ]; then
  FOLDER=build_msvc
  COMPILE=cl.exe
  COMPILEPP=cl.exe
  OBJ_POSTFIX=.obj
  FLAG_OBJ="-c -Fo"
  FLAG_EXE="-Fe"
elif  [ "$2" = "emcc" ]; then
  FOLDER=build_emcc
  COMPILE=emcc
  COMPILEPP=em++
  EXE_POSTFIX=.js
  LINK_FLAGS="-sFULL_ES3=1"
elif  [ "$2" != "" ]; then
  echo "Unknown C compiler"
  exit 1
fi

if [ "$3" != "" ]; then
  FOLDER="$3"
fi

if [ "$2" != "" ]; then
  if command -v $COMPILE >/dev/null 2>&1; then
    echo "C compiler found"
  else
    echo "C compiler not found"
    exit 1
  fi
fi

if [ "$COMPILE" != "emcc" ]; then
  case $(uname | tr '[:upper:]' '[:lower:]') in
    *darwin*)
      OS=macOS
      if [ "$2" = "" ]; then
        if    command -v clang >/dev/null 2>&1; then
          echo "C compiler found - Clang"
          COMPILE=clang
          COMPILEPP=clang++
        elif  command -v gcc >/dev/null 2>&1; then
          echo "C compiler found - GCC"
        else
          echo "C compiler not found"
          exit 1
        fi
      fi
      ;;
    *msys*|*cygwin*|*mingw*|*nt*|*win*)
      OS=Windows
      EXE_POSTFIX=.exe
      if [ "$2" = "" ]; then
        if    command -v cl.exe >/dev/null 2>&1; then
          echo "C compiler found - MSVC"
          COMPILE=cl.exe
          COMPILEPP=cl.exe
          OBJ_POSTFIX=.obj
          FLAG_OBJ="-c -Fo"
          FLAG_EXE="-Fe"
        elif  command -v gcc >/dev/null 2>&1; then
          echo "C compiler found - GCC"
        elif  command -v clang >/dev/null 2>&1; then
          echo "C compiler found - Clang"
          COMPILE=clang
          COMPILEPP=clang++
        else
          echo "C compiler not found"
          exit 1
        fi
      fi
      if [ "$COMPILE" = "cl.exe" ]; then
        LINK_FLAGS="Shlwapi.lib Advapi32.lib"
      else
        LINK_FLAGS="-lShlwapi -lAdvapi32"
      fi
      ;;
    *)
      if [ "$2" = "" ]; then
        if    command -v gcc >/dev/null 2>&1; then
          echo "C compiler found - GCC"
        elif  command -v clang >/dev/null 2>&1; then
          echo "C compiler found - Clang"
          COMPILE=clang
          COMPILEPP=clang++
        else
          echo "C compiler not found"
          exit 1
        fi
      fi
      ;;
  esac
fi

if [ "$COMPILE" = "gcc" ] || [ "$COMPILE" = "clang" ] || [ "$COMPILE" = "emcc" ]; then
  if    [ "$1" = "release" ]; then
    FLAGS="-O3 -DNDEBUG"
  elif  [ "$COMPILE" = "gcc" ] && [ "$OS" != "Windows" ]; then
    FLAGS="-O0 -fsanitize=undefined,address,leak"
  elif  [ "$OS" != "Windows" ] && [ "$COMPILE" != "emcc" ]; then
    FLAGS="-O0 -fsanitize=undefined,address"
  else
    FLAGS="-O0"
  fi
else
  if [ "$1" = "release" ]; then
    FLAGS="-O2 -DNDEBUG"
  else
    FLAGS="-Od"
  fi
fi

if [ ! -d "$FOLDER" ]; then
  mkdir "$FOLDER"
fi

echo ""

#
# Project-specific instructions
#

echo "Build saw"
if  [ !                     -f  "$FOLDER/saw_impl${OBJ_POSTFIX}" ] || \
    [ "source/saw/_impl.c"  -nt "$FOLDER/saw_impl${OBJ_POSTFIX}" ]; then
  $COMPILE ${FLAGS} \
    ${FLAG_OBJ}"$FOLDER/saw_impl${OBJ_POSTFIX}" \
    "source/saw/_impl.c"
  if [ $? -ne 0 ]; then
    exit 1
  fi
fi
$COMPILE ${FLAGS} \
  ${FLAG_EXE}"$FOLDER/saw${EXE_POSTFIX}" \
  "$FOLDER/saw_impl${OBJ_POSTFIX}" \
  "source/saw/_exe.c" \
  ${LINK_FLAGS}
if [ $? -ne 0 ]; then
  exit 1
fi

if [ "$COMPILE" = "emcc" ]; then
  exit 0
fi

echo "Build saw_test_suite"
$COMPILE ${FLAGS} \
  ${FLAG_EXE}"$FOLDER/saw_test_suite${EXE_POSTFIX}" \
  "source/tests/_exe.c" \
  ${LINK_FLAGS}
if [ $? -ne 0 ]; then
  exit 1
fi

echo "Run tests"
echo ""

STATUS=0

"$FOLDER/saw_test_suite"
if [ $? -ne 0 ]; then
  STATUS=1
fi

exit $STATUS