#!/usr/bin/env bash
# =============================================================================
# onx-check-updates — Mevcut sistem güncellemelerini sorgula (read-only).
#
# `dnf upgrade --assumeno --nobest` resolved transaction'ını parse eder → paket
# başına TEK satır + GERÇEK indirme boyutu.
#
# (Eski sürüm `dnf check-update` kullanıyordu; o çıktının "Obsoleting Packages"
# bölümünü de listeliyordu → kurulu SON sürümü obsolete eden eski repo sürümleri
# "bekliyor" gibi görünüyordu — örn. lsphp82-mysqlnd 7 kez — ve boyut hep 0'dı.
# --assumeno transaction'ı SADECE gerçekten kurulacak/yükseltilecek paketleri
# verir; --nobest çözülemeyen çakışmaları atlar.)
#
# Input (stdin JSON): {} (argüman yok)
# Output (stdout JSON):
#   {count, packages:[{name,current,available,size_kb}], reboot_required, checked_at}
# Exit: 0=ok 2=jq-yok 3=dnf-çözümleme-hatası
# =============================================================================
set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
# shellcheck source=/dev/null
[[ -f "${SCRIPT_DIR}/_lib/common.sh" ]] && source "${SCRIPT_DIR}/_lib/common.sh"

command -v jq >/dev/null 2>&1 || { printf '{"error":"jq required"}\n' >&2; exit 2; }

# stdin'i tüket (içeriği yok say; çağıranın pipe'ı kırılmasın)
cat >/dev/null 2>&1 || true

TMPOUT=$(mktemp /tmp/onx-check-updates-XXXXXX.log)
trap 'rm -f "$TMPOUT"' EXIT

# --assumeno: upgrade VARSA exit 1 ("Operation aborted"), YOKSA exit 0 — ikisi de normal.
dnf upgrade --assumeno --nobest --refresh > "$TMPOUT" 2>&1 || true

# Gerçek çözümleme hatası (hiç transaction üretilmediyse) → bildir.
if grep -qiE '^Error:' "$TMPOUT" && ! grep -qE '^(Upgrading|Installing|Transaction Summary)' "$TMPOUT"; then
  TAIL=$(grep -iE 'error|problem|cannot' "$TMPOUT" | head -4 | tr '\n' ' ' | sed 's/"/\\"/g')
  printf '{"error":"dnf cozumleme hatasi: %s","code":3}\n' "$TAIL" >&2
  exit 3
fi

# ── Transaction table parse: Installing/Upgrading/(weak)dependencies bölümleri ──
# Satır biçimi: " <name>  <arch>  <version>  <repo>  <size> <unit>"
# "Skipping packages with conflicts" bölümü (—nobest atlananları) DAHİL EDİLMEZ.
PACKAGES_JSON=$(awk '
  function tokb(n,u){ u=tolower(u); if(u=="m")return int(n*1024+0.5); if(u=="g")return int(n*1048576+0.5); return int(n+0.5) }
  /^(Installing|Upgrading|Downgrading|Reinstalling)/ { sec=1; next }   # paket bölümü başlığı
  /^Skipping/                                        { sec=0; next }   # atlanan çakışmalar → hariç
  /^Transaction Summary/                             { sec=0; next }
  /^[^[:space:]]/                                    { sec=0; next }   # diğer sütun-0 satır bölümü kapatır
  (sec==1 && NF>=6) {
    name=$1; ver=$3; szkb=tokb($5,$6)
    gsub(/[\\"]/,"",name); gsub(/[\\"]/,"",ver)
    rows[++n]=sprintf("{\"name\":\"%s\",\"current\":\"\",\"available\":\"%s\",\"size_kb\":%d}", name, ver, szkb)
  }
  END{ printf "["; for(i=1;i<=n;i++) printf "%s%s",(i>1?",":""),rows[i]; printf "]" }
' "$TMPOUT")

echo "$PACKAGES_JSON" | jq -e . >/dev/null 2>&1 || PACKAGES_JSON="[]"
COUNT=$(echo "$PACKAGES_JSON" | jq 'length' 2>/dev/null || echo 0)

# ── Reboot gerekli mi? ───────────────────────────────────────────────────────
REBOOT_REQUIRED=false
if [[ -f /run/reboot-required || -f /var/run/reboot-required ]]; then
  REBOOT_REQUIRED=true
fi
# needs-restarting -r: rc!=0 → reboot gerekli (yeni kernel kurulu ama boot edilmemiş dahil)
if command -v needs-restarting >/dev/null 2>&1; then
  needs-restarting -r >/dev/null 2>&1 || REBOOT_REQUIRED=true
fi
# EN GÜVENİLİR sinyal: çalışan kernel kurulu en yeni kernel-core'dan eskiyse reboot gerekli.
if [[ "$REBOOT_REQUIRED" == "false" ]]; then
  RUNNING_KERNEL="$(uname -r 2>/dev/null)" || RUNNING_KERNEL=""
  LATEST_KERNEL="$(rpm -q --qf '%{VERSION}-%{RELEASE}.%{ARCH}\n' kernel-core 2>/dev/null | sort -V | tail -1)" || LATEST_KERNEL=""
  if [[ -n "$RUNNING_KERNEL" && -n "$LATEST_KERNEL" && "$RUNNING_KERNEL" != "$LATEST_KERNEL" ]]; then
    REBOOT_REQUIRED=true
  fi
fi
# Fallback: bekleyen listede kernel/glibc/systemd varsa
if [[ "$REBOOT_REQUIRED" == "false" ]]; then
  if echo "$PACKAGES_JSON" | jq -e '[.[]|select(.name|test("^(kernel|glibc|systemd|dbus)"))]|length>0' >/dev/null 2>&1; then
    REBOOT_REQUIRED=true
  fi
fi

# ── JSON çıktı ───────────────────────────────────────────────────────────────
CHECKED_AT=$(date -u +"%Y-%m-%dT%H:%M:%S+00:00")
jq -n \
  --argjson count "$COUNT" \
  --argjson packages "$PACKAGES_JSON" \
  --argjson reboot "$REBOOT_REQUIRED" \
  --arg checked_at "$CHECKED_AT" \
  '{count: $count, packages: $packages, reboot_required: $reboot, checked_at: $checked_at}'

exit 0
