#!/bin/bash

# Slackware build script for element-desktop

# Copyright 2025-2026 Vladislav 'fsLeg' Borisov, Moscow, Russia
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

cd $(dirname $0) ; CWD=$(pwd)

PRGNAM=element-desktop
WEBNAM=element-web
VERSION=${VERSION:-1.12.15}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
  echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
  exit 0
fi

TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i586" -o "$ARCH" = "i686" ]; then
  echo
  echo "*************************************************************"
  echo "Element-desktop relies on Electron which doesn't support"
  echo "x86 architecture anymore, therefore it can't be built on"
  echo "an x86 system."
  echo "*************************************************************"
  echo
  exit 1
elif [ "$ARCH" = "x86_64" -o "$ARCH" = "aarch64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

set -e

export PATH="/opt/rust/bin:$PATH"
if [ -z "$LD_LIBRARY_PATH" ]; then
  export LD_LIBRARY_PATH="/opt/rust/lib$LIBDIRSUFFIX"
else
  export LD_LIBRARY_PATH="/opt/rust/lib$LIBDIRSUFFIX:$LD_LIBRARY_PATH"
fi

BASE_TMP_DIR=$TMP/$WEBNAM-$VERSION
export YARN_YARN_OFFLINE_MIRROR=$BASE_TMP_DIR/vendor
export YARN_CACHE_FOLDER=$BASE_TMP_DIR/cache
export npm_config_cache=$YARN_CACHE_FOLDER
export npm_config_nodedir=/usr
export npm_config_offline=true
export COREPACK_HOME=$BASE_TMP_DIR/corepack
export COREPACK_ENABLE_NETWORK=0
export XDG_CACHE_HOME=$BASE_TMP_DIR/electron-cache
export XDG_CONFIG_HOME="$BASE_TMP_DIR"
export CARGO_HOME=$BASE_TMP_DIR/cargo
export CFLAGS="$SLKCFLAGS"
export CXXFLAGS="$SLKCFLAGS"

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $WEBNAM-$VERSION
tar xvf $CWD/$WEBNAM-$VERSION.tar.gz
tar xvf $CWD/$PRGNAM-$VERSION-vendored-sources.tar.xz

corepack install --global --cache-only $COREPACK_HOME/pm.tgz
mkdir -p $COREPACK_HOME/bin
corepack enable --install-directory $COREPACK_HOME/bin
export PATH=$COREPACK_HOME/bin:$PATH

cd $WEBNAM-$VERSION
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

pnpm config set store-dir "$XDG_CONFIG_HOME/pnpm-store"
pnpm install --frozen-lockfile \
             --offline
VERSION=$VERSION \
NX_TUI=false \
  pnpm -C apps/web run build

cd apps/desktop
chown -R root:root .
find -L . \
 \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
  -o -perm 511 \) -exec chmod 755 {} \; -o \
 \( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
  -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;

# use vendored sources and prevent warnings
patch -p1 < $CWD/yarn-offline.patch
sed -i 's|yarn |yarn --offline |g
        s|cargo build |cargo build --frozen |' \
        .hak/hakModules/matrix-seshat/package.json

mkdir -p deploys
mv ../web/webapp deploys/element-v$VERSION
pnpm install --frozen-lockfile \
             --offline
pnpm run fetch --noverify --cfgdir ""
CRATE_CC_NO_DEFAULTS=1 \
RUSTFLAGS="-C target-cpu=native" \
  pnpm run build:native
rm -r .hak/hakModules/matrix-seshat/{.cargo,node_modules,target,vendor}
pnpm run build --publish never

mkdir -p $PKG/usr/{bin,lib$LIBDIRSUFFIX,share/applications}
mv dist/linux-unpacked $PKG/usr/lib$LIBDIRSUFFIX/element-desktop

find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true

install -Dm644 $CWD/element-desktop.desktop $PKG/usr/share/applications/io.element.Element.desktop
ln -s /usr/lib$LIBDIRSUFFIX/element-desktop/element-desktop $PKG/usr/bin/

for geometry in 16x16 24x24 32x32 48x48 64x64 96x96 128x128 256x256 512x512; do
  mkdir -p $PKG/usr/share/icons/hicolor/$geometry/apps
  magick build/icon.png -resize $geometry $PKG/usr/share/icons/hicolor/$geometry/apps/$PRGNAM.png
done

mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a CHANGELOG.md README.md ../../{AUTHORS.rst,CONTRIBUTING.md,LICENSE-*} $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE
