#! /bin/bash
# Build the plugin for the project
if [ -z $DAEMON ]; then
    DAEMON="./../../daemon"
    echo "DAEMON not provided, building for ${DAEMON}"
fi
if [ -z $ANDROID_NDK ]; then
	ANDROID_NDK=/home/${USER}/Android/Sdk/ndk/21.1.6352462
    echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
fi

PLUGIN_NAME="foregroundsegmentation"
JPL_FILE_NAME=${PLUGIN_NAME}".jpl"
SO_FILE_NAME="lib"${PLUGIN_NAME}".so"
LIBS_DIR="/home/${USER}/Libs"
DAEMON_SRC="${DAEMON}/src"
CONTRIB_PATH="${DAEMON}/contrib"
DESTINATION_PATH="./../build/"
PLUGINS_LIB="../lib"

#=========================================================
#	Check if the ANDROID_ABI was provided
#	if not, set default
#=========================================================
if [ -z $ANDROID_ABI ]; then
    ANDROID_ABI="armeabi-v7a arm64-v8a x86_64"
    echo "ANDROID_ABI not provided, building for ${ANDROID_ABI}"
fi

buildlib() {
	echo $CURRENT_ABI
	#=========================================================
	#	ANDROID TOOLS
	#=========================================================
	export HOST_TAG=linux-x86_64
	export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG

	if [ $CURRENT_ABI = armeabi-v7a ]
	then
	export AR=$TOOLCHAIN/bin/arm-linux-android-ar
	export AS=$TOOLCHAIN/bin/arm-linux-android-as
	export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
	export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
	export LD=$TOOLCHAIN/bin/arm-linux-android-ld
	export RANLIB=$TOOLCHAIN/bin/arm-linux-android-ranlib
	export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
	export ANDROID_SYSROOT=./../../client-android/android-toolchain-21-arm/sysroot

	elif [ $CURRENT_ABI = arm64-v8a ]
	then
	export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
	export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
	export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
	export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
	export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
	export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
	export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
	export ANDROID_SYSROOT=./../../client-android/android-toolchain-21-arm64/sysroot

	elif [ $CURRENT_ABI = x86_64 ]
	then
	export AR=$TOOLCHAIN/bin/x86_64-linux-android-ar
	export AS=$TOOLCHAIN/bin/x86_64-linux-android-as
	export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
	export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
	export LD=$TOOLCHAIN/bin/x86_64-linux-android-ld
	export RANLIB=$TOOLCHAIN/bin/x86_64-linux-android-ranlib
	export STRIP=$TOOLCHAIN/bin/x86_64-linux-android-strip
	export ANDROID_SYSROOT=./../../client-android/android-toolchain-21-x86_64/sysroot

	else
	echo "ABI NOT OK" >&2
	exit 1
	fi

	#=========================================================
	#	CONTRIBS
	#=========================================================
	if [ $CURRENT_ABI = armeabi-v7a ]
	then
	CONTRIB_PLATFORM=arm-linux-androideabi

	elif [ $CURRENT_ABI = arm64-v8a ]
	then
	CONTRIB_PLATFORM=aarch64-linux-android

	elif [ $CURRENT_ABI = x86_64 ]
	then
	CONTRIB_PLATFORM=x86_64-linux-android
	fi

	# ASSETS
	ANDROID_PROJECT_ASSETS=./../../client-android/ring-android/app/src/main/assets
	# LIBS FOLDER
	ANDROID_PROJECT_LIBS=./../../client-android/ring-android/app/src/main/libs/$CURRENT_ABI
	#NDK SOURCES FOR cpufeatures
	NDK_SOURCES=${ANDROID_NDK}/sources/android

	#=========================================================
	#	LD_FLAGS
	#=========================================================
	if [ $CURRENT_ABI = armeabi-v7a ]
	then
	export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi/21"
	elif [ $CURRENT_ABI = arm64-v8a ]
	then
	export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android/21"
	elif [ $CURRENT_ABI = x86_64 ]
	then
	export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android/21"
	fi

	#=========================================================
	#	Compile CPU FEATURES, NEEDED FOR OPENCV
	#=========================================================
	$CC -c $NDK_SOURCES/cpufeatures/cpu-features.c -o cpu-features.o -o cpu-features.o --sysroot=$ANDROID_SYSROOT

	#=========================================================
	#	Compile the plugin
	#=========================================================

	# Create so destination folder
	mkdir -p lib/$CURRENT_ABI

	# Create so destination folder
    $CXX --std=c++14 -O3 -g -fPIC \
	-Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
	-shared \
	-Wall -Wextra \
	-Wno-unused-variable \
	-Wno-unused-function \
	-Wno-unused-parameter \
	-DTFLITE \
	-I"." \
	-I${DAEMON_SRC} \
	-I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
    -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include/opencv4" \
    -I${LIBS_DIR}/_tensorflow_distribution/include/flatbuffers \
	-I${LIBS_DIR}/_tensorflow_distribution/include \
	-I${PLUGINS_LIB} \
	main.cpp \
	videoSubscriber.cpp \
	pluginProcessor.cpp \
    pluginMediaHandler.cpp \
	TFInference.cpp \
	pluginInference.cpp \
	pluginParameters.cpp \
	cpu-features.o \
	-L${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/ \
	-L${LIBS_DIR}/_tensorflow_distribution/lib/${CURRENT_ABI}/ \
	-lswscale \
	-lavutil \
	-lopencv_imgcodecs \
	-lopencv_imgproc \
	-lopencv_core \
    -llibpng \
    -ltensorflowlite \
	-llog -lz \
	--sysroot=$ANDROID_SYSROOT \
	-o lib/$CURRENT_ABI/${SO_FILE_NAME}
	# (above) Always put opencv_core after all other opencv libs when linking statically
	# (above) Put libavutil after other ffmpeg libraries

	cp ${LIBS_DIR}/_tensorflow_distribution/lib/${CURRENT_ABI}/libtensorflowlite.so lib/$CURRENT_ABI
}

# Build the so
for i in ${ANDROID_ABI}; do
	CURRENT_ABI=$i
	buildlib
done

#Export the plugin data folder
mkdir -p ${DESTINATION_PATH}/jpl/${PLUGIN_NAME}/
zip -r ${JPL_FILE_NAME} data manifest.json lib
mv ${JPL_FILE_NAME} ${DESTINATION_PATH}/jpl/${PLUGIN_NAME}/

# Cleanup
# Remove cpu-features object after compilation
rm cpu-features.o
rm -rf lib