#!/bin/bash
# ============================================================
# 本站一键部署脚本 — Linux 版
# 根据软件包名称自动判断安装方式
# 镜像源: http://komari.123.com
# 用法:
#   bash linux-deploy.sh <软件包名>
#   bash linux-deploy.sh komari-linux-amd64
#   bash linux-deploy.sh jdk-8u261-linux-x64.tar.gz
#   bash linux-deploy.sh komari-agent-linux-amd64
# ============================================================
set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 镜像源配置
MIRROR="${MIRROR:-http://komari.123.com}"
MIRROR_KOMARI="${MIRROR}/shellpc"

log_info()  { echo -e "${BLUE}→${NC} $1"; }
log_ok()    { echo -e "${GREEN}✓${NC} $1"; }
log_warn()  { echo -e "${YELLOW}⚠${NC} $1"; }
log_err()   { echo -e "${RED}✗${NC} $1"; }

# 显示用法
usage() {
    echo "用法: bash linux-deploy.sh <软件包名> [选项]"
    echo ""
    echo "软件包名示例:"
    echo "  komari-linux-amd64          — Komari Server (amd64)"
    echo "  komari-linux-arm64          — Komari Server (arm64)"
    echo "  komari-agent-linux-amd64    — Komari Agent (amd64)"
    echo "  komari-agent-linux-arm64    — Komari Agent (arm64)"
    echo "  jdk-8u261-linux-x64.tar.gz  — JDK 8"
    echo "  node-v12.16.1-linux-x64.tar.gz — Node.js 12"
    echo "  MCSManager.tar.gz           — MCSManager"
    echo "  Komariserver.tar.gz         — Komari Server (旧版打包)"
    echo "  komari-linux.tar.gz         — Komari Server (旧版打包)"
    echo ""
    echo "选项:"
    echo "  -d, --dir <路径>    指定安装目录（默认自动判断）"
    echo "  -m, --mirror <URL>  指定镜像源"
    echo "  -h, --help          显示此帮助"
    echo ""
    echo "环境变量:"
    echo "  MIRROR=http://komari.123.com         镜像源"
    exit 0
}

[ "$1" = "-h" ] || [ "$1" = "--help" ] && usage
[ -z "$1" ] && { log_err "请指定软件包名"; usage; }

PACKAGE="$1"
INSTALL_DIR="${2:-}"
shift 2>/dev/null || true

# 解析可选参数
while [ $# -gt 0 ]; do
    case "$1" in
        -d|--dir) INSTALL_DIR="$2"; shift 2 ;;
        -m|--mirror) MIRROR="$2"; shift 2
            MIRROR_KOMARI="${MIRROR}/shellpc" ;;
        *) shift ;;
    esac
done

# ============================================================
# 根据文件名判断类型
# ============================================================
detect_package_type() {
    local name="$1"
    
    # Komari Server 二进制（直接可执行）
    if [[ "$name" =~ ^komari-linux-(386|amd64|arm64|loong64|riscv64)$ ]]; then
        echo "komari-server-binary"
        return
    fi
    
    # Komari Agent 二进制
    if [[ "$name" =~ ^komari-agent-linux-(386|amd64|arm|arm64)$ ]]; then
        echo "komari-agent-binary"
        return
    fi
    
    # Komari 源码包
    if [[ "$name" =~ ^komari-server-source\.(tar\.gz|zip)$ ]]; then
        echo "komari-source"
        return
    fi
    
    # JDK tar.gz
    if [[ "$name" =~ ^jdk-.*linux-x64\.tar\.gz$ ]]; then
        echo "jdk-tar"
        return
    fi
    
    # Node.js tar.gz
    if [[ "$name" =~ ^node-v.*linux-x64\.tar\.gz$ ]]; then
        echo "node-tar"
        return
    fi
    
    # MCSManager
    if [[ "$name" =~ ^MCSManager\.tar\.gz$ ]]; then
        echo "mcsmanager-tar"
        return
    fi
    
    # Komari 旧版打包
    if [[ "$name" =~ ^Komariserver\.tar\.gz$ ]] || [[ "$name" =~ ^komari-linux\.tar\.gz$ ]]; then
        echo "komari-old-tar"
        return
    fi
    
    # 通用 tar.gz
    if [[ "$name" =~ \.tar\.gz$ ]]; then
        echo "generic-tar"
        return
    fi
    
    # 通用 .sh
    if [[ "$name" =~ \.sh$ ]]; then
        echo "shell-script"
        return
    fi
    
    echo "unknown"
}

