#!/usr/bin/env bash
set +xe

KX_PATH="$HOME/.kx"
mkdir -p "$KX_PATH/cache"

case "$OSTYPE" in
  *arwin*)
    OS="darwin"
    ;;
  *in32* | *indows*)
    OS="windows"
    ;;
  *)
    OS="linux"
esac

# Default to ~/.kube/config if KUBECONFIG is not set
if [ -z "$KUBECONFIG" ]; then
  if [ -f "$HOME/.kube/config" ]; then
    KUBECONFIG="$HOME/.kube/config"
  fi
fi

# Attempt to load the server version from cache
if [ ! -z "$KUBECONFIG" ]; then
  # Resolve symlink if KUBECONFIG points to a symlink
  if [ -L "$KUBECONFIG" ]; then
    RESOLVED_KUBECONFIG=$(readlink -f "$KUBECONFIG")
  else
    RESOLVED_KUBECONFIG="$KUBECONFIG"
  fi

  if [ "$OS" == "darwin" ]; then
    KUBECONFIG_HASH=$(echo "$RESOLVED_KUBECONFIG" | shasum -a 256 | cut -c1-5)
  else
    KUBECONFIG_HASH=$(echo "$RESOLVED_KUBECONFIG" | sha256sum | cut -c1-5)
  fi
  VERSION_CACHE_FILE="$KX_PATH/cache/$KUBECONFIG_HASH"
  TARGET_VERSION=$(cat "$VERSION_CACHE_FILE" 2> /dev/null)
fi

# Use Correct CPU Architecture
CPU_ARCHITECTURE=$(uname -m)
case $CPU_ARCHITECTURE in
  armv5*) CPU_ARCHITECTURE="armv5";;
  armv6*) CPU_ARCHITECTURE="armv6";;
  armv7*) CPU_ARCHITECTURE="arm";;
  aarch64) CPU_ARCHITECTURE="arm64";;
  x86) CPU_ARCHITECTURE="386";;
  x86_64) CPU_ARCHITECTURE="amd64";;
  i686) CPU_ARCHITECTURE="386";;
  i386) CPU_ARCHITECTURE="386";;
esac

# Ensure we have at least 1 kubectl version
KNOWN_VERSION="v1.16.3"
LOCAL_KUBECTL=$KX_PATH/kubectl-$KNOWN_VERSION
if $(command -v kubectl &>/dev/null); then
  KUBECTL_PATH=$(command -v kubectl)
fi
if [ ! -z "$KUBECTL_PATH" ]; then
  LOCAL_KUBECTL=$KUBECTL_PATH
elif [ ! -f "$LOCAL_KUBECTL" ]; then
  curl -L -o "$LOCAL_KUBECTL" "https://dl.k8s.io/release/$KNOWN_VERSION/bin/$OS/$CPU_ARCHITECTURE/kubectl"
  chmod +x "$LOCAL_KUBECTL"
fi

# Get the server version from the server if not cached
if [ -z "$TARGET_VERSION" ]; then
  TARGET_VERSION=$($LOCAL_KUBECTL version -o json 2>/dev/null | jq -r '.serverVersion.gitVersion')
  if [ -z "$TARGET_VERSION" ] || [ "$TARGET_VERSION" == "null" ]; then
    echo "Unable to get version information from cluster"
    exit 1
  fi
  if [[ $TARGET_VERSION =~ (alpha|beta|rc) ]]; then
    TARGET_VERSION=$(echo $TARGET_VERSION | cut -d'.' -f1-4)
  else
    TARGET_VERSION=$(echo $TARGET_VERSION | cut -d'.' -f1-3)
  fi
fi

# Fill the cache if possible
if [ ! -z "$KUBECONFIG" ]; then
  echo "$TARGET_VERSION" > "$VERSION_CACHE_FILE"
fi

TARGET=$KX_PATH/kubectl-$TARGET_VERSION

if [ ! -f "$TARGET" ]; then
  curl -L -o "$TARGET" "https://dl.k8s.io/release/$TARGET_VERSION/bin/$OS/$CPU_ARCHITECTURE/kubectl"
  chmod +x "$TARGET"
fi

$TARGET "$@"
