#!/bin/bash
set -Eeuo pipefail

RED=$(tput setaf 1)
BOLD=$(tput bold)
RESET=$(tput sgr0)
readonly RED BOLD RESET

traperr() {
  s=$?
  echo "$0: $BASH_COMMAND"
  exit $s
}

trap traperr ERR

PACKAGES=("$@")
EXTRA_ARGS=()
REPOSITORY="grawlinson"

if [ ${#PACKAGES[@]} -eq 0 ]; then
  echo "${BOLD}${RED}ERROR:${RESET}${BOLD} no packages specified${RESET}"
  exit 1
fi

for package in "${PACKAGES[@]}"; do
  (
    # change to package directory
    cd "$package" || exit 1

    # capture output for parsing dependencies
    makepkg_output=$(makepkg --printsrcinfo)

    #
    # cache various downloads
    #
    # rust - crates
    if grep -q "depends = rust\|cargo" <<<"$makepkg_output"; then
      EXTRA_ARGS+=(
        --bind-rw /var/cache/cargo/git:/build/.cargo/git
        --bind-rw /var/cache/cargo/registry:/build/.cargo/registry
      )
    fi

    # go - modules
    if grep -q "depends = go" <<<"$makepkg_output"; then
      EXTRA_ARGS+=(
        --bind-rw /var/cache/golang/pkg:/build/go/pkg
        --bind-rw /var/cache/golang/build:/build/.cache/go-build
      )
    fi

    # dart - packages
    if grep -q "depends = dart" <<<"$makepkg_output"; then
      EXTRA_ARGS+=(--bind-rw /var/cache/dartlang:/build/.pub-cache)
    fi

    # javascript - npm/yarn/pkg
    if grep -q "depends = npm\|yarn\|nodejs" <<<"$makepkg_output"; then
      EXTRA_ARGS+=(
        --bind-rw /var/cache/javascript/npm:/build/.npm
        --bind-rw /var/cache/javascript/pkg-cache:/build/.pkg-cache
        --bind-rw /var/cache/javascript/yarn:/build/.cache/yarn
        --bind-rw /var/cache/javascript/electron:/build/.cache/electron
        --bind-rw /var/cache/javascript/cypress:/build/.cache/Cypress
        --bind-rw /var/cache/javascript/node:/build/.cache/node
      )
    fi

    # nim - nim/nimble
    if grep -q "depends = nim\|nimble" <<<"$makepkg_output"; then
      EXTRA_ARGS+=(
        --bind-rw /var/cache/nim/nim-cache:/build/.cache/nim
        --bind-rw /var/cache/nim/nimble:/build/.nimble
      )
    fi

    # build signed package in chroot & add to local repo
    aur build \
      --chroot \
      --gpg-sign \
      --remove \
      --force \
      --database="$REPOSITORY" \
      --makepkg-conf="/etc/aurutils/makepkg-$REPOSITORY.conf" \
      "${EXTRA_ARGS[@]}"

    # reset EXTRA_ARGS
    EXTRA_ARGS=()
  )
done

exit 0

# vim: set ts=2 sw=2 et