#!/usr/bin/env bash

usage() {
    echo -e "Build Jellyfin FFMPEG deb packages"
    echo -e " $0 <release> <arch>"
    echo -e "Releases:          Arches:"
    echo -e " * bullseye         * amd64"
    echo -e " * bookworm         * arm64"
    echo -e " * trixie"
    echo -e " * jammy"
    echo -e " * noble"
    echo -e " * resolute"
}

if [[ -z ${1} ]]; then
    usage
    exit 1
fi

cli_release="${1}"
case ${cli_release} in
    'bullseye')
        release="debian:bullseye"
        gcc_ver="10"
        llvm_ver="16"
        llvmspirvlib_ver="11"
    ;;
    'bookworm')
        release="debian:bookworm"
        gcc_ver="12"
        llvm_ver="19"
        llvmspirvlib_ver="15"
    ;;
    'trixie')
        release="debian:trixie"
        gcc_ver="14"
        llvm_ver="19"
        llvmspirvlib_ver="19"
    ;;
    'jammy')
        release="ubuntu:jammy"
        gcc_ver="11"
        llvm_ver="15"
        llvmspirvlib_ver="15"
    ;;
    'noble')
        release="ubuntu:noble"
        gcc_ver="13"
        llvm_ver="19"
        llvmspirvlib_ver="19"
    ;;
    'resolute')
        release="ubuntu:resolute"
        gcc_ver="15"
        llvm_ver="20"
        llvmspirvlib_ver="20"
    ;;
    *)
        echo "Invalid release."
        usage
        exit 1
    ;;
esac

cli_arch="${2}"
case ${cli_arch} in
    'amd64')
        arch="amd64"
    ;;
    'arm64')
        arch="arm64"
    ;;
    *)
        echo "Invalid architecture."
        usage
        exit 1
    ;;
esac

set -o xtrace
set -o errexit

# Check for dependencies
if ! command -v "docker" &>/dev/null && command -v "podman" &>/dev/null; then
    container_cmd=podman
else
    container_cmd=docker
fi

for dep in ${container_cmd} make mmv; do
    command -v "${dep}" &>/dev/null || { echo "The command '${dep}' is required."; exit 1; }
done

image_name="jellyfin-ffmpeg-build-${cli_release}"
package_temporary_dir="$( mktemp -d )"

# Trap cleanup for latter sections
cleanup() {
    # Clean up the Dockerfile
    make -f Dockerfile.make clean
    # Remove tempdir
    rm -rf "${package_temporary_dir}"
}
trap cleanup EXIT INT

# Generate Dockerfile
make -f Dockerfile.make DISTRO=${release} GCC_VER=${gcc_ver} LLVM_VER=${llvm_ver} LLVMSPIRVLIB_VER=${llvmspirvlib_ver} ARCH=${arch}
# Set up the build environment docker image
${container_cmd} build . -t "${image_name}"
# Build the APKs and copy out to ${package_temporary_dir}
${container_cmd} run --rm -e "RELEASE=${release}" -v "${package_temporary_dir}:/dist" "${image_name}"
# If no 3rd parameter was specified, move APKs to parent directory
if [[ -z ${3} ]]; then
    path="../bin"
else
    path="${3}"
fi
mkdir "${path}" &>/dev/null || true
mmv "${package_temporary_dir}/deb/*.deb" "${path}/#1.deb"
mmv "${package_temporary_dir}/deb/*_${arch}.*" "${path}/#1-${cli_release}_${arch}.#2"
