#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

# build_type=MinSizeRel
build_type=Release
build_test=0
build_shared=ON
build_bench=0
do_install=0
use_cpp11=1
enable_cov=0
debug_se=0
run_cov_only=0
enable_antlr4=ON

enable_snappy=ON
enable_lz4=ON
enable_lzokay=ON
enable_zlib=ON
enable_zstd=ON
# Keep the default build compatible with CMake 3.11-era industrial toolchains.
# Bundled XZ Utils requires CMake 3.20+, so LZMA2 must be enabled explicitly.
enable_lzma2=OFF

shell_dir=$(cd "$(dirname "$0")";pwd)

# 添加get_key_value函数
get_key_value() {
    echo "${1#*=}"
}

usage()
{
  cat <<EOF
Usage: bash build.sh [install] [options]

Commands:
  install                Run make install after a successful build.

Options:
  -t=<type>, -t <type>   Build type: Debug, Release, RelWithDebInfo, MinSizeRel.
  -a=<ON|OFF>            Enable or disable AddressSanitizer.
  -c=<ON|OFF>            Enable or disable code coverage.
  --build-shared=<ON|OFF>
                         Build libtsfile as a shared library (default: ON).
  --build-static         Build libtsfile as a static library.
  --enable-antlr4=<ON|OFF>
  --disable-antlr4
  --enable-snappy=<ON|OFF>
  --disable-snappy
  --enable-lz4=<ON|OFF>
  --disable-lz4
  --enable-lzokay=<ON|OFF>
  --disable-lzokay
  --enable-zlib=<ON|OFF>
  --disable-zlib
  --enable-zstd=<ON|OFF>
  --disable-zstd
  --enable-lzma2=<ON|OFF>
                         Enable LZMA2 explicitly (default: OFF; bundled XZ
                         requires CMake 3.20 or newer).
  --disable-lzma2
  -h, --help             Show this help message.
EOF
}

function print_config()
{
  echo "build_type=$build_type"
  echo "build_test=$build_test"
  echo "build_shared=$build_shared"
  echo "do_install=$do_install"
  echo "use_cpp11=$use_cpp11"
  echo "enable_cov=$enable_cov"
  echo "enable_asan=$enable_asan"
  echo "enable_antlr4=$enable_antlr4"
  echo "enable_snappy=$enable_snappy"
  echo "enable_lz4=$enable_lz4"
  echo "enable_lzokay=$enable_lzokay"
  echo "enable_zlib=$enable_zlib"
  echo "enable_zstd=$enable_zstd"
  echo "enable_lzma2=$enable_lzma2"
}

function run_test_for_cov()
{
  # sh ${shell_dir}/scripts/regression_unittest.sh
  sh ${shell_dir}/test/libtsfile_test/run_sdk_tests.sh
}

parse_options()
{
  while test $# -gt 0
  do
    case "$1" in
    clean)
      do_clean=1;;
    run_cov)
      run_cov_only=1;;
    install | --install)
      do_install=1;;
    -t=*)
      build_type=$(get_key_value "$1");;
    -t)
      shift
      build_type=$(get_key_value "$1");;
    -a=*)
      enable_asan=$(get_key_value "$1");;
    -a)
      shift
      enable_asan=$(get_key_value "$1");;
    -c=*)
      enable_cov=$(get_key_value "$1");;
    -c)
      shift
      enable_cov=$(get_key_value "$1");;
    --build-shared=*)
      build_shared=$(get_key_value "$1");;
    --build-static)
      build_shared=OFF;;
    --enable-antlr4=*)
      enable_antlr4=$(get_key_value "$1");;
    --enable-snappy=*)
      enable_snappy=$(get_key_value "$1");;
    --enable-lz4=*)
      enable_lz4=$(get_key_value "$1");;
    --enable-lzokay=*)
      enable_lzokay=$(get_key_value "$1");;
    --enable-zlib=*)
      enable_zlib=$(get_key_value "$1");;
    --enable-zstd=*)
      enable_zstd=$(get_key_value "$1");;
    --enable-lzma2=*)
      enable_lzma2=$(get_key_value "$1");;
    --disable-antlr4)
      enable_antlr4=OFF;;
    --disable-snappy)
      enable_snappy=OFF;;
    --disable-lz4)
      enable_lz4=OFF;;
    --disable-lzokay)
      enable_lzokay=OFF;;
    --disable-zlib)
      enable_zlib=OFF;;
    --disable-zstd)
      enable_zstd=OFF;;
    --disable-lzma2)
      enable_lzma2=OFF;;
    -h | --help)
      usage
      exit 0;;
    *)
      echo "Unknown option '$1'"
      usage
      exit 1;;
    esac
    shift
  done
}

parse_options "$@"
print_config

if [[ ${run_cov_only} -eq 1 ]]
then
  do_cov
  # exit after run coverage test.
  exit
fi

if [ ${build_test} -eq 1 ]
then
  compile_gtest
  echo "building status: build gtest success."
fi

echo "build using: build_type=$build_type"
if [ ${build_type} == "Debug" ]
then
  mkdir -p build/Debug
  cd build/Debug
elif [ ${build_type} == "Release" ]
then
  mkdir -p build/Release
  cd build/Release
elif [ ${build_type} == "RelWithDebInfo" ]
then
  mkdir -p build/relwithdebinfo
  cd build/relwithdebinfo
elif [ ${build_type} == "MinSizeRel" ]
then
  mkdir -p build/minsizerel
  cd build/minsizerel
else
  echo ""
  echo "unknown build type: ${build_type}, valid build types(case insensitive): Debug, Release, RelWithDebInfo, MinSizeRel"
  echo ""
  exit 1
fi

cmake ../../                           \
  -DGTEST=$gtest_project_dir           \
  -DZLIB=$zlib_project_dir/install     \
  -DLZ4LIB=$lz4lib_project_dir         \
  -DBUILD_TEST=$build_test             \
  -DTSFILE_BUILD_SHARED=$build_shared  \
  -DCMAKE_BUILD_TYPE=$build_type       \
  -DUSE_CPP11=$use_cpp11               \
  -DENABLE_COV=$enable_cov             \
  -DDEBUG_SE=$debug_se                 \
  -DENABLE_ANTLR4=$enable_antlr4       \
  -DBUILD_TSFILE_ONLY=$build_tsfile_only \
  -DENABLE_SNAPPY=$enable_snappy       \
  -DENABLE_LZ4=$enable_lz4             \
  -DENABLE_LZOKAY=$enable_lzokay       \
  -DENABLE_ZLIB=$enable_zlib           \
  -DENABLE_ZSTD=$enable_zstd           \
  -DENABLE_LZMA2=$enable_lzma2

VERBOSE=1 make
if [ ${do_install} -eq 1 ]
then
  VERBOSE=1 make install
else
  echo "Skip install. Pass 'install' to run 'make install'."
fi
