#!/bin/bash
set -euo pipefail

readonly scriptDir=$(dirname $0)

readonly tmpDir=/tmp/deliver-$$
trap "rm -rf $tmpDir" EXIT
mkdir -p $tmpDir

readonly NAME=SQUAARE

function main
{
  echo "Delivering [$NAME]"
  deliverBinaryVersion
}

function deliverBinaryVersion
{
  local N=$NAME
  local version="$(date +"%Y%m%d")_$(git rev-parse HEAD)"

  mkdir $tmpDir/$N

  echo "Version: $version"

  echo "-------------------------------------"
  echo "Building resources"

  # Shared resources
  DAT=$tmpDir/bin/dat
  BIN=$tmpDir/bin/unused \
  DAT=$DAT \
    make -j`nproc` \
    VERSION="$version" \
    $DAT/data.pak \
    >/dev/null

  echo "-------------------------------------"
  echo "Building binaries"

  # Windows binaries
  BIN_WIN=$tmpDir/bin/w64
  CXXFLAGS="-O3" \
  BIN=$BIN_WIN \
    ./scripts/w64-make -j`nproc` \
    VERSION="$version" \
    $BIN_WIN/client.exe \
    >/dev/null

  gccVersion=$(x86_64-w64-mingw32-g++ -dumpversion)

  cp $tmpDir/bin/w64/client.exe                                      $tmpDir/$N/$N.exe
  cp /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll                 $tmpDir/$N
  cp /usr/lib/gcc/x86_64-w64-mingw32/$gccVersion/libstdc++-6.dll     $tmpDir/$N
  cp /usr/lib/gcc/x86_64-w64-mingw32/$gccVersion/libgcc_s_seh-1.dll  $tmpDir/$N
  cp /opt/envs/x86_64-w64-mingw32/bin/SDL2.dll                       $tmpDir/$N

  # GNU/Linux binaries
  export PATH="/opt/toolchains/x86_64-ace-linux-gnu/bin:$PATH"
  CROSS_COMPILE=x86_64-ace-linux-gnu- \
  PKG_CONFIG_LIBDIR="/opt/envs/x86_64-ace-linux-gnu/lib/pkgconfig" \
  CXXFLAGS="-include extra/glibc_version.h -O3" \
  BIN=$tmpDir/bin/gnu \
    make -j`nproc` \
    VERSION="$version" \
    >/dev/null

  readonly CLIENT_GLIBC=$(nm -D $tmpDir/bin/gnu/client.exe | grep GLIBC_ | sed 's/.*GLIBC_//g' | sort -Vru | head -n 1)
  readonly SERVER_GLIBC=$(nm -D $tmpDir/bin/gnu/server.exe | grep GLIBC_ | sed 's/.*GLIBC_//g' | sort -Vru | head -n 1)
  readonly SERVER_GLIBCXX=$(nm -D $tmpDir/bin/gnu/server.exe | grep GLIBCXX_ | sed 's/.*GLIBCXX_//g' | sort -Vru | head -n 1)

  echo "server required GLIBCXX: '${SERVER_GLIBCXX}'"
  echo "server required GLIBC  : '${SERVER_GLIBC}'"
  echo "client required GLIBC  : '${CLIENT_GLIBC}'"

  if [ ! -z "$SERVER_GLIBCXX" ] ; then
    if [ ! $SERVER_GLIBCXX = "3.4.21" ] ; then
      echo "Error: invalid requirement on server GLIBCXX" >&2
      exit 1
    fi
  fi

  if [ ! $SERVER_GLIBC = "2.17" ] ; then
    echo "Error: invalid requirement on server GLIBC" >&2
    exit 1
  fi

  if [ ! $CLIENT_GLIBC = "2.17" ] ; then
    echo "Error: invalid requirement on client GLIBC" >&2
    exit 1
  fi

  cp -a $tmpDir/bin/gnu/client.exe           $tmpDir/$N/$N.x86_64
  cp -a $tmpDir/bin/gnu/server.exe           $tmpDir/$N/server.x86_64

  # Strip executables
  strip -s $tmpDir/$N/*.{exe,dll,x86_64}

  # Compress executables
  upx -9 $tmpDir/$N/*.{exe,dll,x86_64}

  echo "$version" > "$tmpDir/$N/version.txt"

  # Copy data
  cp -a $tmpDir/bin/dat/data.pak $tmpDir/$N/data.pak

  (
    cd $tmpDir
    zip -q $N.zip -r $N
  )

  cp $tmpDir/$N.zip /tmp/
  du -hs /tmp/$N.zip
}

main
