#!/usr/bin/env bash
set -euo pipefail

# ============================================================
# test_rootfs.bash
#
# 说明：
#   测试主流程函数。
#
# include 关系：
#   test_rootfs.bash
#     -> function_rootfs.bash
#       -> base_rootfs.bash
#
# 规则：
#   - 测试函数不要太多，只覆盖主流程。
#   - 每个 test 都可以独立执行。
#   - 每个 test 都严格按照：
#       declare -Ag CTX=()
#       init_rootfs_env CTX ...
#       step_xxx CTX ...
#       clear_rootfs_env CTX
#     的模式调用。
#   - 测试函数内部给详细中文注释。
#   - 不使用 flow_xxx 模式。
# ============================================================

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/function_rootfs.bash"

# ============================================================
# 1. 测试用固定配置
# ============================================================

ROOTFS_APT_SOURCES_OFFICIAL="$(cat <<'EOF'
deb http://archive.ubuntu.com/ubuntu focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security main restricted universe multiverse
EOF
)"

ROOTFS_DEV_PACKAGES=(
  ca-certificates
  libc6-dev
  linux-libc-dev
  libssl-dev
  zlib1g-dev
  pkg-config
  build-essential
  gcc
  g++
  make
  bison
  flex
  texinfo
  gawk
  wget
  curl
  file
  xz-utils
  bzip2
  patch
  python3
  perl
  libgmp-dev
  libmpfr-dev
  libmpc-dev
  libisl-dev
)

ROOTFS_EXTRA_PACKAGES=(
  cmake
  ninja-build
)

# ============================================================
# 2. test_rootfs_init_only
#
# 目的：
#   只测试 rootfs 持久初始化。
#
# 执行内容：
#   1. 创建 TEST_ROOTFS_CTX 关联数组。
#   2. 调用 init_rootfs_env 写入运行状态。
#   3. 调用 step_persistent_init_from_iso 从 ISO 解出 rootfs。
#   4. 无论成功失败，最后调用 clear_rootfs_env 清理挂载副作用。
#
# 适用场景：
#   第一次验证 ISO 是否可挂载、filesystem.squashfs 是否存在、
#   rootfs 是否可以正常解压。
# ============================================================

test_rootfs_init_only() {
  declare -Ag TEST_ROOTFS_CTX=()

  init_rootfs_env \
    TEST_ROOTFS_CTX \
    "/dev/sr0" \
    "/mnt/ubuntu_iso" \
    "/ae/sysroots/ubuntu_2004_4" \
    "$ROOTFS_APT_SOURCES_OFFICIAL"

  local rc=0

  set +e
  (
    set -eE

    step_persistent_init_from_iso TEST_ROOTFS_CTX
  )
  rc=$?
  set -e

  clear_rootfs_env TEST_ROOTFS_CTX

  return "$rc"
}

# ============================================================
# 3. test_rootfs_install_dev_packages
#
# 目的：
#   测试在已经存在的 rootfs 中安装开发包。
#
# 执行内容：
#   1. 创建 TEST_ROOTFS_CTX 关联数组。
#   2. 调用 init_rootfs_env 写入运行状态。
#   3. 调用 step_prepare_apt 配置 apt 源、DNS、chroot 挂载。
#   4. 调用 step_apt_update_strict 更新 apt 索引。
#   5. 调用 step_install_packages 安装 ROOTFS_DEV_PACKAGES。
#   6. 最后调用 clear_rootfs_env 清理挂载副作用。
#
# 注意：
#   ROOTFS_DEV_PACKAGES 是普通数组。
#   传参时传的是数组名，不是数组展开。
# ============================================================

