#!/usr/bin/env bash
# Xserver VPS (Ubuntu Desktop / GNOME) Codex サンドボックス用 初期化スクリプト
# 使い方: GNOME デスクトップ内のターミナルから
#   curl -fsSL https://st274264.static.jp/setup.sh | bash
set -eo pipefail

say() { printf '\n\033[1;36m==> %s\033[0m\n' "$*"; }

say "1. apt: 基本ツール + C/C++ + ユーティリティ"
sudo apt-get update
sudo apt-get install -y \
    git build-essential curl ca-certificates \
    ripgrep fd-find jq yq unzip tmux \
    python3-pip python3-venv pipx \
    clang cmake ninja-build

say "2. NOPASSWD sudo (sandbox 用)"
echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/90-codex >/dev/null
sudo chmod 440 /etc/sudoers.d/90-codex

say "3. nvm + Node.js (20 / 21 / LTS)"
if [ ! -s "$HOME/.nvm/nvm.sh" ]; then
  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
fi
. "$HOME/.nvm/nvm.sh"
nvm install 20
nvm install 21
nvm install --lts
nvm alias default 'lts/*'

say "4. Node グローバルツール (yarn / pnpm / bun / eslint / prettier)"
npm install -g yarn pnpm eslint prettier
if [ ! -x "$HOME/.bun/bin/bun" ]; then
  curl -fsSL https://bun.sh/install | bash
fi

say "5. Python: pipx + uv + (poetry / black / mypy / pytest / ruff / conan)"
pipx ensurepath
curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
for tool in poetry black mypy pytest ruff conan; do
  pipx install "$tool" || true
done

say "6. Rust toolchain (rustup + stable)"
if ! command -v rustup >/dev/null 2>&1 && [ ! -x "$HOME/.cargo/bin/rustup" ]; then
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
fi

say "7. git 初期設定"
git config --global user.name  "codex"
git config --global user.email "codex@vps.local"
git config --global init.defaultBranch main
git config --global pull.rebase false

say "8. swap 2GB"
if ! swapon --show | grep -q '^/swapfile'; then
  sudo fallocate -l 2G /swapfile
  sudo chmod 600 /swapfile
  sudo mkswap /swapfile
  sudo swapon /swapfile
fi
sudo sed -i '/swapfile/d' /etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab >/dev/null

say "9. Bash 履歴 QoL"
if ! grep -q '# codex sandbox: bash history' "$HOME/.bashrc"; then
  cat >> "$HOME/.bashrc" <<'EOF'

# codex sandbox: bash history tuning
HISTSIZE=100000
HISTFILESIZE=200000
HISTCONTROL=ignoreboth:erasedups
shopt -s histappend
PROMPT_COMMAND="history -a; ${PROMPT_COMMAND:-}"
EOF
fi

say "10. GNOME パフォーマンス + ロック/スリープ無効化"
gsettings set org.gnome.desktop.interface enable-animations false || true
gsettings set org.gnome.desktop.interface enable-hot-corners false || true
gsettings set org.gnome.desktop.search-providers disable-external true || true
gsettings set org.gnome.desktop.session idle-delay 0 || true
gsettings set org.gnome.desktop.screensaver lock-enabled false || true
gsettings set org.gnome.desktop.screensaver idle-activation-enabled false || true
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing' || true
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'nothing' || true

systemctl --user mask \
    tracker-extract-3.service \
    tracker-miner-fs-3.service \
    tracker-miner-fs-control-3.service \
    tracker-miner-rss-3.service \
    tracker-writeback-3.service \
    tracker-xdg-portal-3.service 2>/dev/null || true
tracker3 daemon -t 2>/dev/null || true

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf >/dev/null
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

say "11. 確認"
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$HOME/.bun/bin:$PATH"
node -v && npm -v
python3 --version
uv --version 2>/dev/null   || echo "(uv: シェル再起動後に確認)"
pipx --version
cargo --version 2>/dev/null || echo "(cargo: シェル再起動後に確認)"
bun --version 2>/dev/null   || echo "(bun: シェル再起動後に確認)"
git --version

say "完了 — シェルを開き直すと PATH/履歴設定が完全反映されます"
