#//usr/bin/env bash

# Licensed 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
#
#     https://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.

#
# Installs binaries on linux systems.
#

source "$(dirname "$(realpath "$0")")/common.sh"

install_binaries() {
  assert_supported_os
  set_os_arch_vars
  warn_architecture

  local root="$(dirname "$(realpath "$0")")"
  local bin="${root}/bin"

  local kubectl_version=1.33.1
  local kind_version=0.29.0
  local dapr_version=1.16.0
  local helm_version=3.18.0
  local stern_version=1.32.0
  local kn_version=1.18.0
  local jq_version=1.7.1

  echo "${blue}Installing binaries${reset}"
  echo "  OS:           ${OS}"
  echo "  Architecture: ${ARCH}"
  echo "  Destination:  ${bin}"

  mkdir -p "${bin}"

  install_kubectl
  install_kind
  install_dapr
  install_helm
  install_stern
  install_kn
  install_jq

  echo "${green}DONE${reset}"

}

assert_supported_os() {
  os_name=$(uname -s)
  if [ "$os_name" != "Linux" ] && [ "$os_name" != "Darwin" ]; then
    echo "${yellow}----------------------------------------------------------------------${reset}"
    echo "${yellow}This script only supports Linux and Darwin (macOS)${reset}"
    echo "Please install the dependencies manually"
    echo "${yellow}----------------------------------------------------------------------${reset}"
    exit 1
  fi
}

set_os_arch_vars() {
  OS=$(uname -s | tr '[:upper:]' '[:lower:]')
  ARCH_RAW=$(uname -m)
  
  # Map architecture names
  case "${ARCH_RAW}" in
    x86_64)
      ARCH="amd64"
      ;;
    aarch64|arm64)
      ARCH="arm64"
      ;;
    *)
      ARCH="${ARCH_RAW}"
      ;;
  esac
  
  # Override with environment variable if set
  ARCH="${ARCH:-$ARCH}"
}

warn_architecture() {
  arch=$(uname -m)
  if [ "$arch" != "x86_64" ] && [ "$arch" != "arm64" ] && [ "$arch" != "aarch64" ]; then
    echo -e "${yellow}Detected untested architecture ${arch}.${reset}\n This script is tested with amd64 and arm64, but you can use the ARCH env variable to specify an architecture to be interpolated in download links."
  fi
}

install_kubectl() {
    echo '=== kubectl'
    curl -sSLo "${bin}"/kubectl "https://dl.k8s.io/v${kubectl_version}/bin/${OS}/${ARCH}/kubectl"
    chmod +x "${bin}"/kubectl
    "${bin}"/kubectl version --client=true
}

install_kind() {
    echo '=== kind'
    curl -sSLo "${bin}"/kind "https://github.com/kubernetes-sigs/kind/releases/download/v$kind_version/kind-${OS}-${ARCH}"
    chmod +x "${bin}"/kind
    "${bin}"/kind version
}

install_dapr() {
    echo '=== dapr'
    curl -sSL "https://github.com/dapr/cli/releases/download/v$dapr_version/dapr_${OS}_${ARCH}.tar.gz" | \
      tar fxz - -C "${bin}" dapr
    "${bin}"/dapr version
}

install_helm() {
  echo '=== helm'
    curl -sSL "https://get.helm.sh/helm-v$helm_version-${OS}-${ARCH}.tar.gz" | \
      tar fxz - -C "${bin}" ${OS}-"${ARCH}"/helm
    mv "${bin}/${OS}-${ARCH}"/helm "${bin}" && rmdir "${bin}/${OS}-${ARCH}"
    "${bin}"/helm version
}

install_stern() {
  echo '=== stern'
  curl -sSL "https://github.com/stern/stern/releases/download/v${stern_version}/stern_${stern_version}_${OS}_${ARCH}.tar.gz" | \
    tar fxz - -C "${bin}" stern
  "${bin}"/stern -v
}

install_kn() {
  echo '=== kn'
  curl -sSLo "${bin}"/kn "https://github.com/knative/client/releases/download/knative-v${kn_version}/kn-${OS}-${ARCH}"
  chmod +x "${bin}"/kn
  "${bin}"/kn version
}

install_jq() {
  echo '=== jq'
  # jq uses different naming conventions for macOS
  if [ "$OS" = "darwin" ]; then
    JQ_OS="macos"
  else
    JQ_OS="linux"
  fi
  curl -sSLo "${bin}"/jq "https://github.com/jqlang/jq/releases/download/jq-${jq_version}/jq-${JQ_OS}-${ARCH}"
  chmod +x "${bin}"/jq
  "${bin}"/jq --version
}

if [ "$0" = "${BASH_SOURCE[0]}" ]; then
  set -o errexit
  set -o nounset
  set -o pipefail

  function main() {
    install_binaries
  }
  main "$@"
fi
