#! /usr/bin/env bash
# shellcheck disable=SC2034,SC1090
# SC2034 variables appear unsued. export if used externally
# - uneeded, as this checked whether script is sourced
# SC1090 Can't follow non-constant source

# Use basename instead of ${0:##*/} to be POSIX compliant
# Some shells return -<name> in $0 when sourced, ${0#-} drops that initial dash
BASE_0=${BASE_0:-$(basename -- "${0#-}")}
SCRIPT_DIR=${SCRIPT_DIR:-"$( cd -- "$( dirname -- "$0" )" &> /dev/null && pwd )"}
BASE_SHELL=$(basename "$SHELL")

# Helper function
is_sourced() {
    DBG_="$(
        printf '\n\t\t%-12s%s' '$0:' "$0" BASE_0: "$BASE_0" BASE_SHELL: "$BASE_SHELL"
    )"
    if [ -n "$ZSH_VERSION" ]; then 
        case $ZSH_EVAL_CONTEXT in *:file:*) return 0;; esac
    else
        case "$(basename -- "${0}")" in $BASE_SHELL|-$BASE_SHELL) return 0;; esac
    fi
    return 1; # NOT sourced.
}

if [[ "$1" == '-' ]]; then
    printf 'BASE_0="%s"\nSCRIPT_DIR=%s\n' "${BASE_0}" "${SCRIPT_DIR}"
    cat "${BASH_SOURCE[0]}"
elif is_sourced; then
    # This part is sourced, and might run in a non-bash shell
    DBG_="Is Sourced"
    USER_HOME=$HOME
    [[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")"

    [[ -n "$KUBECONFIG" && -r "$KUBECONFIG" ]] || unset KUBECONFIG
    
    [[ ! -r "$HOME/.kube/config" ]] \
    || export KUBECONFIG="${KUBECONFIG:-$HOME/.kube/config}"

    if [[ -z "$KUBECONFIG" && -z "$FIX_KUBECTL_RECALL"  ]]; then
        (unset kubectl 2>/dev/null) || (unalias kubectl 2>/dev/null) || true
    
        export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
    fi
    
    (unset kubectl-fix 2> /dev/null) || true
    
    DBG_="Check if k3s exists, but kubectl isn't available"
    if (type 'k3s' >/dev/null 2>&1) && ! (type 'kubectl' >/dev/null 2>&1); then
        DBG_="Define kubectl"
        if [[ -r "${KUBECONFIG}" ]]; then
            kubectl() { k3s kubectl "${@}"; }
        elif [[ -n "${KUBECONFIG}" && -e "${KUBECONFIG}" ]]; then
            eval "
            kubectl-fix() {
                mkdir \"$HOME/.kube\" -p
                if [[ -e \"\${KUBECONFIG}\" && ! -r \"$HOME/.kube/config\" ]]; then
                    sudo install --mod 600 --owner \"$USER\" \"\${KUBECONFIG}\" \"$HOME/.kube/config\"
                    unset KUBECONFIG
                fi
                FIX_KUBECTL_RECALL=1 . \"${SCRIPT_DIR}/${BASE_0}\"
            }"
	    printf '%s\n' \
                "KUBECONFIG[${KUBECONFIG}] exsits, but is unreadable." \
                'Run kubectl-fix (which will invoke sudo) to fix'
        fi
    fi
    
    if (type 'kubectl' >/dev/null 2>&1); then
    
        . <( kubectl completion "${BASE_SHELL}" )
    
        if (type 'kubectl-cnpg' >/dev/null 2>&1 ); then
            . <( kubectl cnpg completion "${BASE_SHELL}" )
        fi
        if ! (type 'kubectl-cnpg' >/dev/null 2>&1) || [[ -n "$UPGRADE" ]]; then
            DL_VER=1.22.0
            GH_URL=https://github.com/cloudnative-pg/cloudnative-pg
            DL_FILE="kubectl-cnpg_${DL_VER}_linux_x86_64.deb"
            URL=${GH_URL}/releases/download/v${DL_VER}/${DL_FILE}
            printf '%s\n' \
            'To download and install cnpg kubectl plugin, run:' \
                "    curl -sSLO ${URL}" \
                "    sudo dpkg -i $DL_FILE"
        fi
    
        if ! (type 'kubetui' >/dev/null 2>&1) || [[ -n "$UPGRADE" ]]; then
            DL_VER=1.5.0
            GH_URL=https://github.com/sarub0b0/kubetui
            DL_FILE=kubetui-x86_64-unknown-linux-musl-rustls
            URL=${GH_URL}/releases/download/v${DL_VER}/${DL_FILE}
            printf '%s\n' \
            'To download and install kubetui, run:' \
                "    curl -sSL ${URL} > ~/bin/kubetui" \
                "    chmod +x ~/bin/kubetui"
        fi
    
        if ! (type 'k9s' >/dev/null 2>&1) || [[ -n "$UPGRADE" ]]; then
            printf '%s\n' \
            'To download and install k9s, run:' \
                "    curl -sS https://webinstall.dev/k9s | bash"
        fi
    
        if (type 'k3s' >/dev/null 2>&1 ); then
            . <( k3s completion "${SHELL##*/}" )
        fi
    
        if (type 'helm' >/dev/null 2>&1); then
            . <( helm completion "${SHELL##*/}" 2>/dev/null )
        fi
    
        kg() {
    	kubectl get "${NS:+--namespace=}${NS:---all-namespaces}" "${@:-pods}" | { sed -u 1q; sort; }
        }
    fi
else
    SCRIPT_NAME="$BASE_0"
    printf '%s\n' \
        "It seems $SCRIPT_NAME was invoked as a script. It should be sourced instead." \
	'The easiest way is to call it like this:' \
	"    $ . <( $SCRIPT_NAME - ) # Note the '-' after the script's name" \
        ''
fi