#!/bin/bash
#
# Copyright (c) Huawei Technologies Co., Ltd. 2025-2026. All rights reserved.
# KubernetesPlugin is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#          http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
#
set -euo pipefail

ROOT_DIR=$(dirname "$(realpath "$0")")
BUILD_DIR="$ROOT_DIR/buildUT"
COVERAGE=true

log() {
  echo "[INFO] $*"
}

err() {
  echo "[ERROR] $*" >&2
}


extract_dep() {
  local archive="$1"
  local target_dir="$2"
  log "Extracting $archive -> $target_dir"
  rm -rf "$target_dir"
  mkdir -p "$target_dir"
  tar -xzf "$archive" -C "$target_dir" --strip-components=1 || {
    err "Failed to extract $archive"
    exit 1
  }
}

build_securec() {
  log "Building securec..."
  pushd "$ROOT_DIR/shm_proxy/deps" >/dev/null
  rm -rf securec
  mkdir securec
  make -C huawei_secure_c/src/
  find huawei_secure_c/obj/ -name "*.o" | sort | xargs ar rcs huawei_secure_c/lib/libsecurec.a
  cp -r huawei_secure_c/lib  securec/
  cp -r huawei_secure_c/include  securec/
  popd >/dev/null
}

while [[ $# -gt 0 ]]; do
  case $1 in
    --no-coverage)
      COVERAGE=false
      shift
      ;;
    --clean)
      log "Cleaning build dir..."
      rm -rf "$BUILD_DIR"
      shift
      ;;
    *)
      err "Unknown option: $1"
      echo "Usage: $0 [--no-coverage] [--clean]"
      exit 1
      ;;
  esac
done


rm -rf "$BUILD_DIR"
build_securec

dependencies_file="${ROOT_DIR}/dependency.xml"

extract_dep ".deps/googletest_aarch64.tar.gz" "$ROOT_DIR/shm_proxy/deps/googletest"
extract_dep ".deps/mockcpp_aarch64.tar.gz"   "$ROOT_DIR/shm_proxy/deps/mockcpp"

if $COVERAGE; then
  log "Configuring with COVERAGE=ON..."
  cmake -S "$ROOT_DIR" -B "$BUILD_DIR" -DBUILD_TESTS=ON -DCOVERAGE=ON
else
  log "Configuring UT build (no coverage)..."
  cmake -S "$ROOT_DIR" -B "$BUILD_DIR" -DBUILD_TESTS=ON
fi

log "Building UT..."
cmake --build "$BUILD_DIR" -j"$(nproc)"

log "Running UT..."
cd "$BUILD_DIR"
ctest --output-on-failure

if $COVERAGE; then
    log "Generating coverage report..."
    cmake --build "$BUILD_DIR" --target coverage

    coverageInfo="$BUILD_DIR/test/shm_proxy/coverage.info"
    coverageXml="$BUILD_DIR/test/shm_proxy/coverage/test_detail.xml"
    coverageHtml="$BUILD_DIR/test/shm_proxy/coverage_html"
    REPORT_DIR="$ROOT_DIR/gcover_report"

    rm -rf "$REPORT_DIR"
    mkdir -p "$REPORT_DIR"

    if [[ -f "$coverageInfo" ]]; then
        cp "$coverageInfo" "$REPORT_DIR/"
        log "Copied coverage info -> $REPORT_DIR/"
    else
        log "Warning: coverage info not found: $coverageInfo"
    fi

    if [[ -f "$coverageXml" ]]; then
        cp "$coverageXml" "$REPORT_DIR/"
        log "Copied XML report -> $REPORT_DIR/"
    else
        log "Warning: XML report not found: $coverageXml"
    fi

    if [[ -d "$coverageHtml" ]]; then
        cp -r "$coverageHtml/." "$REPORT_DIR/"
        log "Copied HTML report -> $REPORT_DIR/"
    else
        log "Warning: HTML report dir not found: $coverageHtml"
    fi

    log "Coverage and test report files are ready in $REPORT_DIR"
fi