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

BUILD_TEST=${1:-BUILD_TEST}
XPU_TYPE=${2:-NPU}
BUILD_PYTHON=${3:-ON}
BUILD_HCOM=${4:-OFF}
BUILD_ETCD_BACKEND=${5:-OFF}
echo "BUILD_TEST is ${BUILD_TEST}"
echo "XPU_TYPE is ${XPU_TYPE}"
echo "BUILD_PYTHON is ${BUILD_PYTHON}"
echo "BUILD_HCOM is ${BUILD_HCOM}"
echo "BUILD_ETCD_BACKEND is ${BUILD_ETCD_BACKEND}"
set -e
readonly BASH_PATH=$(dirname $(readlink -f "$0"))
CURRENT_DIR=$(pwd)
PROJECT_DIR=${BASH_PATH}/../..

cd ${BASH_PATH}

# get commit id
GIT_COMMIT=`git rev-parse HEAD` || true

# get arch
if [ $( uname -m | grep -c -i "x86_64" ) -ne 0 ]; then
    echo "it is system of x86_64"
    ARCH="x86_64"
elif [ $( uname -m | grep -c -i "aarch64" ) -ne 0 ]; then
    echo "it is system of aarch64"
    ARCH="aarch64"
else
    echo "it is not system of x86_64 or aarch64"
    exit 1
fi

#get os
OS_NAME=$(uname -s | awk '{print tolower($0)}')
ARCH_OS=${ARCH}-${OS_NAME}

PKG_DIR="memfabric_hybrid"
VERSION="$(cat ${PROJECT_DIR}/VERSION | tr -d '[:space:]')"
OUTPUT_DIR=${BASH_PATH}/../../output

rm -rf ${PKG_DIR}
mkdir -p ${PKG_DIR}/"${ARCH_OS}"
mkdir ${PKG_DIR}/include
mkdir ${PKG_DIR}/"${ARCH_OS}"/lib64
mkdir ${PKG_DIR}/"${ARCH_OS}"/wheel
mkdir -p ${PKG_DIR}/include/smem
mkdir -p ${PKG_DIR}/include/hybm
mkdir -p ${PKG_DIR}/include/hcom

# hcom
if [ "${BUILD_HCOM}" == "ON" ]; then
cp "${PROJECT_DIR}"/output/3rdparty/hcom/lib/libhcom.so ${PKG_DIR}/"${ARCH_OS}"/lib64
cp -v "${PROJECT_DIR}"/build/_deps/hcom-src/dist/hcom_3rdparty/libboundscheck/lib/libboundscheck.so \
       ${PKG_DIR}/"${ARCH_OS}"/lib64
fi
# etcd
if [ "${BUILD_ETCD_BACKEND}" == "ON" ]; then
    echo "========= package etcd client ============"
    cp "${PROJECT_DIR}"/output/etcd/lib64/libetcd_client_v3.so ${PKG_DIR}/"${ARCH_OS}"/lib64
fi
# smem
cp -r "${OUTPUT_DIR}"/smem/include/* ${PKG_DIR}/include/smem/
cp "${OUTPUT_DIR}"/smem/lib64/* ${PKG_DIR}/"${ARCH_OS}"/lib64
# hybm
cp -r "${OUTPUT_DIR}"/hybm/include/* ${PKG_DIR}/include/hybm/
cp "${OUTPUT_DIR}"/hybm/lib64/libmf_hybm_core.so ${PKG_DIR}/"${ARCH_OS}"/lib64/
cp -r "${PROJECT_DIR}"/src/hybm/csrc/copy_extend ${PKG_DIR}

# memfabric_hybrid wheel package
if [ "${BUILD_PYTHON}" = "ON" ]; then
    cp -r "${OUTPUT_DIR}"/memfabric_hybrid/wheel/*.whl ${PKG_DIR}/"${ARCH_OS}"/wheel/
fi

if [ "$BUILD_TEST" = "ON" ]; then
    mkdir -p ${PKG_DIR}/"${ARCH_OS}"/test/mock_server
    cp "${PROJECT_DIR}"/test/python/mock_server/server.py ${PKG_DIR}/"${ARCH_OS}"/test/mock_server
    mkdir -p ${PKG_DIR}/"${ARCH_OS}"/test/mock_server/smem_bm
    cp "${PROJECT_DIR}"/test/python/mock_server/smem_bm/*.py ${PKG_DIR}/"${ARCH_OS}"/test/mock_server/smem_bm
    cp ${OUTPUT_DIR}/smem/bin/* ${PKG_DIR}/"${ARCH_OS}"/test || true
    mkdir -p ${PKG_DIR}/"${ARCH_OS}"/test/transfer_perf_python
    cp "${PROJECT_DIR}"/benchmark/transfer/perf_python/*.py ${PKG_DIR}/"${ARCH_OS}"/test/transfer_perf_python
    cp "${PROJECT_DIR}"/benchmark/transfer/perf_python/*.sh ${PKG_DIR}/"${ARCH_OS}"/test/transfer_perf_python
fi

mkdir -p ${PKG_DIR}/script
echo "in make_run.sh, XPU_TYPE is $XPU_TYPE"
cp "${BASH_PATH}"/install.sh ${PKG_DIR}/script/
sed -i "s/<<XPU_TYPE>>/${XPU_TYPE}/g" ${PKG_DIR}/script/install.sh
cp "${BASH_PATH}"/uninstall.sh ${PKG_DIR}/script/

# generate version.info
touch ${PKG_DIR}/version.info
cat>>${PKG_DIR}/version.info<<EOF
Version:${VERSION}
Platform:${ARCH}
Kernel:${OS_NAME}
CommitId:${GIT_COMMIT}
EOF

# make run
case "$XPU_TYPE" in
    NPU)
        XPU_SUFFIX=""
        ;;
    NONE)
        XPU_SUFFIX="_cpu"
        ;;
    GPU)
        XPU_SUFFIX="_gpu"
        ;;
    "")
        echo "Error: Environment variable XPU_TYPE is not set. Must be exactly one of: NPU, NONE, GPU." >&2
        exit 1
        ;;
    *)
        echo "Error: Invalid value for XPU_TYPE: '$XPU_TYPE'. Must be exactly one of: NPU, NONE, GPU." >&2
        exit 1
        ;;
esac

FILE_NAME=${PKG_DIR}-${VERSION}_${OS_NAME}_${ARCH}${XPU_SUFFIX}
tar -cvf "${FILE_NAME}".tar.gz ${PKG_DIR}/
cat run_header.sh "${FILE_NAME}".tar.gz > "${FILE_NAME}".run
mv "${FILE_NAME}".run "${OUTPUT_DIR}"
rm -rf ${PKG_DIR}
rm -rf "${FILE_NAME}".tar.gz

cd "${CURRENT_DIR}"