#!/usr/bin/env bash

# Copyright 2022, FOSS-VG Developers and Contributers
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# version 3 along with this program.
# If not, see https://www.gnu.org/licenses/agpl-3.0.en.html

source scripts/lib.sh

echo -n "Wget or curl? "
if command -v wget >/dev/null 2>&1; then
    USE_WGET=yes
    echo "wget"
else
    if command -v curl >/dev/null 2>&1; then
        USE_WGET=no
        echo "curl"
    else
        echo "Found neither wget nor curl. Aborting."
        exit 1
    fi
fi

function download {
    URL="$1"
    DESTINATION="$2"
    SHA256SUM="$3"

    if [ ! -d .download_cache ]; then
        echo "Cache directory missing."
        create_directory .download_cache
    fi

    if [ -f ".download_cache/$SHA256SUM" ]; then
        if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
            echo "Using locally cached file for $DESTINATION"
            cp ".download_cache/$SHA256SUM" "$DESTINATION"
            return 0
        else
            echo "Locally cached file for $DESTINATION is corrupted."
            rm ".download_cache/$SHA256SUM"
            download "$URL" "$DESTINATION" "$SHA256SUM"
            return $?
        fi
    else
        echo -n "Downloading $URL to $DESTINATION... "
        if [ $USE_WGET = yes ]; then
            wget -O ".download_cache/$SHA256SUM" "$URL" >/dev/null 2>&1
        else
            curl -L "$URL" --output ".download_cache/$SHA256SUM" >/dev/null 2>&1
        fi
        if check_sha256 ".download_cache/$SHA256SUM" "$SHA256SUM"; then
            cp ".download_cache/$SHA256SUM" "$DESTINATION"
            echo "done."
            return 0
        else
            echo "error."
            echo "Checksum verification failed. Your download is either corrupted or the file has been altered. Removing file."
            rm ".download_cache/$SHA256SUM"
            return 1
        fi
    fi
}

scripts/clean.sh
scripts/clean_dependencies.sh

set -e # failures are not acceptable here
create_directory dependencies/tmp
download https://github.com/DuffsDevice/tiny-utf8/archive/refs/tags/v4.4.3.tar.gz dependencies/tmp/tiny-utf8.tar.gz 8e3f61651909c9f3105d3501932a96aa65733127fb6e7cf94cb1b0a2dff42c8f
download https://github.com/fpagliughi/sockpp/archive/refs/tags/v0.8.1.tar.gz dependencies/tmp/sockpp.tar.gz a8aedff8bd8c1da530b91be650352008fddabc9f1df0d19701d76cbc359c8651
download https://www.zlib.net/zlib-1.3.1.tar.xz dependencies/tmp/zlib.tar.xz 38ef96b8dfe510d42707d9c781877914792541133e1870841463bfa73f883e32

#TODO: figure out how to cache shaderc
#also TODO: target a specific commit
git clone --branch known-good https://github.com/google/shaderc.git dependencies/tmp/shaderc
#download https://github.com/google/shaderc/archive/refs/tags/v2023.7.tar.gz dependencies/tmp/shaderc.tar.gz 681e1340726a0bf46bea7e31f10cbfe78e01e4446a35d90fedc2b78d400fcdeb

echo -n ">>> Extracting tiny-utf8... "
gzip -d dependencies/tmp/tiny-utf8.tar.gz
tar -xf dependencies/tmp/tiny-utf8.tar -C dependencies
echo "done"

echo -n ">>> Extracting sockpp... "
gzip -d dependencies/tmp/sockpp.tar.gz
tar -xf dependencies/tmp/sockpp.tar -C dependencies
echo "done"

echo -n ">>> Extracting zlib... "
xz -d dependencies/tmp/zlib.tar.xz
tar -xf dependencies/tmp/zlib.tar -C dependencies
echo "done"

echo ">>> Building sockpp..."
pushd dependencies/sockpp-0.8.1/ >/dev/null 2>&1
if uname -s | tr [:upper:] [:lower:] | grep cygwin >/dev/null; then
    echo "Adding Cygwin workaound for building sockpp."

    #for FILE in "$(find ./ -type f)"; do
    #    sed -i -e 's/_WIN32/PLEASE_DO_NOT_DEFINE_THIS_MACRO/g' $FILE
    #done
    #mv ./include/sockpp/socket.h ./include/sockpp/socket.h_original
    #echo '#include <sys/time.h>
    ##include "socket.h_original"' > ./include/sockpp/socket.h
    sed -i -e 's/SO_REUSEPORT/SO_REUSEADDR/g' ./src/acceptor.cpp

    #CFLAGS="-D_XOPEN_SOURCE=700" CXXFLAGS="-D_XOPEN_SOURCE=700" cmake -Bbuild
    #CFLAGS="-D_XOPEN_SOURCE=700" CXXFLAGS="-D_XOPEN_SOURCE=700" cmake --build build
    cmake -Bbuild .
    cmake --build build
else
    cmake -Bbuild .
    cmake --build build
fi
popd >/dev/null 2>&1
echo ">>> done"

echo ">>> Dealing with shaderc shenanigans..."
pushd dependencies/tmp/shaderc
echo "Getting sources using the provided script..."
./update_shaderc_sources.py
SHADERC_BUILD="build-$(dd if=/dev/urandom bs=1 count=5 2>/dev/null | base32)"
echo "Creating and entering directory $SHADERC_BUILD."
mkdir "$SHADERC_BUILD"
cd "$SHADERC_BUILD"
echo "Running CMake..."
CXXFLAGS="-Wno-error" cmake -GNinja -DCMAKE_BUILD_TYPE=Release ../src/
echo "Running Ninja..."
ninja
popd >/dev/null 2>&1
#if needed copy more relevant files to dependencies/shaderc
echo "Copying binary to dependencies/shaderc/bin..."
mkdir -vp dependencies/shaderc/bin
cp -v "dependencies/tmp/shaderc/$SHADERC_BUILD/glslc/glslc" dependencies/shaderc/bin
echo ">>> done"

echo ">>> Building zlib..."
pushd dependencies/zlib-1.3.1/
./configure
make
popd
echo "done"

echo ">>> Cleaning up..."
remove -f dependencies/tmp
