#!/bin/bash

# omarchy:summary=Build and install an Omarchy package from a local checkout
# omarchy:group=dev
# omarchy:args=[package-name] [path-to-checkout]
# omarchy:examples=omarchy dev pkg-test | omarchy dev pkg-test omarchy-dev ~/Work/omarchy/omarchy-installer

set -euo pipefail

if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
  cat <<USAGE
Usage: omarchy dev pkg-test [package-name] [path-to-checkout]

Builds and installs an Omarchy package from a local Omarchy source
checkout. Use when changes need to land at fixed system paths (/etc/,
/usr/lib/systemd/, udev rule bodies, plymouth) that omarchy-dev-link
can't shadow.

Defaults:
  packages          omarchy-settings-dev omarchy-dev
  path-to-checkout  ~/Work/omarchy/omarchy-installer

Examples:
  omarchy dev pkg-test
  omarchy dev pkg-test omarchy-settings-dev
  omarchy dev pkg-test omarchy-dev ~/Work/omarchy/omarchy-installer

The pkgver of the built package is tagged 'dev.<short-sha>[.dirty]' so
'pacman -Q' makes it obvious where the installed version came from.

PKGBUILDs are read from \${OMARCHY_PKGBUILDS_DIR:-~/Work/omarchy/omarchy-pkgs/pkgbuilds}/<package-name>/.
USAGE
  exit 0
fi

remove_pkgver_function() {
  local pkgbuild="$1"
  local tmp="$pkgbuild.tmp"

  awk '
    /^pkgver\(\)[[:space:]]*\{/ {
      in_pkgver = 1
      depth = 0
    }
    in_pkgver {
      line = $0
      opens = gsub(/\{/, "{", line)
      line = $0
      closes = gsub(/\}/, "}", line)
      depth += opens - closes
      if (depth <= 0) {
        in_pkgver = 0
      }
      next
    }
    { print }
  ' "$pkgbuild" >"$tmp"
  mv "$tmp" "$pkgbuild"
}

dev_package_name() {
  local pkg="$1"

  case "$pkg" in
    omarchy | omarchy-settings)
      printf '%s-dev\n' "$pkg"
      ;;
    *)
      printf '%s\n' "$pkg"
      ;;
  esac
}

if (( $# == 0 )); then
  PKGS=(omarchy-settings-dev omarchy-dev)
  CHECKOUT="$HOME/Work/omarchy/omarchy-installer"
  MAKEPKG_ARGS=()
else
  PKGS=("$(dev_package_name "$1")")
  CHECKOUT="${2:-$HOME/Work/omarchy/omarchy-installer}"
  MAKEPKG_ARGS=("${@:3}")
fi
PKGBUILDS_ROOT="${OMARCHY_PKGBUILDS_DIR:-$HOME/Work/omarchy/omarchy-pkgs/pkgbuilds}"

if [[ ! -d "$CHECKOUT" ]]; then
  echo "Error: checkout not found at $CHECKOUT" >&2
  exit 1
fi
for PKG in "${PKGS[@]}"; do
  PKGBUILD_DIR="$PKGBUILDS_ROOT/$PKG"
  if [[ ! -f "$PKGBUILD_DIR/PKGBUILD" ]]; then
    echo "Error: PKGBUILD not found at $PKGBUILD_DIR/PKGBUILD" >&2
    echo "       Pass a different package name as arg 1, or set OMARCHY_PKGBUILDS_DIR." >&2
    exit 1
  fi
done

build_dir=$(mktemp -d -t omarchy-dev-pkg-test.XXXXXX)
trap 'rm -rf "$build_dir"' EXIT

# pkgver=dev.<sha>[.dirty] so pacman -Q makes the source obvious.
short_sha=$(git -C "$CHECKOUT" rev-parse --short HEAD 2>/dev/null || echo "local")
dirty=""
if [[ -d "$CHECKOUT/.git" ]] && [[ -n "$(git -C "$CHECKOUT" status --porcelain)" ]]; then
  dirty=".dirty"
fi
new_pkgver="dev.${short_sha}${dirty}"

for PKG in "${PKGS[@]}"; do
  PKGBUILD_DIR="$PKGBUILDS_ROOT/$PKG"
  package_build_dir="$build_dir/$PKG"
  mkdir -p "$package_build_dir"
  cp -a "$PKGBUILD_DIR/." "$package_build_dir/"

  remove_pkgver_function "$package_build_dir/PKGBUILD"
  sed -i "s/^pkgver=.*/pkgver=${new_pkgver}/" "$package_build_dir/PKGBUILD"

  echo "Building $PKG ${new_pkgver} from $CHECKOUT"
  echo "  build dir: $package_build_dir"
  echo "  PKGBUILD : $PKGBUILD_DIR/PKGBUILD"
  echo

  (
    cd "$package_build_dir"
    OMARCHY_SRC="$CHECKOUT" makepkg -s --skipchecksums --noconfirm "${MAKEPKG_ARGS[@]}"
  )

  # Install separately so we can pass --overwrite='*' (makepkg -i can't).
  # Dev builds frequently conflict with files left behind by previous
  # script-installed Omarchy versions; the build is the authoritative state.
  built_pkg=$(ls -t "$package_build_dir"/*.pkg.tar.* 2>/dev/null | grep -v '\.sig$' | head -1)
  if [[ -z $built_pkg ]]; then
    echo "Error: no built package found in $package_build_dir" >&2
    exit 1
  fi
  sudo pacman -U --noconfirm --overwrite='*' "$built_pkg"
done
