#!/usr/bin/env bash
#
# onx-dovecot-status — Dovecot canlı status + istatistik (v83)
#
# Output:
#   {
#     "ok": true,
#     "service": "active|inactive|unknown",
#     "version": "2.3.16",
#     "uptime": "2026-05-24 09:00:00",
#     "connected_users_imap": 5,
#     "connected_users_pop3": 1,
#     "total_mailboxes": 42,
#     "total_disk_usage_mb": 1024,
#     "protocols": "imap pop3 lmtp sieve",
#     "ports": {"110": true, "143": true, "993": true, "995": true, "4190": true, "24": true}
#   }
#
# Exit codes: 0 (her zaman — sysapi pattern)

set -euo pipefail

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

SERVICE="unknown"
if command -v systemctl >/dev/null 2>&1; then
    if systemctl is-active --quiet dovecot 2>/dev/null; then
        SERVICE="active"
    else
        SERVICE="inactive"
    fi
fi

VERSION="—"
if command -v dovecot >/dev/null 2>&1; then
    VERSION=$(dovecot --version 2>/dev/null | head -1 || echo "—")
fi

UPTIME="—"
if command -v systemctl >/dev/null 2>&1; then
    UPTIME=$(systemctl show dovecot -p ActiveEnterTimestamp --value 2>/dev/null || echo "—")
fi

PROTOCOLS="—"
if [[ -f /etc/dovecot/dovecot.conf ]]; then
    PROTOCOLS=$(grep -E '^[[:space:]]*protocols[[:space:]]*=' /etc/dovecot/dovecot.conf 2>/dev/null | tail -1 | sed -E 's/^[[:space:]]*protocols[[:space:]]*=[[:space:]]*//' || echo "—")
fi

# Connected users (doveadm who parse)
IMAP_USERS=0
POP3_USERS=0
if command -v doveadm >/dev/null 2>&1 && [[ "$SERVICE" == "active" ]]; then
    WHO_OUTPUT=$(doveadm who 2>/dev/null || echo "")
    while IFS= read -r line; do
        [[ -z "$line" ]] && continue
        [[ "$line" =~ ^username ]] && continue
        PROTO=$(echo "$line" | awk '{print $3}')
        case "$PROTO" in
            imap) IMAP_USERS=$((IMAP_USERS + 1)) ;;
            pop3) POP3_USERS=$((POP3_USERS + 1)) ;;
        esac
    done <<< "$WHO_OUTPUT"
fi

# Total mailboxes — onx_<user> üzerinden tahmini sayım
TOTAL_MAILBOXES=0
TOTAL_DISK_MB=0
if [[ -d /var/vmail ]]; then
    TOTAL_MAILBOXES=$(find /var/vmail -mindepth 2 -maxdepth 2 -type d 2>/dev/null | wc -l)
    if command -v du >/dev/null 2>&1; then
        TOTAL_DISK_MB=$(du -sm /var/vmail 2>/dev/null | awk '{print $1}' || echo 0)
    fi
fi

# Port binding check — nc -zv localhost
check_port() {
    local port="$1"
    if command -v nc >/dev/null 2>&1; then
        nc -zv 127.0.0.1 "$port" >/dev/null 2>&1 && echo "true" || echo "false"
    elif command -v ss >/dev/null 2>&1; then
        ss -tlnH "( sport = :${port} )" 2>/dev/null | grep -q . && echo "true" || echo "false"
    else
        echo "false"
    fi
}

P110=$(check_port 110)
P143=$(check_port 143)
P993=$(check_port 993)
P995=$(check_port 995)
P4190=$(check_port 4190)
P24=$(check_port 24)

jq -nc \
    --arg svc "$SERVICE" \
    --arg ver "$VERSION" \
    --arg upt "$UPTIME" \
    --arg proto "$PROTOCOLS" \
    --argjson imap "$IMAP_USERS" \
    --argjson pop3 "$POP3_USERS" \
    --argjson mboxes "$TOTAL_MAILBOXES" \
    --argjson disk "$TOTAL_DISK_MB" \
    --argjson p110 "$P110" \
    --argjson p143 "$P143" \
    --argjson p993 "$P993" \
    --argjson p995 "$P995" \
    --argjson p4190 "$P4190" \
    --argjson p24 "$P24" \
    '{
        ok: true,
        service: $svc,
        version: $ver,
        uptime: $upt,
        protocols: $proto,
        connected_users_imap: $imap,
        connected_users_pop3: $pop3,
        total_mailboxes: $mboxes,
        total_disk_usage_mb: $disk,
        ports: {
            "110": $p110, "143": $p143, "993": $p993, "995": $p995,
            "4190": $p4190, "24": $p24
        }
    }'

exit 0
