#!/usr/bin/env bash
# ------------------------------------------------------------------------------
# H5-in-App-Integration SDK · Harmony 命令行构建入口
#
# 用法：
#   bash scripts/build-harmony.sh                    # = sdk：构建 SDK har
#   bash scripts/build-harmony.sh sdk                # 构建 SDK har
#   bash scripts/build-harmony.sh demo               # 构建 Demo hap
#   bash scripts/build-harmony.sh all                # SDK + Demo 全量
#   bash scripts/build-harmony.sh --help             # 查看本帮助
#
# 产物布局（统一落到 harmonyos-arkts/dist/）：
#   harmonyos-arkts/dist/tencentqianwebview-<version>.har
#   harmonyos-arkts/dist/demo/entry-<version>-unsigned.hap
#
# 设计要点：
# - 不引入 npm / package.json，工程保持纯 ohpm 体系
# - hvigor 6.x 不支持自定义 har / hap 产物名，本脚本在 assemble 后做拷贝重命名
# - 自动从 DevEco Studio 安装目录定位 hvigorw / node / ohpm，也可通过环境变量
#   （DEVECO_HOME / HVIGOR / NODE_HOME / OHPM）显式指定
# - 本项目不区分 product 变体（无公有云/金融云），单一产物
# ------------------------------------------------------------------------------
set -euo pipefail

# ---- 路径与常量 --------------------------------------------------------------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
HARMONY_DIR="${REPO_ROOT}/harmonyos-arkts"
SDK_BUILD_DIR="${HARMONY_DIR}/tencentqianwebview/build"
DEMO_BUILD_DIR="${HARMONY_DIR}/entry/build"
DIST_DIR="${HARMONY_DIR}/dist"
DEMO_DIST_DIR="${DIST_DIR}/demo"

# 从 CHANGELOG 读取版本号(版本号唯一真相源为 docs/CHANGELOG.md)
SDK_VERSION="$("${SCRIPT_DIR}/extract-version.sh")"
echo "ℹ️  SDK 版本号（来自 CHANGELOG）：${SDK_VERSION}"

# DevEco Studio 内嵌工具链候选位置（按优先级）
DEVECO_CANDIDATES=(
  # macOS 默认安装路径
  "/Applications/DevEco-Studio.app/Contents"
  "${HOME}/Applications/DevEco-Studio.app/Contents"
  # Windows 默认安装路径（Git Bash / WSL 下的路径）
  "/c/Program Files/Huawei/DevEco Studio"
  "/d/Program Files/Huawei/DevEco Studio"
  "${PROGRAMFILES:-}/Huawei/DevEco Studio"
  "/c/Users/${USERNAME:-}/AppData/Local/Programs/Huawei/DevEco Studio"
)

# ---- 提前处理 --help（不依赖任何工具链） -------------------------------------
case "${1:-}" in
  -h|--help)
    sed -n '2,16p' "${BASH_SOURCE[0]}"
    exit 0
    ;;
esac

# ---- 定位 DevEco Studio 安装根目录 ------------------------------------------
locate_deveco_root() {
  # 用户显式指定优先
  if [[ -n "${DEVECO_HOME:-}" ]] && [[ -d "${DEVECO_HOME}" ]]; then
    echo "${DEVECO_HOME}"
    return 0
  fi
  for candidate in "${DEVECO_CANDIDATES[@]}"; do
    if [[ -d "${candidate}/tools/hvigor" ]]; then
      echo "${candidate}"
      return 0
    fi
  done
  return 1
}

DEVECO_ROOT="$(locate_deveco_root || true)"

# ---- 定位 hvigorw / node / ohpm ---------------------------------------------
# 优先级：
#   1. 环境变量（HVIGOR / NODE_HOME / OHPM）
#   2. DevEco Studio 内嵌工具链
#   3. 全局 PATH
HVIGOR_BIN=""
SDK_HOME_DIR=""
NODE_HOME_DIR=""
OHPM_BIN=""

# hvigorw
if [[ -n "${HVIGOR:-}" ]] && [[ -x "${HVIGOR}" ]]; then
  HVIGOR_BIN="${HVIGOR}"
elif [[ -n "${DEVECO_ROOT}" ]] && [[ -x "${DEVECO_ROOT}/tools/hvigor/bin/hvigorw" ]]; then
  HVIGOR_BIN="${DEVECO_ROOT}/tools/hvigor/bin/hvigorw"
elif command -v hvigorw >/dev/null 2>&1; then
  HVIGOR_BIN="$(command -v hvigorw)"
fi

