#!/usr/bin/env bash
#
# onx-exim-queue-list — exim -bp ciktisini JSON listeye cevir
#
# Postfix muadili: onx-postqueue-status (queue array donen)
#
# exim -bp ciktisi (asagidaki gibi):
#   23h  1.2K  1abc23-Def456-78 <sender@host.tr>
#           recipient@target.com
#           recipient2@target.com
#
#   *** frozen ***
#   5d   850   2xyz45-Ghi789-AB <bounce@host.tr>
#           bouncerecip@destination.com
#
# Cikti JSON:
#   {
#     "ok": true,
#     "count": 12,
#     "entries": [
#       {
#         "message_id": "1abc23-Def456-78",
#         "age": "23h",
#         "age_seconds": 82800,
#         "size_bytes": 1228,
#         "sender": "sender@host.tr",
#         "recipients": ["recipient@target.com", "recipient2@target.com"],
#         "frozen": false
#       },
#       ...
#     ]
#   }

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

require_root

INPUT=$(cat 2>/dev/null || echo '{}')

# Exim binary auto-detect
EXIM_BIN=""
for bin in /usr/sbin/exim /usr/sbin/exim4; do
    [[ -x "$bin" ]] && { EXIM_BIN="$bin"; break; }
done

if [[ -z "$EXIM_BIN" ]]; then
    echo "{\"ok\":true,\"count\":0,\"entries\":[],\"message\":\"Exim kurulu degil — bos liste\"}"
    exit 0
fi

# Limit (default 200 mesaj — UI tarafinda pagination olmadigi icin guvenli ust sinir)
LIMIT=$(echo "$INPUT" | jq -r '.limit // 200' 2>/dev/null || echo 200)
[[ ! "$LIMIT" =~ ^[0-9]+$ ]] && LIMIT=200
[[ "$LIMIT" -gt 1000 ]] && LIMIT=1000

# exim -bp ciktisini cek
RAW=$("$EXIM_BIN" -bp 2>/dev/null || echo "")

if [[ -z "$RAW" ]]; then
    echo "{\"ok\":true,\"count\":0,\"entries\":[]}"
    exit 0
fi

# awk parser — Exim queue formatini JSON'a cevir
ENTRIES_JSON=$(printf '%s\n' "$RAW" | awk -v LIMIT="$LIMIT" '
    function jsonesc(s,    r) {
        r = s
        gsub(/\\/, "\\\\", r)
        gsub(/"/,  "\\\"", r)
        gsub(/\n/, "\\n",  r)
        gsub(/\r/, "",     r)
        gsub(/\t/, " ",    r)
        return r
    }
    function size_to_bytes(s,    n, u) {
        n = s + 0
        u = s
        gsub(/^[0-9.]+/, "", u)
        if (u == "K" || u == "k") return int(n * 1024)
        if (u == "M" || u == "m") return int(n * 1024 * 1024)
        if (u == "G" || u == "g") return int(n * 1024 * 1024 * 1024)
        return int(n)
    }
    function age_to_seconds(a,    n, u) {
        n = a + 0
        u = a
        gsub(/^[0-9]+/, "", u)
        if (u == "s") return n
        if (u == "m") return n * 60
        if (u == "h") return n * 3600
        if (u == "d") return n * 86400
        if (u == "w") return n * 604800
        return n
    }
    function flush(   rec, i, recip_json) {
        if (mid == "") return
        if (entry_count >= LIMIT) return
        recip_json = ""
        for (i = 0; i < recip_n; i++) {
            if (i > 0) recip_json = recip_json ","
            recip_json = recip_json "\"" jsonesc(recipients[i]) "\""
        }
        rec = "{"
        rec = rec "\"message_id\":\"" jsonesc(mid) "\","
        rec = rec "\"age\":\"" jsonesc(age) "\","
        rec = rec "\"age_seconds\":" age_to_seconds(age) ","
        rec = rec "\"size_bytes\":" size_to_bytes(size) ","
        rec = rec "\"sender\":\"" jsonesc(sender) "\","
        rec = rec "\"recipients\":[" recip_json "],"
        rec = rec "\"frozen\":" (frozen ? "true" : "false")
        rec = rec "}"
        if (out != "") out = out ","
        out = out rec
        entry_count++
        reset()
    }
    function reset() {
        mid = ""; age = ""; size = ""; sender = ""
        delete recipients
        recip_n = 0
        frozen = 0
    }
    BEGIN { reset(); out = ""; entry_count = 0 }
    /^[[:space:]]*$/ { flush(); next }
    # Header satiri: "23h  1.2K  1abc23-Def456-78 <sender@host>" veya
    # frozen icin: "5d  850  2xyz45-Ghi789-AB <> *** frozen ***"
    # v92.3 fix: Exim 4.94+ extended message ID format (6-10-4 char).
    # v92.4 fix: POSIX-safe pattern (quantifier m..n bazi awk varyantlarinda yok)
    #            + frozen pattern inline edildi (onceki ayri frozen pattern next ile
    #            header satirini atliyor, frozen mail entries icine dusmuyordu).
    /^[[:space:]]*[0-9]+[smhdw][[:space:]]+[0-9.]+[KMGB]?[[:space:]]+[A-Za-z0-9]+-[A-Za-z0-9]+-[A-Za-z0-9]+/ {
        flush()
        age = $1
        size = $2
        mid = $3
        # Sender 4. field, koseli parantez icinde gelir: <sender@host>
        # Frozen mail icin: <> (bos sender, bounce mesaji)
        sender = $4
        gsub(/^</, "", sender)
        gsub(/>$/, "", sender)
        # v92.4: Frozen flag inline (header satirinda *** frozen *** varsa)
        frozen = (index($0, "*** frozen ***") > 0) ? 1 : 0
        next
    }
    # Recipient satirlari (indent ile baslar)
    /^[[:space:]]+[^[:space:]]/ {
        line = $0
        sub(/^[[:space:]]+/, "", line)
        # Skip "*** frozen ***" satirlari (yukarida zaten yakaladik)
        if (line ~ /^\*\*\*/) next
        # Skip "D" prefix lines (delivered notice)
        if (line ~ /^D /) next
        recipients[recip_n] = line
        recip_n++
    }
    END {
        flush()
        printf "{\"count\":%d,\"entries\":[%s]}", entry_count, out
    }
')

# Final wrap
echo "$ENTRIES_JSON" | jq '. + {ok: true}'
exit 0