# ============================================================
# 下载文件
# ============================================================
download_package() {
    local name="$1"
    local dest="/tmp/$name"
    
    # 判断从哪个镜像下载
    local url=""
    if [[ "$name" =~ ^komari- ]]; then
        url="${MIRROR_KOMARI}/${name}"
    else
        url="${MIRROR}/${name}"
    fi
    
    log_info "下载: ${url}"
    
    if [ -f "$dest" ] && [ -s "$dest" ]; then
        local existing_size=$(stat -c%s "$dest")
        log_info "已有缓存: ${dest} (${existing_size} bytes)，尝试续传"
        curl -fsSL -C - --connect-timeout 15 --max-time 300 -o "$dest" "$url" 2>/dev/null || {
            log_warn "续传失败，重新下载"
            curl -fsSL --connect-timeout 15 --max-time 600 -o "$dest" "$url"
        }
    else
        curl -fsSL --connect-timeout 15 --max-time 600 -o "$dest" "$url"
    fi
    
    if [ ! -f "$dest" ] || [ ! -s "$dest" ]; then
        log_err "下载失败: ${name}"
        # 尝试从 GitHub 直连
        log_info "尝试 GitHub 直连..."
        local gh_url=""
        if [[ "$name" =~ ^komari-linux- ]]; then
            gh_url="https://github.com/komari-monitor/komari/releases/download/1.4.3/${name}"
        elif [[ "$name" =~ ^komari-agent-linux- ]]; then
            gh_url="https://github.com/komari-monitor/komari-agent/releases/download/1.2.60/${name}"
        fi
        if [ -n "$gh_url" ]; then
            curl -fsSL --connect-timeout 15 --max-time 600 -o "$dest" "$gh_url" || {
                log_err "GitHub 直连也失败"
                rm -f "$dest"
                return 1
            }
        else
            rm -f "$dest"
            return 1
        fi
    fi
    
    echo "$dest"
}

# ============================================================
# 安装函数
# ============================================================

# 安装 Komari Server 二进制
install_komari_server() {
    local binary="$1"
    local target="/opt/komari/komari"
    
    log_info "安装 Komari Server 到 /opt/komari/"
    mkdir -p /opt/komari/data
    cp "$binary" "$target"
    chmod +x "$target"
    
    # 创建 systemd 服务（如果不存在）
    if [ ! -f /etc/systemd/system/komari.service ]; then
        cat > /etc/systemd/system/komari.service <<'EOF'
[Unit]
Description=Komari Monitor
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/komari
ExecStart=/opt/komari/komari
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF
        systemctl daemon-reload
        systemctl enable komari
    fi
    
    systemctl restart komari || true
    log_ok "Komari Server 已安装并启动 (端口 25774)"
    log_ok "  管理地址: http://$(hostname -I 2>/dev/null | awk '{print $1}'):25774"
    log_ok "  用户名/密码: admin / Admin123456"
}

# 安装 Komari Agent 二进制
install_komari_agent() {
    local binary="$1"
    local target="/opt/komari/agent"
    
    log_info "安装 Komari Agent 到 /opt/komari/"
    mkdir -p /opt/komari
    cp "$binary" "$target"
    chmod +x "$target"
    
    log_ok "Komari Agent 已安装到 ${target}"
    log_info "启动方式: ${target} -e http://server-ip:25774 -t 你的令牌"
}

# 安装 JDK
install_jdk() {
    local tarball="$1"
    local target="/opt/java"
    
    log_info "安装 JDK 到 ${target}"
    mkdir -p "$target"
    tar -xzf "$tarball" -C "$target" --strip-components=1
    
    # 设置 JAVA_HOME
    if ! grep -q "JAVA_HOME" /etc/profile 2>/dev/null; then
        cat >> /etc/profile <<'EOF'

# JAVA
export JAVA_HOME=/opt/java
export PATH=$JAVA_HOME/bin:$PATH
EOF
    fi
    
    log_ok "JDK 已安装到 ${target}"
    log_info "请执行 source /etc/profile 或重新登录"
    /opt/java/bin/java -version 2>&1 | head -3
}

