#!/bin/bash

function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }

function isURL {
  local value=$1

  if [[ ${value:0:8} == "https://" || ${value:0:7} == "http://" ]]; then
    return 0
  else
    return 1
  fi
}

function isTrue {
  local value=${1,,}

  result=

  case ${value} in
    true|on)
      result=0
      ;;
    *)
      result=1
      ;;
  esac

  return ${result}
}

function isDebugging {
  if [[ -v DEBUG ]] && [[ ${DEBUG^^} = TRUE ]]; then
    return 0
  else
    return 1
  fi
}

function debug {
  if isDebugging; then
    log "DEBUG: $*"
  fi
}

function logn {
  echo -n "[init] $*"
}

function log {
  echo "[init] $*"
}

function logAutopause {
  echo "[Autopause loop] $*"
}

function logAutopauseAction {
  echo "[$(date -Iseconds)] [Autopause] $*"
}

function normalizeMemSize {
  local scale=1
  case ${1,,} in
    *k)
      scale=1024;;
    *m)
      scale=1048576;;
    *g)
      scale=1073741824;;
  esac

  val=${1:0: -1}
  echo $(( val * scale ))
}

function versionLessThan {
  local activeParts
  IFS=. read -ra activeParts <<< "${VANILLA_VERSION}"

  local givenParts
  IFS=. read -ra givenParts <<< "$1"

  if (( ${#activeParts[@]} < 2 )); then
    return 1
  fi

  if (( ${#activeParts[@]} == 2 )); then
    if (( activeParts[0] < givenParts[0] )) || \
      (( activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1] )); then
      return 0
    else
      return 1
    fi
  else
    if (( activeParts[0] < givenParts[0] )) || \
      (( activeParts[0] == givenParts[0] && activeParts[1] < givenParts[1] )) || \
      (( activeParts[0] == givenParts[0] && activeParts[1] == givenParts[1] && activeParts[2] < givenParts[2] )); then
      return 0
    else
      return 1
    fi
  fi
}

requireVar() {
  if [ ! -v $1 ]; then
    log "ERROR: $1 is required to be set"
    exit 1
  fi
  if [ -z "${!1}" ]; then
    log "ERROR: $1 is required to be set"
    exit 1
  fi
}
