#! /bin/bash
# Build the plugin for the project
set -e
export OSTYPE
ARCH=$(uname -m)
EXTRAPATH=''
# Flags:

# -p: number of processors to use.
# -c: Runtime plugin cpu/gpu setting.
# -t: target platform.
# -d: debug program.

if [ -z "${DAEMON}" ]; then
    echo "DAEMON not provided, building with ./../daemon"
fi

DAEMON=${DAEMON:="./../daemon"}
CONTRIB_PATH=${CONTRIB_PATH:="${DAEMON}/contrib"}
CONTRIB_BUILD_DIR=${CONTRIB_BUILD_DIR:="native"}

PLUGIN_NAME="WhisperTranscript"
JPL_FILE_NAME="${PLUGIN_NAME}.jpl"
SO_FILE_NAME="lib${PLUGIN_NAME}.so"
DAEMON_SRC="${DAEMON}/src"
PLUGINS_LIB="../lib"
LIBS_DIR="./../contrib/Libs"
PLATFORM=$(uname)
CONTRIB_BUILD_PATH="${CONTRIB_PATH}/${CONTRIB_BUILD_DIR}"

if [ "${PLATFORM}" = "Linux" ]; then
    PLATFORM="linux-gnu"
    CONTRIB_PLATFORM_CURT=${ARCH}
    echo "Building with ${PLATFORM}"
elif [ "${PLATFORM}" = "Darwin" ]; then
    PLATFORM="darwin"
    SO_FILE_NAME="lib${PLUGIN_NAME}.dylib"
    alias nproc='sysctl -n hw.logicalcpu'
    CONTRIB_PLATFORM_CURT=${ARCH}-apple
    CONTRIB_PLATFORM_EXTRA=$(uname -r)
    echo "Building with ${PLATFORM}"
fi

while getopts t:c:p:d OPT; do
  case "$OPT" in
    d)
        DEBUG=true
        export __DEBUG__=true
    ;;
    t)
        PLATFORM="${OPTARG}"
    ;;
    c)
        PROCESSOR="${OPTARG}"
    ;;
    p)
    ;;
    \?)
        exit 1
    ;;
  esac
done

if [ -z "${PROCESSOR}" ]; then
    PROCESSOR="CPU"
    echo "PROCESSOR not provided, building with ${PROCESSOR}"
fi

if [ "${PROCESSOR}" = "CPU" ]; then
    ONNX_LIBS="cpu"
elif [ "${PROCESSOR}" = "GPU" ]; then
    PROCESSOR="NVIDIA"
    ONNX_LIBS="nvidia-gpu"
    CUBLASLT="-lcublasLt"
fi

echo $PROCESSOR

cp -r ffmpeg ${CONTRIB_PATH}/src/
cp -r whispercpp ${CONTRIB_PATH}/src/
cp -r ../contrib/rav1e ${CONTRIB_PATH}/src/

if [ ! -f "./data/assets/ggml-base.bin" ]; then
    if [ -x "$(command -v wget)" ]; then
        wget --quiet --show-progress -O ./data/assets/ggml-base.bin https://ggml.ggerganov.com/ggml-model-whisper-base.bin
    elif [ -x "$(command -v curl)" ]; then
        curl --output ./data/assets/ggml-base.bin https://ggml.ggerganov.com/ggml-model-whisper-base.bin
    else
        printf "Either wget or curl is required to download models.\n"
        exit 1
    fi
fi

if [ ! -f "./data/assets/ggml-base.bin" ]; then
    printf "Model is required to build the plugin. Aborting.\n"
    exit 1
fi