# 安装 Node.js
install_node() {
    local tarball="$1"
    local target="/opt/node"
    
    log_info "安装 Node.js 到 ${target}"
    mkdir -p "$target"
    tar -xzf "$tarball" -C "$target" --strip-components=1
    
    if ! grep -q "NODE_HOME" /etc/profile 2>/dev/null; then
        cat >> /etc/profile <<'EOF'

# NODE
export NODE_HOME=/opt/node
export PATH=$NODE_HOME/bin:$PATH
EOF
    fi
    
    log_ok "Node.js 已安装到 ${target}"
    /opt/node/bin/node --version
    /opt/node/bin/npm --version
}

# 安装 MCSManager
install_mcsmanager() {
    local tarball="$1"
    local target="/opt/mcsmanager"
    
    log_info "安装 MCSManager 到 ${target}"
    mkdir -p "$target"
    tar -xzf "$tarball" -C "$target"
    
    log_ok "MCSManager 已解压到 ${target}"
    log_info "启动: bash ${target}/start.sh"
}

# 安装 Komari 旧版打包
install_komari_old() {
    local tarball="$1"
    local target="/opt/komari"
    
    log_info "安装 Komari (旧版) 到 ${target}"
    mkdir -p "$target"
    tar -xzf "$tarball" -C "$target"
    chmod +x "$target/komari" 2>/dev/null || true
    
    log_ok "Komari 已解压到 ${target}"
}

# 通用 tar.gz 安装
install_generic_tar() {
    local tarball="$1"
    local name=$(basename "$tarball" .tar.gz)
    local target="/opt/${name}"
    
    log_info "解压到 ${target}"
    mkdir -p "$target"
    tar -xzf "$tarball" -C "$target" 2>/dev/null || {
        # 可能包含顶层目录，去掉 --strip-components
        tar -xzf "$tarball" -C "$(dirname "$target")" 2>/dev/null || {
            log_err "解压失败"
            return 1
        }
    }
    
    log_ok "已解压到 ${target}"
    ls -la "$target" | head -10
}

# ============================================================
# 主流程
# ============================================================
echo ""
echo "=============================================="
echo " 本站一键部署 — Linux 版"
echo " 软件包: ${PACKAGE}"
echo "=============================================="
echo ""

TYPE=$(detect_package_type "$PACKAGE")
log_info "识别类型: ${TYPE}"

# 下载
DOWNLOAD=$(download_package "$PACKAGE") || exit 1
log_ok "下载完成: $(stat -c%s "$DOWNLOAD") bytes"

echo ""

# 根据类型安装
case "$TYPE" in
    komari-server-binary)
        install_komari_server "$DOWNLOAD"
        ;;
    komari-agent-binary)
        install_komari_agent "$DOWNLOAD"
        ;;
    komari-source)
        log_info "源码包已下载到: ${DOWNLOAD}"
        log_info "解压编译: tar -xzf ${DOWNLOAD} && cd komari-* && go build"
        ;;
    jdk-tar)
        install_jdk "$DOWNLOAD"
        ;;
    node-tar)
        install_node "$DOWNLOAD"
        ;;
    mcsmanager-tar)
        install_mcsmanager "$DOWNLOAD"
        ;;
    komari-old-tar)
        install_komari_old "$DOWNLOAD"
        ;;
    generic-tar)
        install_generic_tar "$DOWNLOAD"
        ;;
    shell-script)
        log_info "脚本已下载到: ${DOWNLOAD}"
        chmod +x "$DOWNLOAD"
        log_info "执行: bash ${DOWNLOAD}"
        ;;
    *)
        log_err "无法识别的软件包类型: ${PACKAGE}"
        log_info "文件已下载到: ${DOWNLOAD}"
        log_info "请手动安装"
        exit 1
        ;;
esac

echo ""
log_ok "部署完成!"