#!/usr/bin/env bash

function msg_err {
  printf "\033[31;1m** \033[0m%s\n" "$@"
  exit 1
}

function msg {
  printf "\033[32;1m** \033[0m%s\n" "$@"
}

function main
{
  [[ -d ./.git ]] && {
    msg "Fetching submodules"
    git submodule update --init --recursive || msg_err "Failed to clone submodules"
  }

  [[ -d ./build ]] && {
    if [[ "$1" == "-f" ]]; then
      msg "Removing existing build dir (-f)"
      rm -rf ./build >/dev/null || msg_err "Failed to remove existing build dir"
    else
      msg_err "A build dir already exists (pass -f to replace)"
    fi
  }

  mkdir ./build || msg_err "Failed to create build dir"
  cd ./build || msg_err "Failed to enter build dir"

  local enable_alsa="ON"
  local enable_i3="ON"
  local enable_network="ON"
  local enable_mpd="ON"
  local enable_curl="ON"

  msg "Setting build options"

  read -r -p "$(msg "Include support for \"internal/i3\" (requires i3) ------------------- [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" != "Y" ]] && enable_i3="OFF"
  read -r -p "$(msg "Include support for \"internal/volume\" (requires alsalib) ---------- [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" != "Y" ]] && enable_alsa="OFF"
  read -r -p "$(msg "Include support for \"internal/network\" (requires wireless_tools) -- [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" != "Y" ]] && enable_network="OFF"
  read -r -p "$(msg "Include support for \"internal/mpd\" (requires libmpdclient) -------- [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" != "Y" ]] && enable_mpd="OFF"
  read -r -p "$(msg "Include support for \"internal/github\" (requires libcurl) ---------- [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" != "Y" ]] && enable_curl="OFF"

  local cxx="c++"
  local cc="cc"

  if command -v clang++ >/dev/null; then
    msg "Using compiler: clang++/clang"
    cxx="clang++"
    cc="clang"
  elif command -v g++ >/dev/null; then
    msg "Using compiler: g++/gcc"
    cxx="g++"
    cc="gcc"
  fi

  msg "Executing cmake command"
  cmake                                       \
    -DCMAKE_C_COMPILER="${cc}"                \
    -DCMAKE_CXX_COMPILER="${cxx}"             \
    -DENABLE_ALSA:BOOL="${enable_alsa}"       \
    -DENABLE_I3:BOOL="${enable_i3}"           \
    -DENABLE_MPD:BOOL="${enable_mpd}"         \
    -DENABLE_NETWORK:BOOL="${enable_network}" \
    -DENABLE_CURL:BOOL="${enable_curl}"       \
    .. || msg_err "Failed to generate build... read output to get a hint of what went wrong"

  msg "Building project"
  make || msg_err "Failed to build project"

  read -r -p "$(msg "Execute 'sudo make install'? [Y/n] ")" -n 1 p && echo
  [[ "${p^^}" == "Y" ]] && {
    sudo make install || msg_err "Failed to install executables..."
  }

  read -r -p "$(msg "Install example configuration? [Y/n]: ")" -n 1 p && echo
  [[ "${p^^}" == "Y" ]] && {
    make userconfig || msg_err "Failed to install user configuration..."
  }

  msg "Build complete!"

  exit 0
}

main "$@"