#!/usr/bin/env bash
# vim:et:ts=2:sts=2:sw=2

# Get absolute repository root
ROOT="$(realpath "$(dirname "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")")")"

# Load accompanying bash library
source "$ROOT/lib/lib.bash"

# Exit now if run as root
assert-is-user

DEST_DIR="/usr/local/src"
PACKAGES_FILE="$ROOT/roles/desktop/packages.txt"

SUCCESS_LIST=()
FAILED_LIST=()

cleanup() {
  say "Cleaning up environment..."
  sudo pacman -Rs --noconfirm wget &>/dev/null || true
  sudo rm -f "$DEST_DIR"/*.sig "$DEST_DIR"/*.part 2>/dev/null || true
}

if [ ! -f "$PACKAGES_FILE" ]; then
  err "Package list not found at $PACKAGES_FILE"
  exit 1
fi

say "Starting local package cache process in $DEST_DIR"
sudo mkdir -p "$DEST_DIR"
sudo chown "$USER:$USER" "$DEST_DIR"

sudo pacman -Sy
sudo pacman -S --needed --noconfirm wget git base-devel

# Process a single package
process_package() {
  local name="$1"
  local target_name="$name"
  [ "$name" == "blender-3.6-bin" ] && target_name="blender36"

  if [ -f "$DEST_DIR/$target_name.pkg.tar.zst" ]; then
    say "Package $(c "$name") already cached. Skipping."
    return 0
  fi

  say "Processing $(c "$name")..."

  if pacman -Si "$name" &>/dev/null; then
    # Repo package
    run sudo pacman -Sw "$name" --cachedir "$DEST_DIR" --noconfirm --needed || return 1
  else
    # AUR package
    say "Building AUR package $(c "$name")..."
    local tmp_build=$(mktemp -d)
    local status=1
    (
      cd "$tmp_build"
      if yay -G "$name" && cd *; then
        run makepkg -sr --noconfirm --needed
        local built=$(ls "${name}"-*.pkg.tar.zst 2>/dev/null | head -n 1)
        if [ -n "$built" ]; then
          cp -v "$built" "$DEST_DIR/"
          exit 0
        fi
      fi
      exit 1
    ) && status=0
    rm -rf "$tmp_build"
    [ $status -eq 0 ] || return 1
  fi

  # Find and rename
  local file=$(find "$DEST_DIR" -maxdepth 1 -name "${name}-[0-9]*.pkg.tar.zst" -print | sort -V | tail -n 1)
  if [ -n "$file" ]; then
    say "Renaming $(basename "$file") to $(g "$target_name.pkg.tar.zst")"
    mv -f "$file" "$DEST_DIR/$target_name.pkg.tar.zst"
    return 0
  else
    return 1
  fi
}

# Main loop
for name in $(grep -v '^[[:space:]]*#' "$PACKAGES_FILE"); do
  [ -z "$name" ] && continue
  if process_package "$name"; then
    SUCCESS_LIST+=("$name")
  else
    err "Failed to process $name"
    FAILED_LIST+=("$name")
  fi
done

say "Ensuring mesa-current symlink..."
if [ -f "$DEST_DIR/mesa.pkg.tar.zst" ]; then
  (cd "$DEST_DIR" && ln -sf "mesa.pkg.tar.zst" "mesa-current.pkg.tar.zst")
fi

# Final Report
say ""
say "-------------------------------------------"
say "Download Process Summary:"
[ ${#SUCCESS_LIST[@]} -gt 0 ] && say "$(g SUCCESS:) ${SUCCESS_LIST[*]}"
[ ${#FAILED_LIST[@]} -gt 0 ] && say "$(r FAILED:)  ${FAILED_LIST[*]}"
say "-------------------------------------------"

[ ${#FAILED_LIST[@]} -eq 0 ]
