#!/usr/bin/env bash
# onx-rspamd-learn-message — Tek bir mail mesajını rspamc'a Bayes öğretmek için ver.
#
# Mevcut onx-rspamd-learn /var/spool'dan toplu okuyor (toplu eğitim).
# Bu script kullanıcının elinden file upload ile gelen TEK bir EML'yi öğretir.
#
# stdin: {"mode":"spam|ham", "message":"<RFC822 full content>"}
# stdout: {"mode":"...","learned":true,"score_before":N,"score_after":null,"output":"..."}

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

require_root
require_cmd rspamc

onx_json_input

MODE=$(onx_json_field "mode" "spam")
MSG=$(echo "$INPUT" | jq -r '.message // empty')

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

if [[ -z "$MSG" ]]; then
    onx_die 1 "message alanı boş"
fi

MSG_LEN=${#MSG}
if [[ "$MSG_LEN" -gt 5242880 ]]; then
    onx_die 1 "Mesaj çok büyük: ${MSG_LEN} bayt (max 5 MB)"
fi

TMP_EML=$(mktemp -t onx-rspamd-learn.XXXXXX.eml)
chmod 600 "$TMP_EML"
trap '[[ -n "${TMP_EML:-}" ]] && rm -f "$TMP_EML" 2>/dev/null || true' EXIT

# Header eksikse minimal stub ekle
if ! echo "$MSG" | head -20 | grep -qiE '^(from|to|subject):'; then
    {
        printf 'From: train@localhost\n'
        printf 'To: postmaster@localhost\n'
        printf 'Subject: Onoxsoft Bayes Train Sample\n'
        printf 'Date: %s\n' "$(date -R)"
        printf '\n'
        printf '%s\n' "$MSG"
    } > "$TMP_EML"
else
    printf '%s\n' "$MSG" > "$TMP_EML"
fi

# Önce skoru çıkar (öğretim öncesi referans)
SCORE_BEFORE="null"
if SC_OUT=$(rspamc --json symbols < "$TMP_EML" 2>/dev/null); then
    SCORE_BEFORE=$(echo "$SC_OUT" | jq -c 'if type=="array" then .[0] else . end | .score // 0' 2>/dev/null || echo 0)
fi

# Bayes öğret
if [[ "$MODE" == "spam" ]]; then
    LEARN_CMD="learn_spam"
else
    LEARN_CMD="learn_ham"
fi

LEARN_OUT=""
if ! LEARN_OUT=$(rspamc "$LEARN_CMD" < "$TMP_EML" 2>&1); then
    # rspamc bazen "already learned" durumlarında exit code !=0 verir; sessiz geç
    if echo "$LEARN_OUT" | grep -qiE "already|learned"; then
        :
    else
        onx_die 3 "rspamc ${LEARN_CMD} başarısız: ${LEARN_OUT}"
    fi
fi

onx_audit "rspamd-learn-message" "mode=${MODE} bytes=${MSG_LEN}"

jq -n \
    --arg mode "$MODE" \
    --argjson sb "$SCORE_BEFORE" \
    --arg out "$LEARN_OUT" \
    '{
        mode: $mode,
        learned: true,
        score_before: $sb,
        score_after: null,
        output: ($out | sub("\\n+$"; ""))
    }'
