#!/bin/bash

set -e

SCRIPT_DIR=$(dirname $(realpath $0))

PROJECT=ipdemo

function title() {
    # print a title with a line of dashes
    echo "--------------------------------"
    echo "$1"
    echo "--------------------------------"
}

function build() {
    ARCH="$1"

    title "Building $PROJECT.$ARCH"

    if [ "$ARCH" != "arm64" ] && [ "$ARCH" != "amd64" ]; then
        echo "Unsupported architecture: $ARCH"
        exit 1
    fi

    # Create volume if it doesn't exist
    docker volume create cppbuild-cache-$ARCH

    # Directory to copy the executable to
    OUTDIR="$SCRIPT_DIR/output"
    WORKDIR="$SCRIPT_DIR/build/${ARCH}"
    mkdir -p "$OUTDIR"
    mkdir -p "$WORKDIR"
    mkdir -p "$WORKDIR/.ccache"

    echo "WORKDIR: $WORKDIR"
    echo "OUTDIR: $OUTDIR"
    echo "SCRIPT_DIR: $SCRIPT_DIR"

    BUILD_IMAGE="gitea.jde.nz/public/cpp-httplib-builder:$ARCH"

    case $ARCH in
        "arm64") export DOCKCROSS="dockcross-linux-arm64-full";; 
        "amd64") export DOCKCROSS="dockcross-linux-x86_64-full";; 
        *) echo "Unsupported architecture $ARCH"; exit 1;; 
    esac 

    export CC="ccache gcc" 
    export CXX="ccache g++"
    export LD="mold"
    export CCACHE_DIR=${WORKDIR}/.ccache

    cd $SCRIPT_DIR
    $DOCKCROSS bash -c "cmake -B$WORKDIR . -GNinja"
    $DOCKCROSS bash -c "ninja -j$(nproc) -Cbuild/${ARCH}"
    cp "${WORKDIR}/$PROJECT" "${OUTDIR}/$PROJECT.$ARCH"

    # Run the executable if it exists
    if [ ! -f $OUTDIR/$PROJECT.$ARCH ]; then
        echo "Executable not found: $OUTDIR/$PROJECT.$ARCH"
        exit 1
    fi

# Check if the executable is dynamically linked using ldd
    if ldd "$OUTDIR/$PROJECT.$ARCH"; then
        echo "Error: Dynamic dependencies found for $OUTDIR/$PROJECT.$ARCH"
        exit 1 # Exit the script with an error
    else
        echo "Successfully verified no dynamic dependencies for $OUTDIR/$PROJECT.$ARCH"
    fi

    file $OUTDIR/$PROJECT.$ARCH
}

build arm64
build amd64