if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
then
    if [ -f "${CONTRIB_BUILD_PATH}/.ffmpeg" ]; then
        rm "${CONTRIB_BUILD_PATH}/.ffmpeg"
        rm -rf "${CONTRIB_BUILD_PATH}/ffmpeg"
    fi
    if [ -f "${CONTRIB_BUILD_PATH}/.whispercpp" ]; then
        rm "${CONTRIB_BUILD_PATH}/.whispercpp"
        rm -rf "${CONTRIB_BUILD_PATH}/whispercpp"
    fi
    WORKPATH=$(pwd)
    cd "${CONTRIB_BUILD_PATH}/"
    make .ffmpeg -j$(nproc) install
    make .whispercpp -j$(nproc) install
    rm .whispercpp
    rm .ffmpeg
    cd ${WORKPATH}

    CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
    if [ ${DEBUG} ]; then
        OUTPUT="${PLUGIN_NAME}"
        CLANG_OPTS="-O0 -g -fsanitize=address"
        EXTRA_DEBUG_LIBRARIES="-lyaml-cpp -lvdpau -lX11 -lva-drm -lva-x11 -lrav1e"
        EXTRA_DEFINES="-D__DEBUG__"
    else
        python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
        CLANG_OPTS="-O3 -g -shared"
        OUTPUT="build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
    fi

    # Compile
    clang++ -std=c++17 -fPIC ${CLANG_OPTS} \
    -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
    -Wall -Wextra \
    -Wno-unused-parameter \
    ${EXTRA_DEFINES} \
    -D${PROCESSOR} \
    -I"." \
    -I"${DAEMON_SRC}" \
    -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
    -I"${PLUGINS_LIB}" \
    ./../lib/common.cpp \
    ./../lib/accel.cpp \
    ./../lib/frameFilter.cpp \
    ./../lib/frameUtils.cpp \
    ./../lib/resampler.cpp \
    main.cpp \
    TranscriptMediaHandler.cpp \
    TranscriptAudioSubscriber.cpp \
    TranscriptVideoSubscriber.cpp \
    PluginPreferenceHandler.cpp \
    stt_whisper.cpp \
    -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib" \
    -l:libavfilter.a \
    -l:libswscale.a \
    -l:libswresample.a \
    -l:libavformat.a \
    -l:libavcodec.a \
    -l:libavutil.a \
    -l:libwhisper.a \
    -lfreetype \
    -lvpx \
    -lx264 \
    -lspeex \
    -lopus \
    -lz \
    -lva \
    -lfmt \
    ${EXTRA_DEBUG_LIBRARIES} \
    -o "${OUTPUT}"

elif [ "${PLATFORM}" = "darwin" ]
then
    if [ -f "${CONTRIB_BUILD_PATH}/.ffmpeg" ]; then
        rm "${CONTRIB_BUILD_PATH}/.ffmpeg"
        rm -rf "${CONTRIB_BUILD_PATH}/ffmpeg"
    fi
    if [ -f "${CONTRIB_BUILD_PATH}/.whispercpp" ]; then
        rm "${CONTRIB_BUILD_PATH}/.whispercpp"
        rm -rf "${CONTRIB_BUILD_PATH}/whispercpp"
    fi
    WORKPATH=$(pwd)
    cd "${CONTRIB_BUILD_PATH}/"
    make .whispercpp
    make .ffmpeg
    rm .whispercpp
    rm .ffmpeg
    cd ${WORKPATH}

    CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
    if [ ${DEBUG} ]; then
      OUTPUT="${PLUGIN_NAME}"
      CLANG_OPTS="-O0 -g -fsanitize=address"
      EXTRA_DEBUG_LIBRARIES="-lyaml-cpp -lrav1e"
      EXTRA_DEFINES="-D__DEBUG__"
    else
      python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
      CLANG_OPTS="-O3 -g -shared"
      OUTPUT="build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
    fi

    # Compile
    clang++ -std=c++17 -fPIC ${CLANG_OPTS} \
    -Wl,-no_compact_unwind -Wl,-framework,CoreFoundation \
    -Wl,-framework,Security -Wl,-framework,VideoToolbox \
    -Wl,-framework,CoreMedia -Wl,-framework,CoreVideo \
    -Wl,-framework,OpenCl -Wl,-framework,Accelerate \
    -Wl,-rpath,"\${ORIGIN}" \
    -Wall -Wextra \
    -Wno-unused-parameter \
    ${EXTRA_DEFINES} \
    -D${PROCESSOR} \
    -I"." \
    -I"${DAEMON_SRC}" \
    -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/include" \
    -I"${PLUGINS_LIB}" \
    ./../lib/common.cpp \
    ./../lib/accel.cpp \
    ./../lib/frameFilter.cpp \
    ./../lib/frameUtils.cpp \
    ./../lib/resampler.cpp \
    main.cpp \
    TranscriptMediaHandler.cpp \
    TranscriptAudioSubscriber.cpp \
    TranscriptVideoSubscriber.cpp \
    PluginPreferenceHandler.cpp \
    stt_whisper.cpp \
    -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/" \
    -lavfilter \
    -lswscale \
    -lswresample \
    -lavformat \
    -lavcodec \
    -lavutil \
    -lvpx -lx264 -lbz2 -liconv -lz \
    "${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/libspeex.a" \
    "${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/libopus.a" \
    -lfmt \
    -lwhisper \
    "/usr/local/opt/libpng/lib/libpng.a" \
    "/usr/local/opt/freetype/lib/libfreetype.a" \
    ${EXTRA_DEBUG_LIBRARIES} \
    -o "${OUTPUT}"

    if [ -n "${APPLE_SIGN_CERTIFICATE}" ]; then
      codesign --force --verify --timestamp -o runtime --sign "${APPLE_SIGN_CERTIFICATE}"  "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"

      ditto -c -k --rsrc "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}" "build-local/${SO_FILE_NAME}.zip"
      LIBRARYNAME=${SO_FILE_NAME} sh ./../notarize.sh
      ditto -x -k "build-local/${SO_FILE_NAME}.zip" "build-local/notarized"
      cp "build-local/notarized/${SO_FILE_NAME}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
    fi

