#!/bin/bash
# 检查常用软件包是否在软件源中存在（可安装）
# 使用方法：./check-missing-packages.sh [--no-update] [package1 package2 ...]

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 扩展后的常用软件包列表（按类别整理，已修正包名并剔除需第三方源的包）
DEFAULT_PACKAGES=(
    # ---------- 系统工具 ----------
    lm-sensors
    htop
    btop
    neofetch
    tmux
    screen
    tree
    ncdu
    rsync
    mc                      # Midnight Commander
    ranger                  # 命令行文件管理器
    fzf                     # 模糊查找器
    bat                     # 带语法高亮的 cat
    eza                     # 现代的 ls 替代品（原 exa 已由 eza 替代）
    duf                     # 磁盘使用情况查看器
    glances                 # 系统监控
    bashtop                 # 资源监视器
    bpytop                  # bashtop 的 Python 实现
    nmon                    # 性能监控
    sysstat                 # 系统性能工具（sar, iostat）
    byobu                   # 增强的 screen/tmux
    mosh                    # 移动 shell
    taskwarrior             # 任务管理
    timewarrior             # 时间追踪

    # ---------- 网络工具 ----------
    curl
    wget
    net-tools               # ifconfig, netstat
    iputils-ping            # ping
    traceroute
    mtr                      # 路由追踪+ping
    nload                    # 网络流量监控
    iftop                    # 按连接显示带宽
    iperf3                   # 网络性能测试
    dnsutils                 # dig, nslookup
    nmap                     # 端口扫描
    tcpdump                  # 抓包
    ethtool                  # 网卡配置
    bridge-utils             # 网桥管理
    wireless-tools           # iwconfig 等
    whois                    # whois 查询
    openssh-client           # ssh 客户端（通常已安装）
    openssh-server           # ssh 服务端
    nethogs                  # 按进程显示带宽
    bmon                     # 带宽监控

    # ---------- 开发工具 ----------
    build-essential          # gcc, make 等
    gcc
    g++
    make
    cmake
    git
    git-lfs                  # Git 大文件存储
    subversion               # svn
    mercurial                # hg
    python3
    python3-pip
    python3-venv
    python3-dev
    python3-virtualenv
    nodejs                   # Ubuntu 官方源提供旧版，但存在
    npm
    yarnpkg                  # 或 yarn
    openjdk-17-jdk           # Java 17
    openjdk-21-jdk           # Java 21
    maven                    # Java 构建工具
    gradle                   # Java 构建工具
    golang-go                # Go 语言
    rustc                    # Rust 编译器（官方源提供）
    cargo                    # Rust 包管理器
    php                      # PHP 解释器
    php-cli
    php-fpm
    composer                 # PHP 依赖管理
    ruby-full                # Ruby
    gem                      # RubyGems
    lua5.4                   # Lua 语言
    luajit                   # LuaJIT
    perl
    swig                     # 简化 C/C++ 与其他语言交互
    valgrind                 # 内存调试
    gdb                      # GNU 调试器
    strace                   # 系统调用跟踪
    ltrace                   # 库调用跟踪
    linux-tools-common       # perf 等工具（可能需要 linux-tools-$(uname -r)）

    # ---------- 服务器/服务 ----------
    nginx
    apache2
    mariadb-server
    mariadb-client
    postgresql
    redis-server
    memcached
    rabbitmq-server
    docker.io                # Docker 社区版（官方源提供旧版）
    docker-compose           # 可能需安装 docker-compose-plugin 或 python3-docker
    containerd
    ansible                  # 自动化运维

    # ---------- 数据库工具 ----------
    mysql-client             # 替代 mariadb-client
    postgresql-client
    sqlite3
    sqlitebrowser            # 图形化 SQLite 浏览器（如果桌面）
    mycli                    # MySQL 命令行增强
    pgcli                    # PostgreSQL 命令行增强
    redis-tools

    # ---------- 安全和防火墙 ----------
    ufw
    fail2ban
    rkhunter                 # Rootkit 检测
    chkrootkit
    aide                     # 文件完整性检查
    lynis                    # 安全审计
    clamav                   # 防病毒
    clamav-daemon
    firewalld                # 防火墙（与 ufw 二选一）
    iptables                 # 防火墙规则管理（通常已内置）
    nftables                 # 新一代防火墙

    # ---------- 编辑器 ----------
    vim
    nano
    emacs
    micro                    # 现代命令行编辑器
    neovim

    # ---------- 压缩/归档 ----------
    zip
    unzip
    gzip
    tar
    bzip2
    xz-utils
    p7zip-full
    p7zip-rar
    unrar
    arj
    cabextract
    sharutils
    uudeview

    # ---------- 多媒体 ----------
    ffmpeg
    yt-dlp                   # YouTube 下载器（官方源提供）
    imagemagick
    graphicsmagick
    libimage-exiftool-perl   # exiftool 的包名（原 exiftool 已修正）
    sox                      # 音频处理
    mplayer
    mpv
    vlc                      # 如果桌面

    # ---------- 办公/文档 ----------
    pandoc
    texlive-base
    texlive-latex-extra
    ghostscript
    poppler-utils            # pdftoppm, pdfinfo 等

    # ---------- 文本处理/查找 ----------
    ripgrep                  # rg，快速搜索
    fd-find                  # fd，find 替代品
    tldr                     # 简化的 man 手册

    # ---------- 杂项 ----------
    jq                       # JSON 处理
    yq                       # YAML 处理（python3-yq 或 yq）
    xmlstarlet               # XML 处理
    html-xml-utils
    tofrodos                 # dos2unix/unix2dos
    dos2unix                 # 包含 unix2dos 命令
    time                     # GNU time（有时未预装）
    moreutils                # 包含 sponge, ts 等
    parallel                 # GNU parallel
    sshfs                    # SSH 文件系统
    screenfetch              # 类似 neofetch 的旧工具
    lolcat                   # 彩虹色输出（娱乐）
    cowsay                   # 娱乐
    fortune-mod              # 格言
    sl                       # 蒸汽机车（娱乐）
    cmatrix                  # 黑客帝国字符矩阵
    figlet                   # 生成 ASCII 艺术字
    toilet                   # 另一个 ASCII 艺术字工具
    boxes                    # 文本周围画框
    hollywood                # 黑客帝国式终端动画
)

