#!/usr/bin/env bash
#
# onx-exim-queue-status — Exim queue durumu (Postqueue paritesinin Exim karşılığı)
#
# Exim queue komutları:
#   exim -bpc                        → toplam mesaj sayısı (sadece count)
#   exim -bp                         → her mesajın bekleyen detayı (id, yaş, sender)
#   exim -bpr | grep -c "<frozen>"   → donmuş mesaj sayısı
#
# Output (stdout JSON):
#   {"ok":true,"count":N,"oldest_seconds":N|null,"frozen":N}
#
# EximAdapter::queueStatus() bunu okur — Postfix postqueue-status'un birebir
# muadili (count + oldest_seconds + frozen üçlüsü panel UI'ya birebir uyar).

set -uo pipefail
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
source "${SCRIPT_DIR}/_lib/common.sh"

require_root

# Exim binary location auto-detect (RHEL: /usr/sbin/exim, Debian: /usr/sbin/exim4)
EXIM_BIN=""
for bin in /usr/sbin/exim /usr/sbin/exim4; do
    if [[ -x "$bin" ]]; then
        EXIM_BIN="$bin"
        break
    fi
done

# Exim kurulu değilse boş queue dön (Postfix gibi davran — UI crash etmesin)
if [[ -z "$EXIM_BIN" ]]; then
    onx_json_out ok true count 0 oldest_seconds null frozen 0 \
        message "Exim kurulu değil — boş queue raporlandı"
    exit 0
fi

# Count
count=$("$EXIM_BIN" -bpc 2>/dev/null | tr -d ' \n' || echo 0)
[[ -z "$count" || ! "$count" =~ ^[0-9]+$ ]] && count=0

# Frozen mesaj sayısı (exim -bp output'unda *** frozen *** ibaresi geçer)
frozen=0
oldest_seconds_val="null"

if [[ "$count" -gt 0 ]]; then
    # bp output: "10h 5K  1abc-xyz-abc <sender@host> *** frozen ***"
    bp_output=$("$EXIM_BIN" -bp 2>/dev/null || echo "")
    frozen=$(printf '%s\n' "$bp_output" | grep -c -i 'frozen' || echo 0)

    # Oldest age — ilk satırdaki yaş (örn. "23h" veya "5d") → saniyeye çevir
    # Format: "<yaş>  <boyut>  <id>"
    first_age=$(printf '%s\n' "$bp_output" | awk 'NR==1{print $1}' || echo "")
    if [[ -n "$first_age" ]]; then
        # Yaş parse: 23h, 5d, 30m, 10s, 1d2h, vs.
        num=$(echo "$first_age" | grep -oE '^[0-9]+' || echo 0)
        unit=$(echo "$first_age" | grep -oE '[a-zA-Z]+$' || echo "")
        case "$unit" in
            s) oldest_seconds_val=$((num)) ;;
            m) oldest_seconds_val=$((num * 60)) ;;
            h) oldest_seconds_val=$((num * 3600)) ;;
            d) oldest_seconds_val=$((num * 86400)) ;;
            *) oldest_seconds_val="null" ;;
        esac
    fi
fi

# JSON output — null literal int 0 ile karışmasın diye conditional
if [[ "$oldest_seconds_val" == "null" ]]; then
    onx_json_out ok true count "$count" oldest_seconds null frozen "$frozen"
else
    onx_json_out ok true count "$count" oldest_seconds "$oldest_seconds_val" frozen "$frozen"
fi
