#!/bin/bash
# Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
#
# Licensed 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.

set -e
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
PROJECT_DIR="${BASE_DIR}"/..
OUTPUT_DIR="${PROJECT_DIR}/output"
OUTPUT_SDK_DIR="${OUTPUT_DIR}"/spring-adapter/sdk
BUILD_VERSION="v0.0.1"

readonly USAGE="
Usage: bash build.sh [-h] [-v <version>]

Options:
    -h Output this help and exit.
    -v Specified build version.

Example:
1) Compile a release version and export compilation result to the output directory.
  $ bash build/build.sh -v 0.6.3
"

log_info()
{
    echo "[BUILD_INFO][$(date +%b\ %d\ %H:%M:%S)][spring-adapter]$*"
}

log_error()
{
    echo "[BUILD_ERROR][$(date +%b\ %d\ %H:%M:%S)][spring-adapter]$*"
}

clean() {
    # 环境清理
    if ! bash "${BASE_DIR}"/clean.sh; then
        log_error "Failed to exec clean script!"
        exit 1
    fi
}

build() {
    ############ 编译构建打包 ############
    mkdir -p "${OUTPUT_SDK_DIR}"
    log_info "Start to build spring-adapter"
    cd "${PROJECT_DIR}" || die "${PROJECT_DIR} not exist"

    log_info "set spring-adapter version to ${BUILD_VERSION}"
    if ! mvn versions:set -DnewVersion="${BUILD_VERSION}"; then
      log_error "Failed to set version of spring-adapter!!!"
      exit 1
    fi

    sed -i "s/<runtime-sdk-fg.version>1.0.0<\/runtime-sdk-fg.version>/<runtime-sdk-fg.version>${BUILD_VERSION}<\/runtime-sdk-fg.version>/g" "${PROJECT_DIR}"/pom.xml
    sed -i "s/<datasystem.version>1.0.0<\/datasystem.version>/<datasystem.version>${BUILD_VERSION}<\/datasystem.version>/g" "${PROJECT_DIR}"/pom.xml

    if ! mvn clean package -DskipTests; then
        log_error "Failed to build spring-adapter"
        exit 1
    fi
    log_info "Built spring-adapter successfully"
}

package() {
    ############ 输出件 ############
    log_info "Start to package spring-adapter"

    ### 拷贝Jar包
    jar_modules=( \
    microservice-adapter/microservice-adapter-common \
    microservice-adapter/microservice-adapter-core \
    microservice-adapter/microservice-adapter-springboot2 \
    microservice-refresh \
    microservice-runtime/microservice-runtime-api \
    microservice-runtime/microservice-runtime-yuanrong \
    microservice-function/microservice-function-yuanrong \
    microservice-sdk/microservice-sdk-functionclient \
    microservice-sdk/microservice-sdk-functionclient-starter \
    microservice-sdk/microservice-sdk-spring-processor)

    for module_path in "${jar_modules[@]}"
    do
      module_name=$(echo "${module_path}" | awk -F/ '{print $NF}')
      cp "${PROJECT_DIR}/${module_path}"/target/"${module_name}"*.jar "${OUTPUT_SDK_DIR}"
    done

    ### 拷贝Pom文件
    # 拷贝Parent模块pom文件
    cp "${PROJECT_DIR}"/pom.xml "${OUTPUT_SDK_DIR}"/microservice-parent.xml
    # 拷贝子模块pom文件
    microservice_modules=(microservice-adapter microservice-runtime microservice-function microservice-refresh microservice-sdk)
    for pom_module in "${microservice_modules[@]}"
    do
      cp "${PROJECT_DIR}"/"${pom_module}"/pom.xml "${OUTPUT_SDK_DIR}"/"${pom_module}".xml
    done

    # 拷贝子模块的子模块pom文件
    microservice_adapter_module=(microservice-adapter-common microservice-adapter-core microservice-adapter-springboot2)
    for pom_module in "${microservice_adapter_module[@]}"
    do
      cp "${PROJECT_DIR}"/microservice-adapter/"${pom_module}"/pom.xml "${OUTPUT_SDK_DIR}"/"${pom_module}".xml
    done

    microservice_runtime_module=(microservice-runtime-api microservice-runtime-yuanrong)
    for pom_module in "${microservice_runtime_module[@]}"
    do
      cp "${PROJECT_DIR}"/microservice-runtime/"${pom_module}"/pom.xml "${OUTPUT_SDK_DIR}"/"${pom_module}".xml
    done

    microservice_function_module=(microservice-function-yuanrong)
    for pom_module in "${microservice_function_module[@]}"
    do
      cp "${PROJECT_DIR}"/microservice-function/"${pom_module}"/pom.xml "${OUTPUT_SDK_DIR}"/"${pom_module}".xml
    done

    microservice_sdk_module=(microservice-sdk-functionclient microservice-sdk-functionclient-starter microservice-sdk-spring-processor)
    for pom_module in "${microservice_sdk_module[@]}"
    do
      cp "${PROJECT_DIR}"/microservice-sdk/"${pom_module}"/pom.xml "${OUTPUT_SDK_DIR}"/"${pom_module}".xml
    done

    ### 拷贝安装脚本
    cp "${PROJECT_DIR}"/build/install-adapter.sh "${OUTPUT_SDK_DIR}"

    ### 写入本次编译的版本
    echo "${BUILD_VERSION}" > "${OUTPUT_SDK_DIR}"/VERSION

    cd "${OUTPUT_DIR}"
    tar -zcvf spring-adapter-"${BUILD_VERSION}".tar.gz spring-adapter/
    log_info "Package spring-adapter successfully"
}

while getopts "hv:" opt; do
    case "${opt}" in
    h)
        echo -e "${USAGE}"
        exit 0
        ;;
    v)
        BUILD_VERSION="${OPTARG}"
        log_info "BUILD_VERSION: ${OPTARG}"
        ;;

    *)
        log_error "invalid options: $opt"
        exit 1
        ;;
    esac
done

clean
build
package