#!/usr/bin/env bash
#
# onx-mailserver-status — Bir MTA driver'ın aktif durumu, version, queue boyutu.
#
# Input (stdin JSON):
#   {
#     "driver":  "postfix" | "exim",       # zorunlu
#     "service": "postfix" | "exim"        # ops (driver'dan türetilir)
#   }
#
# Output (stdout JSON):
#   {
#     "ok":             true,
#     "driver":         "postfix",
#     "service":        "postfix",
#     "running":        true,
#     "enabled":        true,
#     "uptime_seconds": 3742,
#     "version":        "3.5.8",
#     "queue":          { "count": 12, "oldest_seconds": 3600, "frozen": 0 },
#     "installed":      true
#   }
#
# Pattern: onx-webserver-status ile birebir aynı yaklaşım. Queue parsing
# postqueue (postfix) veya exim -bpc (exim) ile.

set -uo pipefail

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

# ─── Input parse ─────────────────────────────────────────────────────────────
INPUT="$(cat 2>/dev/null || echo '{}')"
onx_require_json "$INPUT"

driver="$(onx_json_get "$INPUT" driver)"
service="$(onx_json_get "$INPUT" service)"

[[ -z "$driver" ]] && onx_die 1 "driver required"

case "$driver" in
    postfix)
        [[ -z "$service" ]] && service="postfix"
        bin_check="/usr/sbin/postfix"
        ;;
    exim)
        [[ -z "$service" ]] && service="exim"
        bin_check="/usr/sbin/exim"
        ;;
    *)
        onx_die 1 "unknown driver '$driver' (postfix|exim)"
        ;;
esac

# ─── Installed (binary var mı?) ──────────────────────────────────────────────
installed="false"
if [[ -x "$bin_check" ]] || [[ -x "/usr/sbin/${driver}4" ]]; then
    installed="true"
fi

# ─── Running + enabled (systemd) ─────────────────────────────────────────────
running="false"
enabled="false"
uptime_seconds=0

if systemctl is-active --quiet "$service" 2>/dev/null; then
    running="true"
fi
if systemctl is-enabled --quiet "$service" 2>/dev/null; then
    enabled="true"
fi

if [[ "$running" == "true" ]]; then
    start_ts="$(systemctl show "$service" -p ActiveEnterTimestamp --value 2>/dev/null | head -1)"
    if [[ -n "$start_ts" && "$start_ts" != "n/a" ]]; then
        start_epoch=$(date -d "$start_ts" +%s 2>/dev/null || echo 0)
        now_epoch=$(date +%s)
        if (( start_epoch > 0 )); then
            uptime_seconds=$(( now_epoch - start_epoch ))
        fi
    fi
fi

# ─── Version detect ──────────────────────────────────────────────────────────
version="unknown"
if [[ "$installed" == "true" ]]; then
    case "$driver" in
        postfix)
            version="$(postconf -d mail_version 2>/dev/null | awk -F'= *' '{print $2}' | head -1)"
            ;;
        exim)
            version="$(exim -bV 2>/dev/null | head -1 | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?' | head -1)"
            ;;
    esac
    [[ -z "$version" ]] && version="unknown"
fi

# ─── Queue status ────────────────────────────────────────────────────────────
# count: bekleyen mail sayısı; oldest_seconds: en eski mail yaşı; frozen: dondurulanlar
queue_count=0
queue_oldest=0
queue_frozen=0

if [[ "$running" == "true" ]]; then
    case "$driver" in
        postfix)
            # mailq | grep -c '^[A-F0-9]' — header satırı dahil saymamak için tail
            if command -v postqueue >/dev/null 2>&1; then
                queue_count=$(postqueue -p 2>/dev/null | tail -n +2 | grep -cE '^[A-F0-9]+' || echo 0)
            fi
            # Oldest: mail_date in queue ID embedded — basit yaklaşım: deferred dir mtime
            if [[ -d /var/spool/postfix/deferred ]]; then
                oldest_file=$(find /var/spool/postfix/deferred -type f -printf '%T@\n' 2>/dev/null | sort -n | head -1)
                if [[ -n "$oldest_file" ]]; then
                    now_epoch=$(date +%s)
                    oldest_epoch=${oldest_file%.*}
                    queue_oldest=$(( now_epoch - oldest_epoch ))
                    [[ $queue_oldest -lt 0 ]] && queue_oldest=0
                fi
            fi
            # Postfix'te native "frozen" yok; ama hold queue eşdeğer
            if [[ -d /var/spool/postfix/hold ]]; then
                queue_frozen=$(find /var/spool/postfix/hold -type f 2>/dev/null | wc -l)
            fi
            ;;
        exim)
            # exim -bpc → kuyruktaki mail sayısı (tek satır int)
            if command -v exim >/dev/null 2>&1; then
                queue_count=$(exim -bpc 2>/dev/null | head -1 | grep -oE '^[0-9]+' || echo 0)
                # Frozen: "exim -bp" çıktısında "*** frozen ***" satırlarını say
                queue_frozen=$(exim -bp 2>/dev/null | grep -c '\*\*\* frozen \*\*\*' || echo 0)
            fi
            # Exim queue dir varsa oldest msg
            if [[ -d /var/spool/exim/input ]]; then
                oldest_file=$(find /var/spool/exim/input -type f -name '*-H' -printf '%T@\n' 2>/dev/null | sort -n | head -1)
                if [[ -n "$oldest_file" ]]; then
                    now_epoch=$(date +%s)
                    oldest_epoch=${oldest_file%.*}
                    queue_oldest=$(( now_epoch - oldest_epoch ))
                    [[ $queue_oldest -lt 0 ]] && queue_oldest=0
                fi
            fi
            ;;
    esac
fi

# Defensive — find/grep'ten gelen non-numeric değerleri normalize et
[[ "$queue_count"  =~ ^[0-9]+$ ]] || queue_count=0
[[ "$queue_oldest" =~ ^[0-9]+$ ]] || queue_oldest=0
[[ "$queue_frozen" =~ ^[0-9]+$ ]] || queue_frozen=0

# ─── Output ──────────────────────────────────────────────────────────────────
# Queue alt-objesi inline JSON ile build et (onx_json_out flat yapı destekler).
queue_json=$(printf '{"count":%d,"oldest_seconds":%d,"frozen":%d}' \
    "$queue_count" "$queue_oldest" "$queue_frozen")

# JSON birleştir — onx_json_out kullanmadan elle (nested object var)
jq -nc \
    --arg   driver  "$driver" \
    --arg   service "$service" \
    --arg   version "$version" \
    --argjson installed     "$installed" \
    --argjson running       "$running" \
    --argjson enabled       "$enabled" \
    --argjson uptime        "$uptime_seconds" \
    --argjson queue         "$queue_json" \
    '{ok:true, driver:$driver, service:$service, installed:$installed,
      running:$running, enabled:$enabled, uptime_seconds:$uptime,
      version:$version, queue:$queue}'