elif [ "${PLATFORM}" = "android" ]
then
    python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}

    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

    #=========================================================
    #    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
        export AR=$TOOLCHAIN/bin/llvm-ar
        export AS=$TOOLCHAIN/bin/llvm-as
        export LD=$TOOLCHAIN/bin/ld
        export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
        export STRIP=$TOOLCHAIN/bin/llvm-strip
        export ANDROID_SYSROOT=$TOOLCHAIN/sysroot

        if [ "$CURRENT_ABI" = armeabi-v7a ]
        then
        export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
        export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++

        elif [ "$CURRENT_ABI" = arm64-v8a ]
        then
        export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
        export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++

        elif [ "$CURRENT_ABI" = x86_64 ]
        then
        export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
        export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++

        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

        if [ -f "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
            rm "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/.ffmpeg"
        fi

        WORKPATH=$(pwd)
        cd "${CONTRIB_BUILD_PATH}-${CONTRIB_PLATFORM}/"
        make .ffmpeg -j$(nproc)
        make .whispercpp -j$(nproc)
        rm .whispercpp
        rm .ffmpeg
        cd ${WORKPATH}

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

        # Create so destination folder
        $CXX --std=c++17 -O3 -fPIC \
        -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
        -shared \
        -Wall -Wextra \
        -Wno-unused-parameter \
        -DANDROID \
        -I"." \
        -I"${DAEMON_SRC}" \
        -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
        -I"${PLUGINS_LIB}" \
        ./../lib/common.cpp \
        ./../lib/accel.cpp \
        ./../lib/frameFilter.cpp \
        ./../lib/frameUtils.cpp \
        main.cpp \
        TranscriptMediaHandler.cpp \
        TranscriptAudioSubscriber.cpp \
        TranscriptVideoSubscriber.cpp \
        PluginPreferenceHandler.cpp \
        stt_whisper.cpp \
        ./../lib/resampler.cpp \
        -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/" \
        -lavfilter \
        -lswscale \
        -lswresample \
        -lavformat \
        -lavcodec \
        -lavutil \
        -lvpx \
        -lx264 \
        -lspeex \
        -lopus \
        -lfmt \
        -lwhisper \
        -l:libfreetype.a \
        -llog -lz \
        --sysroot=$ANDROID_SYSROOT \
        -o "build-local/jpl/lib/$CURRENT_ABI/${SO_FILE_NAME}"
    }

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

if [ ! ${DEBUG} ]; then
python3 ./../SDK/jplManipulation.py --assemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM} --extraPath=${EXTRAPATH}
fi

cd ${CONTRIB_PATH}/src/ffmpeg/
# ffmpeg build configuration files were changed during plugin build
# this git checkout will remove these changes
git checkout -- .
