#!/usr/bin/bash

ct() {
  if [ -z "$1" ]; then
    local contexts=$(k config get-contexts -o=name | sort -n)
    echo "$contexts"
    return
  fi
  kubectl config use-context "$1" >/dev/null
  export KUBECTL_CONTEXT="$1"
  local namespace="$(k config view -o=jsonpath="{.contexts[?(@.name==\"${1}\")].context.namespace}")"
  #"
  [ -n "$namespace" ] && export KUBECTL_NAMESPACE="$namespace"
}
export -f ct

ctx() {
  ct "$@"
}
export -f ctx

_ct_completions()
{
  local contexts=$(k config get-contexts -o=name | sort -n)
  COMPREPLY=($(compgen -W "${contexts}" "${COMP_WORDS[1]}"))
}
export -f _ct_completions

ns() {
  if [ -z "$1" ]; then
    local namespaces=$(k get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\n"}{end}')
    echo "${namespaces}"
    return
  fi
  kubectl config set-context --current --namespace="$1" >/dev/null
  export KUBECTL_NAMESPACE="$1"
}
export -f ns

_ns_completions()
{
  local namespaces=$(k get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\n"}{end}')
  COMPREPLY=($(compgen -W "${namespaces}" "${COMP_WORDS[1]}"))
}
export -f _ns_completions

reloadExtensions() {
  if [ -e ~/.k8sh_extensions ]; then
    echo "Sourcing in ~/.k8sh_extensions..."
    source ~/.k8sh_extensions
  fi
}
export -f reloadExtensions

k8sh_init() {

  RED='\033[00;31m'
  GREEN='\033[00;32m'
  YELLOW='\033[00;33m'
  BLUE='\033[00;34m'
  PURPLE='\033[00;35m'
  CYAN='\033[00;36m'
  LIGHTGRAY='\033[00;37m'
  LRED='\033[01;31m'
  LGREEN='\033[01;32m'
  LYELLOW='\033[01;33m'
  LBLUE='\033[01;34m'
  LPURPLE='\033[01;35m'
  LCYAN='\033[01;36m'
  WHITE='\033[01;37m'
  RESTORE='\033[0m'

  # Colors for the PS1 prompt
  # For an explanation of the format, please see the Stack Exchange answer
  # from Runium (https://unix.stackexchange.com/users/28489/runium)
  # at http://unix.stackexchange.com/questions/105958/terminal-prompt-not-wrapping-correctly
  PS_RED='\[\033[00;31m\]'
  PS_GREEN='\[\033[00;32m\]'
  PS_YELLOW='\[\033[00;33m\]'
  PS_BLUE='\[\033[00;34m\]'
  PS_PURPLE='\[\033[00;35m\]'
  PS_CYAN='\[\033[00;36m\]'
  PS_LIGHTGRAY='\[\033[00;37m\]'
  PS_LRED='\[\033[01;31m\]'
  PS_LGREEN='\[\033[01;32m\]'
  PS_LYELLOW='\[\033[01;33m\]'
  PS_LBLUE='\[\033[01;34m\]'
  PS_LPURPLE='\[\033[01;35m\]'
  PS_LCYAN='\[\033[01;36m\]'
  PS_WHITE='\[\033[01;37m\]'
  PS_RESTORE='\[\033[0m\]'

  # Functional colors
  CONTEXT_COLOR=$WHITE
  PS_CONTEXT_COLOR=$PS_RESTORE
  NAMESPACE_COLOR=$LGREEN
  PS_NAMESPACE_COLOR=$PS_LGREEN

  echo ""
  echo -e "${LPURPLE}Welcome to k${LRED}8${LPURPLE}sh${RESTORE}"
  if [ -e ~/.bash_profile ]; then
    echo "Sourcing in ~/.bash_profile..."
    source ~/.bash_profile
  fi
  echo "Gathering current kubectl state..."
  export KUBECTL_CONTEXT=$(kubectl config current-context)
  local namespace="$(kubectl config view -o=jsonpath="{.contexts[?(@.name==\"${KUBECTL_CONTEXT}\")].context.namespace}")"
  #"
  export KUBECTL_NAMESPACE=${namespace:-default}

  echo "Making aliases..."
#  alias kubectl="kubectl --context \$KUBECTL_CONTEXT --namespace \$KUBECTL_NAMESPACE"
  alias k="kubectl"

  # Common actions
  alias describe="k describe"
  alias get="k get"
  alias create="k create"
  alias apply="k apply"
  alias delete="k delete"
  alias scale="k scale"
  alias rollout="k rollout"
  alias logs="k logs"
  alias explain="k explain"

  # Query common resources
  # Resource reference list:
  # pods (po), services (svc), deployments, replicasets (rs)
  # replicationcontrollers (rc), nodes (no), events (ev),
  # limitranges (limits), persistentvolumes (pv),
  # persistentvolumeclaims (pvc), resourcequotas (quota),
  # namespaces (ns), serviceaccounts (sa), ingresses (ing),
  # horizontalpodautoscalers (hpa), daemonsets (ds), configmaps,
  # componentstatuses (cs), endpoints (ep), and secrets.
  alias pods="get pods"
  alias services="get svc"
  alias deployments="get deployments"
  alias dep="get deployments" # NON-STANDARD!!
  alias replicasets="get rs"
  alias replicationcontrollers="get rc"
  alias rc="get rc"
  alias nodes="get nodes"
  alias limitranges="get limitranges"
  alias limits="get limitranges"
  alias events="get events"
  alias persistentvolumes="get pv"
  alias pv="get pv"
  alias persistentvolumeclaims="get pvc"
  alias pvc="get pvc"
  alias namespaces="get ns"
  alias ingresses="get ing"
  alias ing="get ing"
  alias configmaps="get configmaps"
  alias secrets="get secrets"

  complete -F _ns_completions ns
  complete -F _ct_completions ct
  complete -F _ct_completions ctx

  local bash_completion_present=$(type -t _get_comp_words_by_ref)

  if [[ ! -z "$bash_completion_present" ]]; then
    echo "Setting up k completion..."
    # without sourcing completion for `k` does not recognize __start_kubectl
    source <(kubectl completion bash)
    # make completion work for `k`
    complete -F __start_kubectl k
  else
      echo -e "${RED}For k completion please install bash-completion${RESTORE}"
  fi

  # Set up PS1 prompt
  if [ "$(id -u)" = "0" ]; then
    SETCOLOR_USER='\[ESC[1;31m\]'
    SET_SEP='# '
  else
    SETCOLOR_USER='\[ESC[1;32m\]'
    SET_SEP="$ "
  fi

  # Set up PS1 prompt

  export PS1="${PS_CYAN}[$PS_RESTORE($PS_CONTEXT_COLOR\$KUBECTL_CONTEXT$PS_RESTORE/$PS_NAMESPACE_COLOR\$KUBECTL_NAMESPACE$PS_RESTORE) ${PS_CYAN}\w]${SET_SEP}${PS_RESTORE}"

  reloadExtensions

  echo ""
  echo -e "Context: $CONTEXT_COLOR$KUBECTL_CONTEXT$RESTORE"
  echo -e "Namespace: $NAMESPACE_COLOR$KUBECTL_NAMESPACE$RESTORE"
}
export -f k8sh_init

echo "Initializing..."
bash -i <<< 'k8sh_init; exec </dev/tty'