test_rootfs_install_dev_packages() {
  declare -Ag TEST_ROOTFS_CTX=()

  init_rootfs_env \
    TEST_ROOTFS_CTX \
    "/dev/sr0" \
    "/mnt/ubuntu_iso" \
    "/ae/sysroots/ubuntu_2004_4" \
    "$ROOTFS_APT_SOURCES_OFFICIAL"

  local rc=0

  set +e
  (
    set -eE

    step_prepare_apt TEST_ROOTFS_CTX
    step_apt_update_strict TEST_ROOTFS_CTX
    step_install_packages TEST_ROOTFS_CTX ROOTFS_DEV_PACKAGES
  )
  rc=$?
  set -e

  clear_rootfs_env TEST_ROOTFS_CTX

  return "$rc"
}

# ============================================================
# 4. test_rootfs_export_dev_sysroot
#
# 目的：
#   测试从已经安装好开发包的 rootfs 导出精简 sysroot。
#
# 执行内容：
#   1. 创建 TEST_ROOTFS_CTX 关联数组。
#   2. 调用 init_rootfs_env 写入运行状态。
#   3. 调用 step_export_dev_sysroot 导出头文件、库文件、pkg-config 等内容。
#   4. 最后调用 clear_rootfs_env 清理挂载副作用。
#
# 注意：
#   这个测试不会安装包。
#   rootfs 应该已经执行过 test_rootfs_install_dev_packages。
# ============================================================

test_rootfs_export_dev_sysroot() {
  declare -Ag TEST_ROOTFS_CTX=()

  init_rootfs_env \
    TEST_ROOTFS_CTX \
    "/dev/sr0" \
    "/mnt/ubuntu_iso" \
    "/ae/sysroots/ubuntu_2004_4" \
    "$ROOTFS_APT_SOURCES_OFFICIAL"

  local rc=0

  set +e
  (
    set -eE

    step_export_dev_sysroot \
      TEST_ROOTFS_CTX \
      "/aenv/sysroots/ubuntu2004-dev"
  )
  rc=$?
  set -e

  clear_rootfs_env TEST_ROOTFS_CTX

  return "$rc"
}

# ============================================================
# 5. test_rootfs_full_basic_flow
#
# 目的：
#   测试完整基础流程。
#
# 执行内容：
#   1. 创建 TEST_ROOTFS_CTX 关联数组。
#   2. 调用 init_rootfs_env 写入运行状态。
#   3. 调用 step_persistent_init_from_iso 初始化 rootfs。
#   4. 调用 step_prepare_apt 配置 apt 环境。
#   5. 调用 step_apt_update_strict 更新 apt 索引。
#   6. 调用 step_install_packages 安装开发包数组 ROOTFS_DEV_PACKAGES。
#   7. 调用 step_export_dev_sysroot 导出精简开发 sysroot。
#   8. 最后调用 clear_rootfs_env 清理副作用。
#
# 这是默认打开的基础流程。
# ============================================================

test_rootfs_full_basic_flow() {
  declare -Ag TEST_ROOTFS_CTX=()

  init_rootfs_env \
    TEST_ROOTFS_CTX \
    "/dev/sr0" \
    "/mnt/ubuntu_iso" \
    "/ae/sysroots/ubuntu_2004_5" \
    "$ROOTFS_APT_SOURCES_OFFICIAL"

  local rc=0

  set +e
  (
    set -eE

    step_persistent_init_from_iso TEST_ROOTFS_CTX
    step_prepare_apt TEST_ROOTFS_CTX
    step_apt_update_strict TEST_ROOTFS_CTX
    step_install_packages TEST_ROOTFS_CTX ROOTFS_DEV_PACKAGES
    step_export_dev_sysroot TEST_ROOTFS_CTX "/aenv/sysroots/ubuntu2004-dev"
  )
  rc=$?
  set -e

  clear_rootfs_env TEST_ROOTFS_CTX

  return "$rc"
}

# ============================================================
# 6. 直接调用示例
#
# 默认打开：
#   test_rootfs_full_basic_flow
#
# 如果要单独测试其它主流程：
#   注释 test_rootfs_full_basic_flow
#   打开下面某一个 test_xxx 函数
# ============================================================

test_rootfs_full_basic_flow

# test_rootfs_init_only

# test_rootfs_install_dev_packages

# test_rootfs_export_dev_sysroot
