#!/usr/bin/env bash
set -e

echo "=== 更新 APT ==="
sudo apt update

# --------------------------------------------------
# 函数：检查命令是否存在
# --------------------------------------------------
exists() {
	command -v "$1" >/dev/null 2>&1
}

# --------------------------------------------------
# 函数：检测 apt 包是否已安装
# --------------------------------------------------
pkg_installed() {
	dpkg -s "$1" >/dev/null 2>&1
}

# --------------------------------------------------
# 需要安装的基础软件
# --------------------------------------------------
APT_PACKAGES=(
	curl
	unzip
	luarocks
	build-essential
	kitty
	imagemagick
	fzf
)

echo "=== 安装基础软件（自动检测） ==="
for pkg in "${APT_PACKAGES[@]}"; do
	if pkg_installed "$pkg"; then
		echo "[跳过] $pkg 已安装"
	else
		echo "[安装] $pkg"
		sudo apt install -y "$pkg"
	fi
done

# --------------------------------------------------
# Node.js 20.x 安装（自动检测版本）
# --------------------------------------------------
echo "=== 检查 Node.js 版本 ==="

install_node20() {
	echo "[安装] Node.js 20.x（来自 NodeSource）"
	curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
	sudo apt install -y nodejs
}

if exists node; then
	NODE_MAJOR=$(node -v | cut -d 'v' -f2 | cut -d '.' -f1)
	if [ "$NODE_MAJOR" -ge 20 ]; then
		echo "[跳过] Node.js >= 20 已满足要求 (当前 $(node -v))"
	else
		echo "[升级] Node.js 版本太低：$(node -v)"
		install_node20
	fi
else
	echo "[安装] Node.js 未安装 → 安装 Node 20"
	install_node20
fi

echo "Node.js 版本：$(node -v)"
echo "npm 版本：$(npm -v)"

# --------------------------------------------------
# Mermaid CLI（跳过 puppeteer 下载 Chrome）
# --------------------------------------------------
echo "=== 安装 Mermaid CLI ==="
if exists mmdc; then
	echo "[跳过] Mermaid CLI 已安装"
else
	echo "[安装] Mermaid CLI（跳过浏览器下载）"
	PUPPETEER_SKIP_DOWNLOAD=1 sudo npm install -g @mermaid-js/mermaid-cli
fi

# --------------------------------------------------
# Tectonic
# --------------------------------------------------
if exists tectonic; then
	echo "[跳过] Tectonic 已安装"
else
	echo "[安装] Tectonic"
	wget -O tectonic.tar.gz https://github.com/tectonic-typesetting/tectonic/releases/download/tectonic%400.15.0/tectonic-0.15.0-x86_64-unknown-linux-gnu.tar.gz
	tar -zxf tectonic.tar.gz
	sudo mv tectonic /usr/local/bin/
fi

# --------------------------------------------------
# Nerd Font JetBrainsMono
# --------------------------------------------------
FONT_DIR="/usr/share/fonts/JetBrainsMono"
if [ -d "$FONT_DIR" ]; then
	echo "[跳过] JetBrainsMono Nerd Font 已存在"
else
	echo "[安装] Nerd Font JetBrainsMono"
	sudo mkdir -p "$FONT_DIR"
	wget -O JetBrainsMono.zip https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.0/JetBrainsMono.zip
	unzip JetBrainsMono.zip -d "$FONT_DIR"
	sudo fc-cache -fv
fi

# --------------------------------------------------
# LazyGit
# --------------------------------------------------
if exists lazygit; then
	echo "[跳过] LazyGit 已安装"
else
	echo "[安装] LazyGit"
	LAZYGIT_VERSION=$(curl -s https://api.github.com/repos/jesseduffield/lazygit/releases/latest | grep tag_name | cut -d '"' -f 4)
	curl -Lo lazygit.tar.gz \
		"https://github.com/jesseduffield/lazygit/releases/download/${LAZYGIT_VERSION}/lazygit_${LAZYGIT_VERSION#v}_Linux_x86_64.tar.gz"
	tar xf lazygit.tar.gz
	sudo install lazygit /usr/local/bin/
fi

# --------------------------------------------------
# ripgrep
# --------------------------------------------------
if exists rg; then
	echo "[跳过] ripgrep 已安装"
else
	echo "[安装] ripgrep"
	sudo apt install -y ripgrep
fi

# --------------------------------------------------
# fd
# --------------------------------------------------
if exists fd; then
	echo "[跳过] fd 已安装"
else
	echo "[安装] fd"
	wget -O fd.tar.gz https://github.com/sharkdp/fd/releases/download/v10.3.0/fd-v10.3.0-x86_64-unknown-linux-gnu.tar.gz
	tar -zxf fd.tar.gz
	sudo install fd-v10.3.0-x86_64-unknown-linux-gnu/fd /usr/local/bin/fd
fi

# --------------------------------------------------
# tree-sitter
# --------------------------------------------------
if exists tree-sitter; then
	echo "[跳过] tree-sitter 已安装"
else
	echo "[安装] tree-sitter"
	wget https://github.com/tree-sitter/tree-sitter/releases/download/v0.25.10/tree-sitter-linux-x64.gz
	gunzip tree-sitter-linux-x64.gz
	chmod +x tree-sitter-linux-x64
	sudo mv tree-sitter-linux-x64 /usr/local/bin/tree-sitter
fi

# --------------------------------------------------
# Neovim v0.11.5
# --------------------------------------------------
if exists nvim; then
	echo "[跳过] Neovim 已安装"
else
	echo "[安装] Neovim v0.11.5"
	wget -O nvim.tar.gz https://github.com/neovim/neovim/releases/download/v0.11.5/nvim-linux-x86_64.tar.gz
	tar -zxf nvim.tar.gz
	sudo mv nvim-linux-x86_64 /opt/nvim
	sudo ln -sf /opt/nvim/bin/nvim /usr/local/bin/nvim
fi

# --------------------------------------------------
# LazyVim Starter
# --------------------------------------------------
NVIM_DIR="$HOME/.config/nvim"
if [ -d "$NVIM_DIR" ]; then
	echo "[跳过] ~/.config/nvim 目录已存在"
else
	echo "[安装] LazyVim Starter"
	mkdir -p ~/.config
	cd ~/.config
	git clone https://github.com/LazyVim/starter ./nvim
	cd nvim
	rm -rf .git
fi

echo "====================================="
echo " 所有开发工具安装完成！可以使用 nvim "
echo "====================================="
