#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: create-portable-python.sh
# 功能说明: 自动识别架构，支持自定义 Python 版本、Tag、GitHub 下载加速、pip 镜像源及依赖安装
# ==============================================================================

set -euo pipefail

# --- 默认参数设置 ---
PYTHON_VERSION="3.12.12"
RELEASE_TAG="20260114"
MIRROR_PREFIX=""
REQUIREMENTS_FILE=""
PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"

# --- 帮助信息函数 ---
usage() {
    echo "用法: $0 [-v PYTHON_VERSION] [-t RELEASE_TAG] [-m MIRROR_PREFIX] [-r REQUIREMENTS_FILE] [-i PIP_INDEX_URL]"
    echo ""
    echo "选项:"
    echo "  -v  指定 Python 版本 (默认: ${PYTHON_VERSION})"
    echo "  -t  指定 Release Tag (默认: ${RELEASE_TAG})"
    echo "  -m  指定 GitHub 镜像加速前缀 (例如: https://ghproxy.net/)"
    echo "  -r  指定 requirements.txt 文件路径 (可选)"
    echo "  -i  指定 pip 安装源 (默认: ${PIP_INDEX_URL})"
    echo "  -h  显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 -r requirements.txt"
    echo "  $0 -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/"
    echo "  $0 -v 3.11.8 -m https://ghproxy.net/ -r ./requirements.txt"
    exit 0
}

# --- 解析命令行参数 ---
while getopts "v:t:m:r:i:h" opt; do
    case "${opt}" in
        v) PYTHON_VERSION="${OPTARG}" ;;
        t) RELEASE_TAG="${OPTARG}" ;;
        m) MIRROR_PREFIX="${OPTARG}" ;;
        r) REQUIREMENTS_FILE="${OPTARG}" ;;
        i) PIP_INDEX_URL="${OPTARG}" ;;
        h) usage ;;
        *) usage ;;
    esac
done

# --- 校验依赖文件是否存在 ---
if [ -n "${REQUIREMENTS_FILE}" ] && [ ! -f "${REQUIREMENTS_FILE}" ]; then
    echo "❌ 错误: 未能找到指定的依赖文件 '${REQUIREMENTS_FILE}'" >&2
    exit 1
fi

# --- 架构自动识别逻辑 ---
HOST_ARCH="$(uname -m)"

case "${HOST_ARCH}" in
    x86_64|amd64)
        TARGET_ARCH="x86_64-unknown-linux-gnu"
        ARCH_LABEL="x86_64"
        ;;
    aarch64|arm64)
        TARGET_ARCH="aarch64-unknown-linux-gnu"
        ARCH_LABEL="arm64"
        ;;
    *)
        echo "❌ 错误: 暂不支持当前架构 '${HOST_ARCH}'" >&2
        exit 1
        ;;
esac

# --- 链接与路径构建 ---
PYTHON_TARBALL="cpython-${PYTHON_VERSION}+${RELEASE_TAG}-${TARGET_ARCH}-install_only.tar.gz"
RAW_DOWNLOAD_URL="https://github.com/astral-sh/python-build-standalone/releases/download/${RELEASE_TAG}/${PYTHON_TARBALL}"

# 镜像加速前缀处理
if [ -n "${MIRROR_PREFIX}" ]; then
    [[ "${MIRROR_PREFIX}" != */ ]] && MIRROR_PREFIX="${MIRROR_PREFIX}/"
    DOWNLOAD_URL="${MIRROR_PREFIX}${RAW_DOWNLOAD_URL}"
else
    DOWNLOAD_URL="${RAW_DOWNLOAD_URL}"
fi

WORK_DIR="${PWD}"
DOWNLOAD_DIR="${WORK_DIR}/downloads"
TARGET_DIR="${WORK_DIR}/python-portable-${ARCH_LABEL}"
ARCHIVE_NAME="python3-portable-${ARCH_LABEL}.tar.gz"

echo "=========================================="
echo " 开始构建 Python 可移植环境"
echo " 运行平台: Linux (${ARCH_LABEL})"
echo " Python 版本: ${PYTHON_VERSION}"
echo " Release Tag: ${RELEASE_TAG}"
if [ -n "${MIRROR_PREFIX}" ]; then
    echo " GitHub 镜像: ${MIRROR_PREFIX}"
fi
if [ -n "${REQUIREMENTS_FILE}" ]; then
    echo " 依赖文件: ${REQUIREMENTS_FILE}"
    echo " pip 镜像源: ${PIP_INDEX_URL}"
fi
echo "=========================================="

# 1. 创建目录并下载
mkdir -p "${DOWNLOAD_DIR}"
if [ ! -f "${DOWNLOAD_DIR}/${PYTHON_TARBALL}" ]; then
    echo "[1/5] 正在下载 [${ARCH_LABEL}] 发行包..."
    echo "      URL: ${DOWNLOAD_URL}"
    curl -L --progress-bar -o "${DOWNLOAD_DIR}/${PYTHON_TARBALL}" "${DOWNLOAD_URL}"
else
    echo "[1/5] 检测到已存在下载包，直接复用: ${PYTHON_TARBALL}"
fi

# 2. 解压与初始化 (--strip-components=1 打平解压层级)
echo "[2/5] 解压并初始化 Python 目录结构..."
rm -rf "${TARGET_DIR}"
mkdir -p "${TARGET_DIR}"
tar -xzf "${DOWNLOAD_DIR}/${PYTHON_TARBALL}" --strip-components=1 -C "${TARGET_DIR}"

# 3. 验证基础环境
echo "[3/5] 验证独立运行环境..."
if [ -f "${TARGET_DIR}/bin/python3" ]; then
    INSTALLED_VER=$("${TARGET_DIR}/bin/python3" -V)
    echo "      成功安装基础环境: ${INSTALLED_VER} (${ARCH_LABEL})"
else
    echo "❌ 错误: 未能找到 python3 可执行文件，下载或解压可能失败！" >&2
    exit 1
fi

# 4. 安装 pip 第三方依赖 (如果提供了 -r 参数)
if [ -n "${REQUIREMENTS_FILE}" ]; then
    echo "[4/5] 正在使用源 [${PIP_INDEX_URL}] 安装依赖包..."

    # 升级 pip 并指定源
    "${TARGET_DIR}/bin/python3" -m pip install --upgrade pip -i "${PIP_INDEX_URL}" --quiet

    # 安装 requirements.txt 并指定源
    "${TARGET_DIR}/bin/python3" -m pip install -r "${REQUIREMENTS_FILE}" -i "${PIP_INDEX_URL}"
    echo "      依赖安装完成！"
else
    echo "[4/5] 未指定依赖文件 (-r)，跳过 pip 依赖安装步骤。"
fi

# 5. 打包输出
echo "[5/5] 正在打包包含依赖的可分发环境..."
tar -czf "${ARCHIVE_NAME}" -C "${WORK_DIR}" "$(basename "${TARGET_DIR}")"

echo "=========================================="
echo "✨ 构建完成！"
echo "📂 本地环境目录: ${TARGET_DIR}"
echo "📦 独立分发压缩包: ${WORK_DIR}/${ARCHIVE_NAME}"
echo "=========================================="