#!/usr/bin/env bash
# Build flexui_engine HAR: jsfwk → assembleHar
source "$(cd "$(dirname "$0")/.." && pwd)/scripts/_config.sh"

mode="debug"
archive=0
verbose=0
while [[ $# -gt 0 ]]; do
  case "$1" in
    --release) mode="release"; shift ;;
    --archive) archive=1; shift ;;
    --verbose) verbose=1; shift ;;
    *) shift ;;
  esac
done

log "=== Building flexui_engine HAR (mode=$mode) ==="

# Run hvigorw assembleHar with a retained full log.
# Default: quiet (tail only); on failure dump last 50 lines + log path.
# --verbose: stream the full output live (tee).
run_har_build() {
  local build_mode="$1"
  local build_flag=""
  [ "$build_mode" = "release" ] && build_flag="-p buildMode=release"
  local logfile="$REPO_ROOT/build/hvigor_har_${build_mode}.log"
  mkdir -p "$REPO_ROOT/build"
  if [ "$verbose" -eq 1 ]; then
    "$HVIGORW" --mode module -p module=flexui_engine@default -p product=default $build_flag assembleHar --no-daemon 2>&1 | tee "$logfile"
  else
    "$HVIGORW" --mode module -p module=flexui_engine@default -p product=default $build_flag assembleHar --no-daemon > "$logfile" 2>&1
  fi
  local status=$?
  if [ "$status" -ne 0 ]; then
    err "hvigorw assembleHar failed (exit=$status). Full log: $logfile"
    tail -50 "$logfile"
    exit "$status"
  fi
  tail -5 "$logfile"
}

# Step 1: Build flexui_jsfwk.js
"$REPO_ROOT/scripts/build-jsfwk.sh" "$mode"

# Release 构建主动清理 rawfile 中可能残留的 sourcemap(debug 构建产物),
# 避免 flexui_jsfwk.js.map 被打进 HAR(jsfwk 构建也会清,这里是打包前兜底)。
if [ "$mode" = "release" ]; then
  map_file="$REPO_ROOT/flexui-engine/framework/ohos/src/main/resources/rawfile/flexui_jsfwk.js.map"
  if [ -f "$map_file" ]; then
    rm -f "$map_file"
    log "Removed stale flexui_jsfwk.js.map (release build)"
  fi
fi

# Step 2: Build HAR
log "Building flexui_engine HAR (hvigorw)..."
cd "$REPO_ROOT/flexui-engine"
run_har_build "$mode"

# Step 3: Copy to output/
local_src="$REPO_ROOT/flexui-engine/framework/ohos/build/default/outputs/default/flexui_engine.har"
output_har="$REPO_ROOT/flexui-engine/output/flexui_engine.har"
if [ -f "$local_src" ]; then
  mkdir -p "$(dirname "$output_har")"
  cp "$local_src" "$output_har"
  log "flexui_engine HAR → output/ ($(ls -lh "$output_har" | awk '{print $5}'))"
else
  err "HAR not found at: $local_src"
  exit 1
fi

# Step 4: Copy to ai-agent/libs/ (so agent build avoids hvigor Windows path bug)
agent_lib="$REPO_ROOT/ai-agent/libs/flexui_engine.har"
mkdir -p "$(dirname "$agent_lib")"
cp "$output_har" "$agent_lib"
log "HAR → ai-agent/libs/ ($(ls -lh "$agent_lib" | awk '{print $5}'))"

# Step 5 (optional): Archive release artifacts for crash analysis
if [ "$archive" -eq 1 ]; then
  if [ "$mode" != "release" ]; then
    warn "--archive is intended for release builds. Skipping archive."
  else
    # Extract version from oh-package.json5 (JSON5 format — grep + sed is simpler than a full parser)
    version=$(grep '"version"' "$REPO_ROOT/flexui-engine/framework/ohos/oh-package.json5" | sed -E 's/.*"version"\s*:\s*"([^"]+)".*/\1/')
    if [ -z "$version" ]; then
      err "Could not determine version from oh-package.json5"
      exit 1
    fi
    log "Archiving release artifacts v$version..."
    "$REPO_ROOT/scripts/archive-release.sh" "$version"

    # Step 5a: Also build and archive a debug HAR alongside the release one
    log "Building debug HAR for archive..."
    RELEASE_HAR_BACKUP="$output_har.release"
    cp "$output_har" "$RELEASE_HAR_BACKUP"

    # Rebuild jsfwk + HAR in debug mode (overwrites output/ with debug)
    "$REPO_ROOT/scripts/build-jsfwk.sh" "debug"
    log "Building debug flexui_engine HAR (hvigorw)..."
    cd "$REPO_ROOT/flexui-engine"
    run_har_build "debug"

    local_src_debug="$REPO_ROOT/flexui-engine/framework/ohos/build/default/outputs/default/flexui_engine.har"
    if [ -f "$local_src_debug" ]; then
      cp "$local_src_debug" "$output_har"
    fi

    # Copy debug HAR to archive
    debug_har="$REPO_ROOT/flexui-engine/release/$version/flexui_engine-debug.har"
    cp "$output_har" "$debug_har"
    log "flexui_engine-debug.har ($(ls -lh "$debug_har" | awk '{print $5}')) → release/$version/"

    # Restore release HAR to output/ (needed for ohpm publish)
    cp "$RELEASE_HAR_BACKUP" "$output_har"
    rm "$RELEASE_HAR_BACKUP"
    log "Restored release HAR to output/"
  fi
fi

log "=== build-engine complete ==="