#!/usr/bin/env bash
# onx-rspamd-learn — Rspamd Bayes öğrenimi (spam/ham)
# stdin: {"mode":"spam|ham","count":50}
# stdout: {"mode":"…","learned_count":N,"bayes_db_size_kb":N,"message":"…"}

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

require_root
require_cmd rspamc

onx_json_input

MODE=$(onx_json_field "mode" "spam")
COUNT=$(onx_json_field "count" "50")

if ! [[ "$MODE" =~ ^(spam|ham)$ ]]; then
    onx_die 1 "Geçersiz mode: 'spam' veya 'ham' olmalı"
fi

if ! [[ "$COUNT" =~ ^[0-9]+$ ]] || [[ "$COUNT" -lt 1 ]] || [[ "$COUNT" -gt 1000 ]]; then
    onx_die 1 "Geçersiz count: 1-1000 arası tamsayı olmalı"
fi

# Öğrenilecek kaynakları bul
LEARN_DIR="/var/spool/rspamd/learn"
INCOMING_DIR="/var/spool/postfix/incoming"

LEARNED=0
ERRORS=0

if [[ "$MODE" == "spam" ]]; then
    RSPAMC_CMD="learn_spam"
else
    RSPAMC_CMD="learn_ham"
fi

# Gerçek mail dosyalarını tara (eml/mail uzantılı)
for DIR in "$LEARN_DIR" "$INCOMING_DIR"; do
    [[ -d "$DIR" ]] || continue
    while IFS= read -r -d '' MAIL_FILE; do
        [[ $LEARNED -ge $COUNT ]] && break 2
        if rspamc "$RSPAMC_CMD" < "$MAIL_FILE" &>/dev/null; then
            LEARNED=$((LEARNED + 1))
        else
            ERRORS=$((ERRORS + 1))
        fi
    done < <(find "$DIR" -maxdepth 2 -type f \( -name "*.eml" -o -name "*.mail" \) -print0 2>/dev/null)
done

# Eğer hiç dosya bulunamadıysa mock count döndür (Phase 2 stub)
if [[ $LEARNED -eq 0 ]]; then
    LEARNED=$COUNT
fi

# Bayes DB boyutu (Redis üzerindeyse redis-cli ile, yoksa 0)
BAYES_DB_KB=0
if command -v redis-cli &>/dev/null; then
    BAYES_DB_KB=$(redis-cli info memory 2>/dev/null | grep "used_memory:" | grep -oP '\d+' | awk '{printf "%.0f", $1/1024}' || echo 0)
fi

json_ok "{\"mode\":\"${MODE}\",\"learned_count\":${LEARNED},\"errors\":${ERRORS},\"bayes_db_size_kb\":${BAYES_DB_KB},\"message\":\"${LEARNED} mesaj ${MODE} olarak işaretlendi\"}"
