#!/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"

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

# Ensure state directory exists
mkdir -p "$STATE_DIR"

print_header "Package Version Check"

# Get version from repo database
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=$(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 version from PKGBUILD
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 if package needs building for a mirror
check_package() {
  local pkg="$1"
  local pkgdir="$2"
  local mirror="$3"
  
  local pkgbuild_version=$(get_pkgbuild_version "$pkgdir")
  local repo_version=$(get_repo_version "$pkg" "$mirror")
  
  if [[ -z "$pkgbuild_version" ]]; then
    return 1  # Can't read version, skip
  fi
  
  if [[ "$pkgbuild_version" != "$repo_version" ]]; then
    return 0  # Needs building
  fi
  
  return 1  # Up to date
}

edge_needs_build=false
stable_needs_build=false
edge_packages=()
stable_packages=()

print_info "Checking edge packages..."

# Check edge/ packages -> only affects edge
for pkgdir in "$BUILD_ROOT/pkgbuilds/edge"/*/; do
  [[ ! -d "$pkgdir" ]] && continue
  pkg=$(basename "$pkgdir")
  [[ ! -f "$pkgdir/PKGBUILD" ]] && continue
  
  if check_package "$pkg" "$pkgdir" "edge"; then
    edge_needs_build=true
    edge_packages+=("$pkg")
  fi
done

print_info "Checking stable packages..."

# Check stable/ packages -> only affects stable
for pkgdir in "$BUILD_ROOT/pkgbuilds/stable"/*/; do
  [[ ! -d "$pkgdir" ]] && continue
  pkg=$(basename "$pkgdir")
  [[ ! -f "$pkgdir/PKGBUILD" ]] && continue
  
  if check_package "$pkg" "$pkgdir" "stable"; then
    stable_needs_build=true
    stable_packages+=("$pkg")
  fi
done

print_info "Checking shared packages..."

# Check shared/ packages -> affects BOTH edge and stable
for pkgdir in "$BUILD_ROOT/pkgbuilds/shared"/*/; do
  [[ ! -d "$pkgdir" ]] && continue
  pkg=$(basename "$pkgdir")
  [[ ! -f "$pkgdir/PKGBUILD" ]] && continue
  
  # Check against edge
  if check_package "$pkg" "$pkgdir" "edge"; then
    edge_needs_build=true
    edge_packages+=("$pkg")
  fi
  
  # Check against stable
  if check_package "$pkg" "$pkgdir" "stable"; then
    stable_needs_build=true
    stable_packages+=("$pkg")
  fi
done

echo ""

# Drop state files as needed
if [[ "$edge_needs_build" == true ]]; then
  touch "$STATE_DIR/.sync-needed-edge"
  print_success "Edge needs building (${#edge_packages[@]} packages)"
  print_info "Packages: ${edge_packages[*]}"
  print_info "State file created: $STATE_DIR/.sync-needed-edge"
else
  print_info "Edge is up to date"
fi

echo ""

if [[ "$stable_needs_build" == true ]]; then
  touch "$STATE_DIR/.sync-needed-stable"
  print_success "Stable needs building (${#stable_packages[@]} packages)"
  print_info "Packages: ${stable_packages[*]}"
  print_info "State file created: $STATE_DIR/.sync-needed-stable"
else
  print_info "Stable is up to date"
fi

echo ""
print_success "Version check complete!"
