#
# 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_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

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.
  --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
  -h, --help             Show this help message.
EOF
}

function print_config()
{
  echo "build_type=$build_type"
  echo "build_test=$build_test"
  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"
}

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");;
    --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");;
    --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;;
    -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             \
  -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

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