# 解析参数（保持不变）
UPDATE_APT=true
CUSTOM_PACKAGES=()

while [[ $# -gt 0 ]]; do
    case $1 in
        --no-update)
            UPDATE_APT=false
            shift
            ;;
        -h|--help)
            echo "用法: $0 [--no-update] [软件包列表]"
            echo "  --no-update    不自动运行 apt update（假设缓存已最新）"
            echo "  软件包列表      可选，指定要检查的包（空格分隔）"
            exit 0
            ;;
        *)
            CUSTOM_PACKAGES+=("$1")
            shift
            ;;
    esac
done

# 确定最终要检查的包列表
if [ ${#CUSTOM_PACKAGES[@]} -gt 0 ]; then
    CHECK_PACKAGES=("${CUSTOM_PACKAGES[@]}")
else
    CHECK_PACKAGES=("${DEFAULT_PACKAGES[@]}")
fi

# 检查 root 权限（仅更新时需要）
if [ "$UPDATE_APT" = true ] && [ "$EUID" -ne 0 ]; then
    echo -e "${YELLOW}提示: 运行 apt update 需要 root 权限，将尝试使用 sudo...${NC}"
    if ! command -v sudo &>/dev/null; then
        echo -e "${RED}错误: 未找到 sudo 命令，且当前非 root。请以 root 运行或使用 --no-update。${NC}"
        exit 1
    fi
fi

# 更新软件包列表（可选）
if [ "$UPDATE_APT" = true ]; then
    echo -e "${YELLOW}正在更新软件包列表 (apt update)...${NC}"
    if sudo apt update; then
        echo -e "${GREEN}软件包列表更新成功。${NC}"
    else
        echo -e "${RED}警告: apt update 执行失败，缓存可能过时，结果可能不准确。${NC}"
    fi
else
    echo -e "${YELLOW}跳过 apt update，使用现有缓存。${NC}"
fi

# 检查每个包的可用性
MISSING=()
FOUND=()

echo -e "\n${YELLOW}正在检查软件包可用性...${NC}\n"

for pkg in "${CHECK_PACKAGES[@]}"; do
    candidate=$(apt policy "$pkg" 2>/dev/null | grep -E "^ *Candidate:" | awk '{print $2}')
    if [ -n "$candidate" ] && [ "$candidate" != "(none)" ]; then
        echo -e "[${GREEN}可用${NC}] $pkg (候选版本: $candidate)"
        FOUND+=("$pkg")
    else
        echo -e "[${RED}缺失${NC}] $pkg (在软件源中未找到)"
        MISSING+=("$pkg")
    fi
done

# 汇总报告
echo -e "\n========================================="
echo -e "           检查结果汇总"
echo -e "========================================="
echo -e "共检查 ${#CHECK_PACKAGES[@]} 个软件包"
echo -e "可用: ${GREEN}${#FOUND[@]}${NC} 个"
echo -e "缺失: ${RED}${#MISSING[@]}${NC} 个"

if [ ${#MISSING[@]} -gt 0 ]; then
    echo -e "\n${RED}缺失的软件包列表:${NC}"
    for pkg in "${MISSING[@]}"; do
        echo "  - $pkg"
    done
    echo -e "\n${YELLOW}可能的原因及解决方法:${NC}"
    echo "  1. 软件源配置不完整或错误（如缺少 main/universe 组件）"
    echo "  2. 软件源镜像未同步完全（可尝试更换镜像源）"
    echo "  3. 软件包名称拼写错误或该包确实不适用于当前发行版/架构"
    echo "  4. 某些包可能需要启用额外的源（如 Docker、NodeSource）"
    echo "  5. 未执行 apt update 或缓存过期（使用 --no-update 时）"
    echo ""
    echo "建议运行以下命令重新配置源并更新："
    echo "  sudo armbian-apt   # 重新选择镜像源"
    echo "  sudo apt update"
    echo "  然后重新运行本脚本。"
else
    echo -e "\n${GREEN}所有检查的软件包均可用！${NC}"
fi

# 如果使用了自定义列表，提示默认列表
if [ ${#CUSTOM_PACKAGES[@]} -gt 0 ]; then
    echo -e "\n${YELLOW}提示：你检查的是自定义包列表。如需检查默认常用包，请直接运行 $0 而不带参数。${NC}"
fi