#!/usr/bin/env bash
# 把 ohpm 装好的 @rnoh/react-native-openharmony 源码依赖里的 libevent 从 2.1.12-stable
# 升级到官方 release-2.1.13-stable,并补齐 RNOH 0.72.143 源码构建所需的 jsi.cpp 链接项。
#
# 用法(在跑完 `ohpm install --all` 之后、`hvigorw` 编译之前执行一次):
#   bash ohos/scripts/patch-libevent-2113.sh <harmony 工程根目录,如 ohos/example/harmony>
#
# 原理见 ohos/scripts/README-libevent-2113-patch.md。脚本本身不下载任何东西——
# libevent 2.1.13-stable 源码树已经作为小体积文件提交在 ohos/vendor/libevent-2.1.13-src/,
# 不依赖网络访问(构建机可能无法访问 github)。
set -euo pipefail

HARMONY_ROOT="${1:?用法: $0 <harmony 工程根目录>}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIBEVENT_SRC="$SCRIPT_DIR/../vendor/libevent-2.1.13-src"

if [ ! -d "$LIBEVENT_SRC" ]; then
  echo "错误:找不到 libevent 2.1.13 源码树 $LIBEVENT_SRC" >&2
  exit 1
fi

# @rnoh/react-native-openharmony 具体落在 <harmony>/oh_modules/ 还是
# <harmony>/entry/oh_modules/(或其他模块子目录)取决于工程哪一层直接声明了这个依赖,
# 不同工程布局不一样,用 find 定位而非写死一层路径。
RNOH_CPP_DIR="$(
  find "$HARMONY_ROOT" \
    \( -path '*/.cxx/*' -o -path '*/build/*' \) -prune -o \
    -type d -path '*/oh_modules/@rnoh/react-native-openharmony/src/main/cpp' -print 2>/dev/null \
    | head -1
)"
if [ -z "$RNOH_CPP_DIR" ] || [ ! -d "$RNOH_CPP_DIR" ]; then
  echo "错误:在 $HARMONY_ROOT 下找不到 oh_modules/@rnoh/react-native-openharmony/src/main/cpp,请先跑 ohpm install --all" >&2
  exit 1
fi
echo "==> 定位到 RNOH_CPP_DIR: $RNOH_CPP_DIR"

TARGET_LIBEVENT="$RNOH_CPP_DIR/third-party/libevent"
echo "==> 替换 libevent 源码树:$TARGET_LIBEVENT"
rm -rf "$TARGET_LIBEVENT"
cp -r "$LIBEVENT_SRC" "$TARGET_LIBEVENT"

echo "==> 校验目标目录下 .c 文件与新源码树同名齐全"
for f in "$RNOH_CPP_DIR"/CMakeLists.txt; do
  :
done

PATCHES_DIR="$RNOH_CPP_DIR/patches/libevent"
for abi in arm64-v8a armeabi-v7a x86_64; do
  CFG="$PATCHES_DIR/$abi/event2/event-config.h"
  if [ ! -f "$CFG" ]; then
    echo "错误:找不到 $CFG" >&2
    exit 1
  fi
  echo "==> 改版本宏:$CFG"
  sed -i \
    -e 's/#define EVENT__NUMERIC_VERSION 0x0201[0-9a-f]\{2\}00/#define EVENT__NUMERIC_VERSION 0x02010d00/' \
    -e 's/#define EVENT__PACKAGE_VERSION "2\.1\.[0-9]\+"/#define EVENT__PACKAGE_VERSION "2.1.13"/' \
    -e 's/#define EVENT__VERSION_PATCH [0-9]\+/#define EVENT__VERSION_PATCH 13/' \
    -e 's/#define EVENT__VERSION "2\.1\.[0-9]\+-stable"/#define EVENT__VERSION "2.1.13-stable"/' \
    "$CFG"
  grep -n "EVENT__NUMERIC_VERSION\|EVENT__PACKAGE_VERSION\|EVENT__VERSION_PATCH\|EVENT__VERSION \"" "$CFG"
done

RNOH_CMAKE="$RNOH_CPP_DIR/CMakeLists.txt"
if [ ! -f "$RNOH_CMAKE" ]; then
  echo "错误:找不到 $RNOH_CMAKE" >&2
  exit 1
fi

if grep -q 'third-party/rn/ReactCommon/jsi/jsi/jsi.cpp' "$RNOH_CMAKE"; then
  echo "==> RNOH 0.72.143 JSI 链接项已存在"
else
  echo "==> 补 RNOH 0.72.143 JSI 链接项:jsi.cpp"
  sed -i '/RNOH\/JSBigStringHelpers\.cpp"/a\    "${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi/jsi/jsi.cpp"' "$RNOH_CMAKE"
fi

# ohpm 依赖切换后 Windows/ninja 偶尔沿用旧对象,显式刷新这个源文件时间戳让 ABI 签名重新编译。
touch "$RNOH_CPP_DIR/RNOHAppNapiBridge.cpp" 2>/dev/null || true

echo "==> libevent 2.1.13 / RNOH 0.72.143 补丁完成"