# Maintainer: aur.chaotic.cx

: ${_electron_version=}
: ${_nodeversion=}

_pkgname="upscayl"
pkgname="$_pkgname-desktop-git"
pkgver=2.15.1.r40.ga3e9186
pkgrel=3
pkgdesc="AI image upscaler, desktop app"
url="https://github.com/upscayl/upscayl"
license=('AGPL-3.0-only')
arch=('x86_64')

depends=(
  "electron${_electron_version:-}"
)
makedepends=(
  'git'
  'nvm'
)
optdepends=(
  'vulkan-intel: Open-source Vulkan driver for Intel GPUs'
  'vulkan-radeon: Open-source Vulkan driver for AMD GPUs'
  'vulkan-nouveau: Open-source Vulkan driver for Nvidia GPUs'
)

provides=("$_pkgname")
conflicts=("$_pkgname")

_pkgsrc="$_pkgname"
source=(
  "$_pkgsrc"::"git+$url.git"
  '0001-adjust-paths.patch'
  '0002-exclude-backend.patch'
)
sha256sums=(
  'SKIP'
  'd9f2c3764995c56b943d2e5f466e41c5ccc42b8b1ecf5d02b18b2b7ae6d39f5d'
  '15a0da5c464cc0514d75cc433333c3af55a66a9d20d751309dfc1343abcd2584'
)

_nvm_env() {
  export HOME="$SRCDEST/node-home"
  export NVM_DIR="$SRCDEST/node-nvm"

  # set up nvm
  source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
  nvm install ${_nodeversion:-node}
  nvm use ${_nodeversion:-node}
}

_electron_env() {
  export SYSTEM_ELECTRON_VERSION=$(< "/usr/lib/electron${_electron_version:-}/version")
  export ELECTRON_VERSION=${SYSTEM_ELECTRON_VERSION%%.*}
}

prepare() {
  _electron_env

  cd "$_pkgsrc"

  # adjustments for packaging
  patch -Np1 -F100 -i '../0001-adjust-paths.patch'
  patch -Np1 -F100 -i '../0002-exclude-backend.patch'

  # set electron version
  sed -E \
    -e 's&^(\s*)("electron"): "(.*)"(,?)$&\1\2: "'"$SYSTEM_ELECTRON_VERSION"'"\4&' \
    -i package.json

  # allow any npm version
  sed -E \
    -e 's&("npm"): \S+$&\1: ">=1.0.0"&' \
    -i package.json
}

pkgver() {
  cd "$_pkgsrc"
  git describe --long --tags --abbrev=7 --exclude='*[a-zA-Z][a-zA-Z]*' \
    | sed -E 's/^[^0-9]*//;s/([^-]*-g)/r\1/;s/-/./g'
}

build() (
  _nvm_env
  _electron_env

  local _builder_options=(
    -c.electronDist="'/usr/lib/electron${ELECTRON_VERSION:-}'"
    -c.electronVersion=${SYSTEM_ELECTRON_VERSION}
  )

  cd "$_pkgsrc"
  NODE_ENV=development npm install --no-audit --no-fund
  NODE_ENV=production npm run tsc
  NODE_ENV=production npm run build
  NODE_ENV=production npm exec -c "electron-builder --linux --dir --publish never ${_builder_options[@]}"
)

package() {
  _electron_env

  depends=(
    "electron${ELECTRON_VERSION:-}"
    'upscayl-models-desktop'
    'upscayl-ncnn'
  )

  # resources
  local _src="$_pkgsrc/dist/linux-unpacked/resources"
  local _dst="$pkgdir/usr/lib/$_pkgname"
  mkdir -pm755 "$_dst"
  rm -f "$_src/app-update.yml"
  cp -a "$_src"/* "$_dst"

  # icon
  install -Dm644 "$_pkgsrc/build/icon.png" "$pkgdir/usr/share/pixmaps/$_pkgname.png"

  # launcher
  install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/$_pkgname.desktop" << END
[Desktop Entry]
Type=Application
Name=${_pkgname^}
Comment=$pkgdesc
Exec=$_pkgname-desktop %U
Icon=$_pkgname
Terminal=false
StartupNotify=true
Categories=Graphics;
StartupWMClass=$_pkgname
END

  # script
  install -Dm755 /dev/stdin "$pkgdir/usr/bin/$_pkgname-desktop" << END
#!/usr/bin/env bash

name="$_pkgname"
flags_file="\${XDG_CONFIG_HOME:-\$HOME/.config}/\${name}-flags.conf"

lines=()
if [[ -f "\${flags_file}" ]]; then
    mapfile -t lines < "\${flags_file}"
fi

flags=()
for line in "\${lines[@]}"; do
  if [[ ! "\${line}" =~ ^[[:space:]]*#.* ]] && [[ -n "\${line}" ]]; then
    flags+=("\${line}")
  fi
done

: \${ELECTRON_IS_DEV:=0}
export ELECTRON_IS_DEV
: \${ELECTRON_FORCE_IS_PACKAGED:=true}
export ELECTRON_FORCE_IS_PACKAGED

exec "/usr/bin/electron${ELECTRON_VERSION:-}" "\${flags[@]}" "/usr/lib/$_pkgname/app.asar" "\$@"
END

  # permissions
  chmod -R u+rwX,go+rX,go-w "$pkgdir/"
}
