#!/usr/bin/env bash
# ============================================================
# Komari Server 一键安装脚本
# 自动检测架构 → 下载 → SHA256 校验 → 安装 → systemd 注册启动
# 用法: bash <(curl -s http://8.134.130.124/komari/server-install.sh)
# ============================================================
set -euo pipefail

MIRROR="http://8.134.130.124/komari"
INSTALL_DIR="/opt/komari"
LISTEN_ADDR="0.0.0.0:25774"
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; }

echo ""
echo "  ╔══════════════════════════════════════╗"
echo "  ║   Komari Server 一键安装              ║"
echo "  ╚══════════════════════════════════════╝"
echo ""

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

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

# ── 获取校验值 ──
info "获取 SHA256 校验值..."
CHECKSUMS=$(curl -sS "$MIRROR/checksums.txt" 2>/dev/null) || err "无法获取 checksums.txt"
EXPECTED=$(echo "$CHECKSUMS" | grep " $BINARY\$" | awk '{print $1}')
[ -n "$EXPECTED" ] || err "checksums.txt 中未找到 $BINARY"

# ── 检查现有安装 ──
if [ -f "$INSTALL_DIR/komari" ]; then
    ACTUAL=$(sha256sum "$INSTALL_DIR/komari" | awk '{print $1}')
    if [ "$EXPECTED" = "$ACTUAL" ]; then
        ok "已安装相同版本，跳过下载"
    else
        warn "现有版本校验不匹配，将重新下载"
        rm -f "$INSTALL_DIR/komari"
    fi
fi

# ── 下载 ──
if [ ! -f "$INSTALL_DIR/komari" ]; then
    attempt=1
    while [ $attempt -le $MAX_RETRIES ]; do
        info "下载 $BINARY (第 $attempt/$MAX_RETRIES 次)..."
        tmpfile=$(mktemp)
        if curl -#fSL "$MIRROR/$BINARY" -o "$tmpfile" 2>/dev/null; then
            ACTUAL=$(sha256sum "$tmpfile" | awk '{print $1}')
            if [ "$EXPECTED" = "$ACTUAL" ]; then
                ok "下载成功，SHA256 校验通过"
                mkdir -p "$INSTALL_DIR/data"
                mv "$tmpfile" "$INSTALL_DIR/komari"
                chmod +x "$INSTALL_DIR/komari"
                break
            else
                warn "SHA256 不匹配"
                echo "  期望: $EXPECTED"
                echo "  实际: $ACTUAL"
                rm -f "$tmpfile"
            fi
        else
            warn "下载失败"
            rm -f "$tmpfile"
        fi
        attempt=$((attempt + 1))
        [ $attempt -le $MAX_RETRIES ] && sleep 3
    done
    [ -f "$INSTALL_DIR/komari" ] || err "下载失败，已重试 $MAX_RETRIES 次"
fi

# ── 创建 systemd 服务 ──
info "配置 systemd 服务..."
cat > /etc/systemd/system/komari.service << EOF
[Unit]
Description=Komari Monitor
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=$INSTALL_DIR
ExecStart=$INSTALL_DIR/komari server -l $LISTEN_ADDR
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable komari.service
systemctl restart komari.service

# ── 验证 ──
sleep 2
if systemctl is-active --quiet komari; then
    ok "Komari Server 已启动"
    echo ""
    echo "  ────────────────────────────────"
    echo "  Web 面板: http://0.0.0.0:$LISTEN_ADDR"
    echo "  用户名:   admin"
    echo "  密码:     Admin123456"
    echo "  ────────────────────────────────"
    echo ""
    info "首次访问 Web 面板完成初始化安装"
    info "修改密码: $INSTALL_DIR/komari chpasswd -p <新密码>"
    echo ""
else
    err "服务未正常启动，查看日志: journalctl -u komari -n 20"
fi
