#!/bin/bash
# version:v20260528

set -euo pipefail

# ========================= 自动清理旧目录 =========================
rm -rf apt.amd64 apt.arm64 dnf.amd64 dnf.arm64

# ====================== 颜色输出 ======================
GREEN="\033[0;32m"
RED="\033[0;31m"
YELLOW="\033[1;33m"
RESET="\033[0m"

info() {
    echo -e "${GREEN}[信息] $*${RESET}"
}

warn() {
    echo -e "${YELLOW}[警告] $*${RESET}"
}

error() {
    echo -e "${RED}[错误] $*${RESET}"
    exit 255
}

# ====================== root 权限校验 ======================
check_root() {
    if [[ $EUID -ne 0 ]]; then
        error "此脚本必须使用 root 用户执行！"
    fi
    info "权限校验通过：当前为 root 用户"
}

# ====================== SELinux 状态检查（统一风格） ======================
check_selinux() {
    info "正在检查 SELinux 状态..."
    
    # 检查 sestatus 命令是否存在（某些精简系统可能没有安装）
    if ! command -v sestatus &>/dev/null; then
        warn "sestatus 命令不存在，跳过 SELinux 检查"
        return 0
    fi
    
    # 判断 SELinux 是否为 disabled
    if sestatus | grep -q "SELinux status.*disabled"; then
        info "SELinux 检查通过 (当前已禁用)"
    else
        error "SELinux 未禁用，请先关闭 SELinux (修改 /etc/selinux/config 并重启) 后再运行本脚本"
    fi
}

# ====================== 1. 识别系统类型 ======================
check_system() {
    info "正在检测操作系统类型..."

    is_huawei=$(grep -qi "Huawei" /etc/os-release && echo "true" || echo "false")
    is_aliyun=$(grep -qi "Alibaba" /etc/os-release && echo "true" || echo "false")
    is_euler=$(grep -qi "openEuler" /etc/os-release && echo "true" || echo "false")
    is_anolis=$(grep -qi "Anolis" /etc/os-release && echo "true" || echo "false")
    is_kylin=$(grep -qi "Kylin" /etc/os-release && echo "true" || echo "false")
    is_centos=$(grep -qi "CentOS" /etc/os-release && echo "true" || echo "false")
    is_oracle=$(grep -qi "Oracle" /etc/os-release && echo "true" || echo "false")
    is_redhat=$(grep -qi "Red Hat Enterprise" /etc/os-release && echo "true" || echo "false")
    is_uos=$(grep -qi "UOS Server" /etc/os-release && echo "true" || echo "false")
    is_ubuntu=$(grep -qi "ubuntu" /etc/os-release && echo "true" || echo "false")
    is_debian=$(grep -qi "debian" /etc/os-release && echo "true" || echo "false")

    is_redhat=$([[ "${is_oracle}" == "true" ]] && echo "false" || echo "${is_redhat}")

    if [[ "${is_redhat}" == "true" || "${is_centos}" == "true" || "${is_oracle}" == "true" ||
          "${is_huawei}" == "true" || "${is_aliyun}" == "true" || "${is_euler}" == "true" ||
          "${is_anolis}" == "true" || "${is_kylin}" == "true" || "${is_uos}" == "true" ]]; then
        OS_FAMILY="rhel"
        PM="dnf"
    elif [[ "${is_ubuntu}" == "true" || "${is_debian}" == "true" ]]; then
        OS_FAMILY="debian"
        PM="apt"
    else
        error "不支持的操作系统！"
    fi
}

# ====================== 2. 检测架构 ======================
check_arch() {
    ARCH=$(uname -m)
    case "${ARCH}" in
        x86_64|amd64) ARCH_FINAL="amd64" ;;
        aarch64|arm64) ARCH_FINAL="arm64" ;;
        *) error "不支持的架构：${ARCH}" ;;
    esac
}

# ====================== 检查是否为 LFS 指针文件 ======================
is_lfs_pointer() {
    local file="$1"
    [[ -f "$file" ]] && head -c 50 "$file" | grep -q "version https://git-lfs.github.com/spec/v1"
}

# ====================== 3. 安装逻辑（修正版） ======================
install() {
    REPO_NAME="${PM}.${ARCH_FINAL}"
    GIT_URL="https://cnb.cool/myfspbx/${REPO_NAME}.git"
    BIN_FILE="myfs.latest.${PM}.${ARCH_FINAL}.so.bin"

    info "开始安装：系统=${PM} 架构=${ARCH_FINAL} 仓库=${GIT_URL}"

    if [ -d "${REPO_NAME}" ]; then
        error "目录 ${REPO_NAME} 已存在，请删除后重试！"
    fi

    # 安装依赖
    if [[ "${PM}" == "dnf" ]]; then
        dnf install -y git git-lfs --nogpgcheck
    else
        apt update -y && apt install -y git git-lfs
    fi

    # 确保 git-lfs 命令可用
    if ! git lfs version &>/dev/null; then
        error "git-lfs 命令不可用，请检查安装"
    fi

    # 克隆仓库
    git clone "${GIT_URL}"
    cd "${REPO_NAME}"

    # 初始化 LFS 并强制跟踪 .bin 文件
    info "初始化 Git LFS 并跟踪 *.bin 文件..."
    git lfs install
    git lfs track "*.bin"

    # 拉取 LFS 对象（仅下载到 .git/lfs/objects，不替换工作区文件）
    info "拉取 LFS 对象..."
    git lfs pull

    # 关键修复：强制将指针文件替换为真实内容
    info "将 LFS 指针替换为真实文件..."
    git lfs checkout

    # 二次保险：如果 BIN_FILE 仍是指针，单独强制 checkout 该文件
    if is_lfs_pointer "${BIN_FILE}"; then
        warn "检测到 ${BIN_FILE} 仍为 LFS 指针，尝试单独修复..."
        git lfs checkout -- "${BIN_FILE}"
    fi

    # 最终验证
    if is_lfs_pointer "${BIN_FILE}"; then
        error "LFS 文件下载失败：${BIN_FILE} 仍是指针文件，请检查网络或仓库权限"
    else
        info "校验通过：${BIN_FILE} 已成功替换为真实二进制文件"
    fi

    # 执行安装
    chmod 755 "${BIN_FILE}"
    ./"${BIN_FILE}" install

    info "✅ 安装全部完成！"
}

# ====================== 主流程 ======================
main() {
    check_root
    check_selinux
    check_system
    check_arch
    install
}

main
