#!/bin/bash
# Check PKGBUILD versions against published repo versions
# Creates state files for edge and/or stable if any packages need building

set -e

BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")
source "$BUILD_ROOT/helpers/message-helpers.sh"
source "$BUILD_ROOT/helpers/paths.sh"
source "$BUILD_ROOT/helpers/package-metadata.sh"

STATE_DIR="${OMARCHY_STATE_DIR:-/root/.state}"
ARCH="${ARCH:-x86_64}"

mkdir -p "$STATE_DIR"

print_header "Package Version Check"

get_repo_version() {
  local pkg="$1"
  local mirror="$2"
  local repo_db="$BUILD_ROOT/pkgs.omarchy.org/$mirror/$ARCH/omarchy.db.tar.zst"

  if [[ -f "$repo_db" ]]; then
    local desc_file
    desc_file=$(tar -tf "$repo_db" 2>/dev/null | grep "^${pkg}-[0-9r].*/desc$" | head -1)
    if [[ -n "$desc_file" ]]; then
      tar -xOf "$repo_db" "$desc_file" 2>/dev/null | awk '/%VERSION%/{getline; print; exit}'
    fi
  fi
}

get_pkgbuild_version() {
  local pkgdir="$1"
  if [[ -f "$pkgdir/PKGBUILD" ]]; then
    (cd "$pkgdir" && bash -c 'source PKGBUILD 2>/dev/null; if [[ -n "$epoch" ]]; then echo "${epoch}:${pkgver}-${pkgrel}"; else echo "${pkgver}-${pkgrel}"; fi')
  fi
}

check_package() {
  local pkg="$1"
  local pkgdir="$2"
  local mirror="$3"

  local pkgbuild_version repo_version
  pkgbuild_version=$(get_pkgbuild_version "$pkgdir")
  repo_version=$(get_repo_version "$pkg" "$mirror")

  if [[ -z "$pkgbuild_version" ]]; then
    return 1
  fi

  if [[ "$pkgbuild_version" != "$repo_version" ]]; then
    return 0
  fi

  return 1
}

check_mirror() {
  local mirror="$1"
  local state_file="$STATE_DIR/.sync-needed-$mirror"
  local needs_build=false
  local packages=()

  print_info "Checking $mirror packages..."

  while IFS= read -r pkg; do
    local pkgdir="$PKGBUILDS_DIR/$pkg"
    if check_package "$pkg" "$pkgdir" "$mirror"; then
      needs_build=true
      packages+=("$pkg")
    fi
  done < <(packages_for_mirror "$mirror")

  echo ""

  if [[ "$needs_build" == true ]]; then
    touch "$state_file"
    print_success "${mirror^} needs building (${#packages[@]} packages)"
    print_info "Packages: ${packages[*]}"
    print_info "State file created: $state_file"
  else
    print_info "${mirror^} is up to date"
  fi

  echo ""
}

check_mirror edge
check_mirror stable

print_success "Version check complete!"
