#!/usr/bin/env bash
# ============================================================
# Komari 自动修复脚本
# 检测已安装的 Server/Agent 二进制，SHA256 校验失败则重新下载
# 用法: sudo bash <(curl -s http://8.134.130.124/komari/re-download.sh)
# ============================================================
set -euo pipefail

MIRROR="http://8.134.130.124/komari"
MAX_RETRIES=3

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
info()  { echo -e "${CYAN}[INFO]${NC} $*"; }
ok()    { echo -e "${GREEN}[OK]${NC} $*"; }
warn()  { echo -e "${YELLOW}[WARN]${NC} $*"; }
err()   { echo -e "${RED}[ERR]${NC} $*" >&2; exit 1; }

[ "$(id -u)" -eq 0 ] || err "需要 root 权限，请用 sudo 运行"

echo ""
echo "  ╔══════════════════════════════════════╗"
echo "  ║   Komari 自动修复                     ║"
echo "  ╚══════════════════════════════════════╝"
echo ""

# ── 获取 checksums ──
CHECKSUMS=$(curl -sS "$MIRROR/checksums.txt" 2>/dev/null) || err "无法获取 checksums.txt"

# ── 检测架构 ──
ARCH=$(uname -m)
case "$ARCH" in
    x86_64|amd64)  SERVER_BIN="komari-linux-amd64";   AGENT_BIN="komari-agent-linux-amd64" ;;
    aarch64|arm64) SERVER_BIN="komari-linux-arm64";   AGENT_BIN="komari-agent-linux-arm64" ;;
    i386|i686)     SERVER_BIN="komari-linux-386";     AGENT_BIN="komari-agent-linux-386"   ;;
    loongarch64)   SERVER_BIN="komari-linux-loong64";  AGENT_BIN="" ;;
    riscv64)       SERVER_BIN="komari-linux-riscv64";  AGENT_BIN="" ;;
    armv7l|arm)    SERVER_BIN="";                      AGENT_BIN="komari-agent-linux-arm"   ;;
    *) err "不支持的架构: $ARCH" ;;
esac
info "架构: $ARCH"

# ── 修复函数 ──
repair() {
    local name="$1" dest="$2" service="$3"
    [ -z "$name" ] && return 0
    [ -z "$dest" ] && return 0

    local expected
    expected=$(echo "$CHECKSUMS" | grep " $name\$" | awk '{print $1}')
    [ -n "$expected" ] || { warn "$name 不在 checksums.txt 中，跳过"; return 0; }

    if [ -f "$dest" ]; then
        local actual
        actual=$(sha256sum "$dest" | awk '{print $1}')
        if [ "$expected" = "$actual" ]; then
            ok "$name 校验通过，无需修复"
            return 0
        fi
        warn "$name 校验失败，重新下载"
        rm -f "$dest"
    else
        info "$name 不存在，开始下载"
    fi

    local attempt=1
    while [ $attempt -le $MAX_RETRIES ]; do
        info "下载 $name (第 $attempt/$MAX_RETRIES 次)..."
        local tmpfile
        tmpfile=$(mktemp)
        if curl -#fSL "$MIRROR/$name" -o "$tmpfile" 2>/dev/null; then
            local actual
            actual=$(sha256sum "$tmpfile" | awk '{print $1}')
            if [ "$expected" = "$actual" ]; then
                ok "$name 下载成功，SHA256 通过"
                mv "$tmpfile" "$dest"
                chmod +x "$dest"
                if [ -n "$service" ] && systemctl list-units --type=service 2>/dev/null | grep -q "$service"; then
                    info "重启 $service..."
                    systemctl restart "$service"
                    ok "$service 已重启"
                fi
                return 0
            else
                warn "SHA256 不匹配"
                rm -f "$tmpfile"
            fi
        else
            warn "下载失败"
            rm -f "$tmpfile"
        fi
        attempt=$((attempt + 1))
        [ $attempt -le $MAX_RETRIES ] && sleep 3
    done
    err "$name 修复失败，已重试 $MAX_RETRIES 次"
}

repair "$SERVER_BIN" "/opt/komari/komari" "komari"
repair "$AGENT_BIN"  "/usr/local/bin/komari-agent" "komari-agent"

echo ""
ok "修复完成"
echo ""
