#!/bin/bash
set -e

PKG_NAME=dhtnet
PKG_VERSION=0.3.0

FOLDER_NAME="${PKG_NAME}-${PKG_VERSION}"

# move pwd to the directory of this script (extras/packaging)
cd "$(dirname "$0")" || exit 1

rm -Rf "${FOLDER_NAME}"
rm -f -- *${PKG_NAME}-${PKG_VERSION}.tar.gz
mkdir -p "${FOLDER_NAME}"

rm -Rf "../../dependencies/msgpack"
rm -Rf "../../dependencies/opendht"
rm -Rf "../../dependencies/pjproject"
rm -Rf "../../dependencies/restinio"
(cd ../.. && git submodule update --init --recursive)

build_ubuntu=false
build_ubuntu20=false
build_ubuntu22=false
build_ubuntu24=false
build_debian=false
build_debian10=false
build_debian11=false
build_debian12=false

parse_args() {
    while [ "$1" != "" ]; do
        case $1 in
            -u | --ubuntu )         build_ubuntu=true
                                    build_ubuntu20=true
                                    build_ubuntu22=true
                                    build_ubuntu24=true
                                    ;;
            -u20 | --ubuntu20 )     build_ubuntu20=true
                                    build_ubuntu=true
                                    ;;
            -u22 | --ubuntu22 )     build_ubuntu22=true
                                    build_ubuntu=true
                                    ;;
            -u24 | --ubuntu24 )     build_ubuntu24=true
                                    build_ubuntu=true
                                    ;;
            -d | --debian )         build_debian=true
                                    build_debian10=true
                                    build_debian11=true
                                    build_debian12=true
                                    ;;
            -d10 | --debian10 )     build_debian10=true
                                    build_debian=true
                                    ;;
            -d11 | --debian11 )     build_debian11=true
                                    build_debian=true
                                    ;;
            -d12 | --debian12 )     build_debian12=true
                                    build_debian=true
                                    ;;
            -a | --all )            build_ubuntu=true
                                    # not working: build_ubuntu20=true
                                    build_ubuntu22=true
                                    build_ubuntu24=true
                                    build_debian=true
                                    # not working: build_debian10=true
                                    # not working: build_debian11=true
                                    build_debian12=true
                                    ;;
            * )                     echo "Argument '$1' is not recognized"
                                    ;;
        esac
        shift
    done
}

parse_args "$@"


# copy source code
cp -Rf ../../dependencies "${FOLDER_NAME}/dependencies"
cp -Rf ../../include "${FOLDER_NAME}/include"
cp -Rf ../../src "${FOLDER_NAME}/src"
cp -Rf ../../tools "${FOLDER_NAME}/tools"
cp -Rf ../../CMakeLists.txt "${FOLDER_NAME}/CMakeLists.txt"
cp -Rf ../../COPYING "${FOLDER_NAME}/COPYING"
cp -Rf ../../dhtnet.pc.in "${FOLDER_NAME}/dhtnet.pc.in"
cp -Rf ../../README.md "${FOLDER_NAME}/README.md"

if [ "$build_ubuntu" == true ] || [ "$build_debian" == true ]; then
    # copy debian conf
    cp -Rf "./gnu-linux/debian" "${FOLDER_NAME}/debian"

    tar -czf "deb-${PKG_NAME}-${PKG_VERSION}.tar.gz" "${FOLDER_NAME}"
    rm -Rf "${FOLDER_NAME}/debian"
fi

rm -Rf "${FOLDER_NAME}"
echo "Archives <os>-${PKG_NAME}-${PKG_VERSION}.tar.gz are ready, starting builds... (will take few minutes)"

#######################

started_builds=()
started_pid=()
remainning_builds=0

build_target() {
    target="$1"
    mkdir -p "$target"
    docker build -t "dhtnet-builder:$target" -f "gnu-linux/$target.Dockerfile" --build-arg PKG_NAME="$FOLDER_NAME" .
    remainning_builds=$((remainning_builds+1))
    (
        docker run --rm \
            -v "$(pwd)/$target/":/build/debs \
            -e PKG_NAME="$FOLDER_NAME" "dhtnet-builder:$target" > "$target/build.log" 2>&1;
        if [ $? -eq 0 ]; then
            rm -f -- $target/build-at-*
            echo "$target package built at $(date)" > "$target/build-at-$(date +%F-%R)"
            echo "Successfully built $target package"
        else
            echo "Failed to build $target package, check log for more details"
        fi
    ) &
    started_pid+=("$!")
    started_builds+=("$target")
}

# build Ubuntu package (deb-*)
if [ "$build_ubuntu24" == true ]; then
    build_target "ubuntu-24"
fi

if [ "$build_ubuntu22" == true ]; then
    build_target "ubuntu-22"
fi

if [ "$build_ubuntu20" == true ]; then
    build_target "ubuntu-20"
fi

# build Debian package (deb-*)
if [ "$build_debian12" == true ]; then
    build_target "debian-12"
fi

if [ "$build_debian11" == true ]; then
    build_target "debian-11"
fi

if [ "$build_debian10" == true ]; then
    build_target "debian-10"
fi


while [ $remainning_builds -gt 0 ]; do
    time="$(date +%T)"
    for index in "${!started_builds[@]}"; do
        if [ "${started_pid[$index]}" != "" ]; then
            if ps -p "${started_pid[$index]}" > /dev/null; then
                echo "[$time] Still building ${started_builds[$index]}... (pid: ${started_pid[$index]})"
            else
                echo "[$time] Build ${started_builds[$index]} finished"
                remainning_builds=$((remainning_builds-1))
                started_pid[index]=""
            fi
        fi
    done
    if [ $remainning_builds -gt 0 ]; then
        sleep 30
    fi
done

echo "[$(date +%T)] All builds finished:"
for target in "${started_builds[@]}"; do
    echo "  - $target"
done
