#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

verify_enable_platform(){
  feature="$1"
  verify_gcc_enable "$feature"
}
add_os_flags() {
  #CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND}"
  :
}
bootstrap_cmake(){
  sudo bash -c 'source /etc/os-release; grep "$VERSION_CODENAME-backports" /etc/apt/sources.list &>/dev/null || echo "deb http://deb.debian.org/debian $VERSION_CODENAME-backports main" >> /etc/apt/sources.list'
  sudo apt-get -y update
  if [ "$VERSION_CODENAME" = buster ]; then
    sudo apt-get -t buster-backports install -y cmake
  else
    sudo apt-get install -y cmake
  fi
}
build_deps(){
  sudo apt-get -y update
  ## need to account for debian
  sudo apt-get install -y libssl1.0-dev > /dev/null
  RETVAL=$?
  if [ "$RETVAL" -ne "0" ]; then
    sudo apt-get install -y libssl-dev > /dev/null
  fi
  COMMAND="sudo apt-get -y install gcc g++ zlib1g-dev uuid uuid-dev"
  export DEBIAN_FRONTEND=noninteractive
  INSTALLED=()
  INSTALLED+=("libbz2-dev")
  sudo apt-get -y update
  for option in "${OPTIONS[@]}" ; do
    option_value="${!option}"
    if [ "$option_value" = "${TRUE}" ]; then
      # option is enabled
      FOUND_VALUE=""
      for cmake_opt in "${DEPENDENCIES[@]}" ; do
        KEY=${cmake_opt%%:*}
        VALUE=${cmake_opt#*:}
        if [ "$KEY" = "$option" ]; then
          FOUND_VALUE="$VALUE"
          if [ "$FOUND_VALUE" = "libpcap" ]; then
            INSTALLED+=("libpcap-dev")
          elif [ "$FOUND_VALUE" = "libusb" ]; then
            INSTALLED+=("libusb-1.0-0-dev")
            INSTALLED+=("libusb-dev")
          elif [ "$FOUND_VALUE" = "libpng" ]; then
            INSTALLED+=("libpng-dev")
          elif [ "$FOUND_VALUE" = "bison" ]; then
            INSTALLED+=("bison")
          elif [ "$FOUND_VALUE" = "flex" ]; then
            INSTALLED+=("flex")
          elif [ "$FOUND_VALUE" = "libtool" ]; then
            INSTALLED+=("libtool")
          elif [ "$FOUND_VALUE" = "python" ]; then
            INSTALLED+=("libpython3-dev")
          elif [ "$FOUND_VALUE" = "lua" ]; then
            INSTALLED+=("liblua5.1-0-dev")
          elif [ "$FOUND_VALUE" = "jnibuild" ]; then
            INSTALLED+=("openjdk-11-jdk")
            INSTALLED+=("openjdk-11-source")
            INSTALLED+=("maven")
          elif [ "$FOUND_VALUE" = "automake" ]; then
            INSTALLED+=("automake")
          elif [ "$FOUND_VALUE" = "gpsd" ]; then
            INSTALLED+=("libgps-dev")
          elif [ "$FOUND_VALUE" = "libarchive" ]; then
            INSTALLED+=("liblzma-dev")
          elif [ "$FOUND_VALUE" = "libssh2" ]; then
            INSTALLED+=("libssh2-1-dev")
          fi
        fi
      done

    fi
  done

  INSTALLED+=("autoconf")

  for option in "${INSTALLED[@]}" ; do
    COMMAND="${COMMAND} $option"
  done

  echo "Ensuring you have all dependencies installed..."
  ${COMMAND}

}