# DEVECO_SDK_HOME（HarmonyOS SDK 根目录，hvigor 必须要）
# 优先级：环境变量 DEVECO_SDK_HOME > DevEco Studio 内嵌 sdk > 用户主目录候选
if [[ -n "${DEVECO_SDK_HOME:-}" ]] && [[ -d "${DEVECO_SDK_HOME}" ]]; then
  SDK_HOME_DIR="${DEVECO_SDK_HOME}"
elif [[ -n "${DEVECO_ROOT}" ]] && [[ -d "${DEVECO_ROOT}/sdk" ]]; then
  SDK_HOME_DIR="${DEVECO_ROOT}/sdk"
elif [[ -d "${HOME}/Library/Huawei/Sdk" ]]; then
  SDK_HOME_DIR="${HOME}/Library/Huawei/Sdk"
# Windows 默认 SDK 路径（Git Bash / WSL）
elif [[ -n "${LOCALAPPDATA:-}" ]] && [[ -d "${LOCALAPPDATA}/Huawei/Sdk" ]]; then
  SDK_HOME_DIR="${LOCALAPPDATA}/Huawei/Sdk"
  elif [[ -d "/c/Users/${USERNAME:-}/AppData/Local/Huawei/Sdk" ]]; then
    SDK_HOME_DIR="/c/Users/${USERNAME:-}/AppData/Local/Huawei/Sdk"
fi

# node（hvigorw 必须依赖）
if [[ -n "${NODE_HOME:-}" ]] && [[ -x "${NODE_HOME}/bin/node" ]]; then
  NODE_HOME_DIR="${NODE_HOME}"
elif [[ -n "${DEVECO_ROOT}" ]] && [[ -x "${DEVECO_ROOT}/tools/node/bin/node" ]]; then
  NODE_HOME_DIR="${DEVECO_ROOT}/tools/node"
elif command -v node >/dev/null 2>&1; then
  NODE_HOME_DIR="$(dirname "$(dirname "$(command -v node)")")"
fi

# ohpm（首次需要 install 拉依赖）
if [[ -n "${OHPM:-}" ]] && [[ -x "${OHPM}" ]]; then
  OHPM_BIN="${OHPM}"
elif [[ -n "${DEVECO_ROOT}" ]] && [[ -x "${DEVECO_ROOT}/tools/ohpm/bin/ohpm" ]]; then
  OHPM_BIN="${DEVECO_ROOT}/tools/ohpm/bin/ohpm"
elif command -v ohpm >/dev/null 2>&1; then
  OHPM_BIN="$(command -v ohpm)"
fi

# ---- 工具链就绪检查 ----------------------------------------------------------
if [[ -z "${HVIGOR_BIN}" ]]; then
  cat >&2 <<EOF
❌ 找不到 hvigorw 可执行文件。请按下列任一方式准备：
   1. 安装 DevEco Studio
      - macOS：自动检测 /Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw
      - Windows：安装后设置环境变量 DEVECO_HOME=C:/Program Files/Huawei/DevEco Studio
   2. 或直接指定：export HVIGOR=/path/to/hvigorw（或 hvigorw.bat）
EOF
  exit 1
fi
if [[ -z "${NODE_HOME_DIR}" ]]; then
  echo "❌ 找不到 node。可设置 NODE_HOME=/path/to/node-installation 或安装 DevEco Studio。" >&2
  exit 1
fi
if [[ -z "${OHPM_BIN}" ]]; then
  echo "❌ 找不到 ohpm。可设置 OHPM=/path/to/ohpm 或安装 DevEco Studio。" >&2
  exit 1
fi
if [[ -z "${SDK_HOME_DIR}" ]]; then
  echo "❌ 找不到 HarmonyOS SDK。可设置 DEVECO_SDK_HOME=/path/to/sdk 或安装 DevEco Studio。" >&2
  exit 1
fi

echo "ℹ️  DevEco Studio:   ${DEVECO_ROOT:-(未使用)}"
echo "ℹ️  hvigorw:         ${HVIGOR_BIN}"
echo "ℹ️  node home:       ${NODE_HOME_DIR}"
echo "ℹ️  ohpm:            ${OHPM_BIN}"
echo "ℹ️  DEVECO_SDK_HOME: ${SDK_HOME_DIR}"

# 把工具链信息暴露给 hvigorw
export NODE_HOME="${NODE_HOME_DIR}"
export DEVECO_SDK_HOME="${SDK_HOME_DIR}"
export PATH="${NODE_HOME_DIR}/bin:${PATH}"

