#!/usr/bin/env bash
# this file is used by feather's CMake
# arguments: ./build.tor $TAG $ROOT_FEATHER_DIR

set -ex

ERR_WIN="This script does not work on Windows"
if [[ "$OSTYPE" == "msys" ]]; then
    echo "$ERR_WIN"
    exit 1
elif [[ "$OSTYPE" == "win32" ]]; then
    echo "$ERR_WIN"
    exit 1
fi

TOR_TAG="$1"
ROOT_DIR="$2"
STATIC="$3"
TOR_DIR="$ROOT_DIR/contrib/tor"
TORSOCKS_DIR="$ROOT_DIR/contrib/torsocks"
TARGET_DIR="$ROOT_DIR/src/tor"

CPU_CORE_COUNT="$(nproc)"

#
### tor
#

pushd "$TOR_DIR"

rm -rf "$TOR_DIR/build"
mkdir -p "$TOR_DIR/build"

# configure
git -C "$TOR_DIR" fetch
git -C "$TOR_DIR" checkout tor-0.4.3.5
bash "$TOR_DIR/autogen.sh"

if [[ "$STATIC" = "ON" ]]; then
    # static assumes that openssl has been compiled with:
    #    CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./config no-asm no-shared no-zlib-dynamic --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
    # and libevent with:
    #    cmake -DEVENT_LIBRARY_STATIC=ON -DOPENSSL_ROOT_DIR=/usr/local/openssl -DCMAKE_INSTALL_PREFIX=/usr/local/libevent
    # and zlib with:
    #    CFLAGS='-fPIC' CXXFLAGS='-fPIC' ./configure --static --prefix=/usr/local/zlib

    LDFLAGS="-L/usr/local/openssl/lib/" LIBS="-lssl -lcrypto -lpthread -ldl" CPPFLAGS="-I/usr/local/openssl/include/" ./configure \
    --enable-static-zlib \
    --enable-static-openssl \
    --enable-static-libevent \
    --disable-system-torrc \
    --with-libevent-dir=/usr/local/libevent \
    --with-openssl-dir=/usr/local/openssl/ \
    --with-zlib-dir=/usr/local/zlib \
    --disable-system-torrc \
    --disable-tool-name-check \
    --disable-systemd \
    --disable-lzma \
    --disable-unittests \
    --disable-zstd \
    --disable-seccomp \
    --disable-asciidoc \
    --disable-manpage \
    --disable-html-manual \
    --disable-system-torrc \
    --prefix="$TOR_DIR/build"
else
    bash "$TOR_DIR/configure" \
    --disable-tool-name-check \
    --disable-systemd \
    --disable-lzma \
    --disable-unittests \
    --disable-zstd \
    --disable-asciidoc \
    --disable-manpage \
    --disable-html-manual \
    --prefix="$TOR_DIR/build"
fi

# build
make -j "$CPU_CORE_COUNT"
make install -j "$CPU_CORE_COUNT"

# copy to lib/tor
cp "$TOR_DIR/build/bin/tor" "$TARGET_DIR"
cp "$TOR_DIR/build/etc/tor/torrc.sample"* "$TARGET_DIR"

#
### torsocks
#

pushd "$TORSOCKS_DIR"
mkdir -p "$TORSOCKS_DIR/build"

# configure
bash "$TORSOCKS_DIR/autogen.sh"
bash "$TORSOCKS_DIR/configure" --prefix="$TORSOCKS_DIR/build"

# build
make -j "$CPU_CORE_COUNT"
make install -j "$CPU_CORE_COUNT"

# copy to lib/torsocks
cp "$TORSOCKS_DIR/build/lib/torsocks/"* "$TARGET_DIR"
cp "$TORSOCKS_DIR/build/bin/"* "$TARGET_DIR"
cp "$TORSOCKS_DIR/build/etc/tor/"* "$TARGET_DIR"

#
### verify installation
#

if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    for fn in "$TARGET_DIR/libtorsocks.so" "$TARGET_DIR/tor"; do
        if [[ ! -f "$fn" ]]; then
            echo "[*] Failed to install tor or torsocks: no such file $fn"
            exit 1
        fi; done
elif [[ "$OSTYPE" == "darwin"* ]]; then
    for fn in "$TARGET_DIR/libtorsocks.dylib" "$TARGET_DIR/tor"; do
        if [[ ! -f "$fn" ]]; then
            echo "[*] Failed to install tor or torsocks: no such file $fn"
            exit 1
        fi; done
fi

echo "[*] Compiled tor/torsocks into $TARGET_DIR"