#!/usr/bin/env bash
# k3s / kubectl 补全与别名配置脚本（兼容 bash + zsh）

set -e

# ---------- 检测当前真正在执行本脚本的 shell ----------
# 优先看解释器自带的版本变量（最可靠），$SHELL 只是登录 shell，
# 不代表你用什么解释器跑这个脚本（例如登录是 bash，却用 zsh script.sh 执行）。
detect_shell() {
    if [ -n "$ZSH_VERSION" ]; then
        echo "zsh"
    elif [ -n "$BASH_VERSION" ]; then
        echo "bash"
    else
        case "$SHELL" in
            */zsh)  echo "zsh" ;;
            */bash) echo "bash" ;;
            *)      echo "unknown" ;;
        esac
    fi
}

SHELL_TYPE=$(detect_shell)

if [ "$SHELL_TYPE" = "unknown" ]; then
    echo "❌ 无法识别 shell（仅支持 bash / zsh）"
    exit 1
fi

echo "🔍 检测到 shell: $SHELL_TYPE"

# ---------- 检查命令 ----------
if ! command -v kubectl >/dev/null 2>&1; then
    echo "❌ 未找到 kubectl，请先安装 k3s"
    exit 1
fi

HAS_K3S=false
if command -v k3s >/dev/null 2>&1; then
    HAS_K3S=true
fi

# ---------- 提示 KUBECONFIG ----------
if [ -z "$KUBECONFIG" ] && [ -f /etc/rancher/k3s/k3s.yaml ]; then
    echo "📌 检测到 k3s kubeconfig，建议设置："
    echo "   export KUBECONFIG=/etc/rancher/k3s/k3s.yaml"
fi

# ---------- bash 配置 ----------
setup_bash() {
    echo "⚙️  配置 bash 补全..."

    mkdir -p ~/.bash_completion.d

    kubectl completion bash > ~/.bash_completion.d/kubectl

    if [ "$HAS_K3S" = true ]; then
        k3s completion bash > ~/.bash_completion.d/k3s 2>/dev/null || true
    fi

    cat > /tmp/k3s_rc_snippet << 'SNIPPET_EOF'

# ===== k3s / kubectl 补全与别名 (auto-generated) =====
[[ -f ~/.bash_completion.d/kubectl ]] && source ~/.bash_completion.d/kubectl
[[ -f ~/.bash_completion.d/k3s ]] && source ~/.bash_completion.d/k3s

alias k='kubectl'
alias kg='kubectl get'
alias kgp='kubectl get pods'
alias kgpa='kubectl get pods -A'
alias kgn='kubectl get nodes'
alias kgs='kubectl get svc'
alias kgd='kubectl get deploy'
alias kd='kubectl describe'
alias kdp='kubectl describe pod'
alias kl='kubectl logs'
alias klf='kubectl logs -f'
alias kx='kubectl exec -it'
alias ka='kubectl apply -f'
alias kdel='kubectl delete'
alias kns='kubectl config set-context --current --namespace'

complete -o default -F __start_kubectl k
complete -o default -F __start_kubectl kg
complete -o default -F __start_kubectl kgp
complete -o default -F __start_kubectl kgpa
complete -o default -F __start_kubectl kgn
complete -o default -F __start_kubectl kgs
complete -o default -F __start_kubectl kgd
complete -o default -F __start_kubectl kd
complete -o default -F __start_kubectl kdp
complete -o default -F __start_kubectl kl
complete -o default -F __start_kubectl klf
complete -o default -F __start_kubectl kx
complete -o default -F __start_kubectl ka
complete -o default -F __start_kubectl kdel
# ===== end =====
SNIPPET_EOF

    echo "✅ bash 补全文件已生成到 ~/.bash_completion.d/"
}

# ---------- zsh 配置 ----------
setup_zsh() {
    echo "⚙️  配置 zsh 补全..."

    mkdir -p ~/.zsh/completions

    kubectl completion zsh > ~/.zsh/completions/_kubectl

    if [ "$HAS_K3S" = true ]; then
        k3s completion zsh > ~/.zsh/completions/_k3s 2>/dev/null || true
    fi

    cat > /tmp/k3s_rc_snippet << 'SNIPPET_EOF'

# ===== k3s / kubectl 补全与别名 (auto-generated) =====
fpath=(~/.zsh/completions $fpath)
autoload -Uz compinit
compinit -C

alias k='kubectl'
alias kg='kubectl get'
alias kgp='kubectl get pods'
alias kgpa='kubectl get pods -A'
alias kgn='kubectl get nodes'
alias kgs='kubectl get svc'
alias kgd='kubectl get deploy'
alias kd='kubectl describe'
alias kdp='kubectl describe pod'
alias kl='kubectl logs'
alias klf='kubectl logs -f'
alias kx='kubectl exec -it'
alias ka='kubectl apply -f'
alias kdel='kubectl delete'
alias kns='kubectl config set-context --current --namespace'

compdef k=kubectl
compdef kg=kubectl
compdef kgp=kubectl
compdef kgpa=kubectl
compdef kgn=kubectl
compdef kgs=kubectl
compdef kgd=kubectl
compdef kd=kubectl
compdef kdp=kubectl
compdef kl=kubectl
compdef klf=kubectl
compdef kx=kubectl
compdef ka=kubectl
compdef kdel=kubectl
# ===== end =====
SNIPPET_EOF

    echo "✅ zsh 补全文件已生成到 ~/.zsh/completions/"
}

# ---------- 执行配置 ----------
case "$SHELL_TYPE" in
    bash) setup_bash ;;
    zsh)  setup_zsh  ;;
esac

# ---------- 写入 rc 文件（兼容 bash/zsh） ----------
RC_FILE=""
if [ "$SHELL_TYPE" = "bash" ]; then
    RC_FILE="$HOME/.bashrc"
elif [ "$SHELL_TYPE" = "zsh" ]; then
    RC_FILE="$HOME/.zshrc"
fi

echo
printf "是否把配置写入 %s 实现永久生效？(y/N): " "$RC_FILE"

# -r 防止反斜杠转义；stdin 非终端（如 curl | zsh）时读不到输入则默认 N，不因 set -e 中断
if ! read -r confirm; then
    confirm="n"
fi

if [[ "$confirm" == [Yy]* ]]; then
    if grep -q "k3s / kubectl 补全与别名" "$RC_FILE" 2>/dev/null; then
        echo "⚠️  $RC_FILE 中已存在相关配置，跳过写入"
    else
        cat /tmp/k3s_rc_snippet >> "$RC_FILE"
        echo "✅ 已写入 $RC_FILE"
        echo "请执行： source $RC_FILE"
    fi
else
    echo
    echo "可手动把以下内容添加到 $RC_FILE："
    echo "----------------------------------------"
    cat /tmp/k3s_rc_snippet
    echo "----------------------------------------"
fi

rm -f /tmp/k3s_rc_snippet

echo
echo "🎉 配置完成！"
echo "测试："
echo "  k get po <Tab>"
echo "  kgp <Tab>"
echo "  k3s <Tab>"