# ---- 注入 SDK 版本号到 build-profile.json5 ----------------------------------
# hvigor 依据 build-profile.json5 的 buildProfileFields.HAR_VERSION 生成 BuildProfile.HAR_VERSION,
# 运行时 SDK 通过 import BuildProfile 读取。构建前将 CHANGELOG 版本号写入该字段,
# 构建结束(含失败/中断)后由 trap 还原,工作区 build-profile.json5 保持不变。
BUILD_PROFILE="${HARMONY_DIR}/tencentqianwebview/build-profile.json5"
restore_build_profile() {
  if [[ -f "${BUILD_PROFILE}.bak" ]]; then
    mv -f "${BUILD_PROFILE}.bak" "${BUILD_PROFILE}"
  fi
}
trap restore_build_profile EXIT INT TERM
cp -f "${BUILD_PROFILE}" "${BUILD_PROFILE}.bak"
sed -E 's/("HAR_VERSION"[[:space:]]*:[[:space:]]*)"[^"]*"/\1"'"${SDK_VERSION}"'"/' \
  "${BUILD_PROFILE}.bak" > "${BUILD_PROFILE}"
echo "ℹ️  已注入 HAR_VERSION=${SDK_VERSION} 到 build-profile.json5（构建后自动还原）"

# ---- 首次安装依赖（oh_modules 缺失则跑 ohpm install） ------------------------
ensure_oh_modules() {
  if [[ ! -d "${HARMONY_DIR}/oh_modules" ]]; then
    echo ""
    echo "▶ 首次构建：oh_modules 不存在，执行 ohpm install ..."
    pushd "${HARMONY_DIR}" >/dev/null
    "${OHPM_BIN}" install
    popd >/dev/null
  fi
}

# ---- 构建 SDK → har ----------------------------------------------------------
build_sdk() {
  local src_har="${SDK_BUILD_DIR}/default/outputs/default/tencentqianwebview.har"
  local dst_har="${DIST_DIR}/tencentqianwebview-${SDK_VERSION}.har"

  echo ""
  echo "▶ 构建 tencentqianwebview 模块（SDK har）"
  pushd "${HARMONY_DIR}" >/dev/null
  "${HVIGOR_BIN}" --no-daemon clean assembleHar -p module=tencentqianwebview@default
  popd >/dev/null

  if [[ ! -f "${src_har}" ]]; then
    echo "❌ 期望产物未找到：${src_har}" >&2
    exit 2
  fi

  mkdir -p "${DIST_DIR}"
  cp -f "${src_har}" "${dst_har}"
  echo "✅ SDK 产物已重命名拷贝：${dst_har}"
}

# ---- 构建 Demo → hap ---------------------------------------------------------
# 注意：脚手架阶段 build-profile.json5 未配置 signingConfigs，hvigor 会跳过签名，
# 因此产物为 *-unsigned.hap，落地到 dist/demo/ 下
build_demo() {
  local src_hap="${DEMO_BUILD_DIR}/default/outputs/default/entry-default-unsigned.hap"
  local dst_hap="${DEMO_DIST_DIR}/entry-${SDK_VERSION}-unsigned.hap"

  echo ""
  echo "▶ 构建 entry 模块（Demo hap）"
  pushd "${HARMONY_DIR}" >/dev/null
  "${HVIGOR_BIN}" --no-daemon clean assembleHap -p module=entry@default
  popd >/dev/null

  if [[ ! -f "${src_hap}" ]]; then
    echo "❌ 期望产物未找到：${src_hap}" >&2
    exit 2
  fi

  mkdir -p "${DEMO_DIST_DIR}"
  cp -f "${src_hap}" "${dst_hap}"
  echo "✅ Demo 产物已重命名拷贝：${dst_hap}"
}

# ---- 构建前清理上次产物（先清理再构建） --------------------------------------
echo ""
echo "▶ 清理上次构建产物：build/ 中间产物 + dist/"
rm -rf "${SDK_BUILD_DIR}" "${DEMO_BUILD_DIR}" "${DIST_DIR}"

# ---- 入口分发 ----------------------------------------------------------------
ensure_oh_modules

target="${1:-sdk}"
case "${target}" in
  sdk|"")
    build_sdk
    ;;
  demo)
    build_demo
    ;;
  all)
    build_sdk
    build_demo
    ;;
  *)
    echo "❌ 未知参数：${target}" >&2
    echo "用法：bash scripts/build-harmony.sh [sdk|demo|all]" >&2
    exit 1
    ;;
esac

echo ""
echo "🎉 Harmony 构建完成，产物目录：${DIST_DIR}"
find "${DIST_DIR}" -type f \( -name "*.har" -o -name "*.hap" \) -exec ls -lh {} \;
