#!/bin/bash
# =========================================================================
# CWNAS 一键安装脚本 (Linux/macOS)
# 用法（需 root 权限）:
#   curl -fsSL https://down.cwnas.com/CWNAS/Server/install.sh | sudo bash
#   curl -fsSL https://down.cwnas.com/CWNAS/Server/install.sh | sudo bash -s -- --no-start
# 可选参数:
#   --no-start              仅安装，不启动
# =========================================================================

set -euo pipefail

if [ "$(id -u)" -ne 0 ]; then
    echo "需要管理员权限安装系统服务，请使用以下命令重新运行："
    echo "  curl -fsSL https://down.cwnas.com/CWNAS/Server/install.sh | sudo bash"
    exit 1
fi

# 如果 stdin 是 pipe（curl | sudo bash 场景），改为从 temp 文件执行，避免 Go 程序无法读取 TTY
if [ ! -t 0 ]; then
    SCRIPT_PATH="$(mktemp)"
    cat > "$SCRIPT_PATH"
    chmod +x "$SCRIPT_PATH"
    exec sudo bash "$SCRIPT_PATH" "$@"
fi

BASE_URL="https://down.cwnas.com/CWNAS/Server"
BINARY_NAME="cwnas"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info() {
    printf '%s\n' "$*"
}
success() {
    printf '%b√ %s%b\n' "$GREEN" "$*" "$NC"
}
warn() {
    printf '%b! %s%b\n' "$YELLOW" "$*" "$NC" >&2
}
error() {
    printf '%bx %s%b\n' "$RED" "$*" "$NC" >&2
    exit 1
}
step() {
    local current="$1"
    local total="$2"
    shift 2
    printf '%s\n' "[$current/$total] $*"
}

get_latest_version() {
    local manifest
    manifest=$(curl -fsSL "${BASE_URL}/latest.json") || error "获取最新版本信息失败"
    local version
    version=$(printf '%s' "$manifest" | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
    if [ -z "$version" ]; then
        error "latest.json 缺少 version 字段"
    fi
    echo "$version"
}

detect_os() {
    local os
    os=$(uname -s | tr '[:upper:]' '[:lower:]')
    case "$os" in
        linux)   echo "linux" ;;
        darwin)  echo "darwin" ;;
        *)       error "不支持的操作系统: $os" ;;
    esac
}

detect_arch() {
    local arch
    arch=$(uname -m)
    case "$arch" in
        x86_64|amd64)    echo "x86_64" ;;
        i686|i386)       echo "x86_32" ;;
        aarch64|arm64)   echo "arm64"  ;;
        armv7l|armv7)    echo "arm32"  ;;
        *)               error "不支持的CPU架构: $arch" ;;
    esac
}

main() {
    local NO_START="false"
    local VERSION=""
    while [ "$#" -gt 0 ]; do
        case "$1" in
            --no-start)
                NO_START="true"
                shift
                ;;
            --version)
                if [ "$#" -lt 2 ]; then
                    error "--version 需要指定版本号"
                fi
                VERSION="$2"
                shift 2
                ;;
            *)
                error "未知参数: $1"
                ;;
        esac
    done
    local STEP_TOTAL=4
    info "❯ 下载和解压"
    if [ -z "$VERSION" ]; then
        VERSION="$(get_latest_version)"
    fi
    local OS=$(detect_os)
    local ARCH=$(detect_arch)

    local ARCHIVE="cwnas_${VERSION}_${OS}_${ARCH}.tar.gz"
    local DOWNLOAD_URL="${BASE_URL}/v${VERSION}/${ARCHIVE}"
    local CHECKSUMS_URL="${BASE_URL}/v${VERSION}/checksums.txt"

    step 1 "$STEP_TOTAL" "获取版本和系统架构: ${OS} ${ARCH}，CWNAS 版本 ${VERSION}"

    local TMP_DIR=$(mktemp -d)
    cd "$TMP_DIR"

    step 2 "$STEP_TOTAL" "下载安装包"
    curl -fsSL -o "$ARCHIVE" "$DOWNLOAD_URL" || error "下载失败，请确认版本号和网络连接"

    step 3 "$STEP_TOTAL" "校验完整性"
    curl -fsSL -o checksums.txt "$CHECKSUMS_URL" || error "获取校验和文件失败"

    local EXPECTED_HASH=$(grep -F "$ARCHIVE" checksums.txt | head -1 | tr -d '\r' | awk '{print $1}')
    if [ -z "$EXPECTED_HASH" ]; then
        error "未在校验文件中找到 ${ARCHIVE} 的信息"
    fi

    if command -v sha256sum > /dev/null 2>&1; then
        local ACTUAL_HASH=$(sha256sum "$ARCHIVE" | awk '{print $1}')
    elif command -v shasum > /dev/null 2>&1; then
        local ACTUAL_HASH=$(shasum -a 256 "$ARCHIVE" | awk '{print $1}')
    else
        error "未找到 sha256sum 或 shasum 命令"
    fi

    if [ "$EXPECTED_HASH" != "$ACTUAL_HASH" ]; then
        error "文件完整性校验失败！"
    fi
    step 4 "$STEP_TOTAL" "解压并检查安装包"
    tar -xzf "$ARCHIVE" -C /tmp/ || error "解压失败"

    if [ ! -f "/tmp/$BINARY_NAME" ]; then
        error "解压后未找到可执行文件 ${BINARY_NAME}"
    fi
    chmod +x "/tmp/$BINARY_NAME"

    success "下载和解压完成"
    info ""

    local INSTALL_ARG=""
    if [ "$NO_START" = "true" ]; then
        INSTALL_ARG="--no-start"
    fi
    /tmp/$BINARY_NAME install $INSTALL_ARG || error "安装失败"

    rm -f "/tmp/$BINARY_NAME"

    cd ~
    rm -rf "$TMP_DIR"

}

main "$@"
