#!/usr/bin/env bash
#
# onx-exim-dkim-sign-enable — Exim outbound DKIM signing aktive et
#
# v84.4: Postfix outbound mail Rspamd dkim_signing milter ile imzalanıyor,
# ama Exim'de native DKIM signing yapılandırılmamış → outbound mail DKIM'sız
# → Gmail/Yahoo deliverability düşük (eventually spam/reject).
#
# Exim native DKIM signing — remote_smtp transport'a şu ayarları ekler:
#   dkim_domain      = ${sender_address_domain}
#   dkim_selector    = default
#   dkim_private_key = /etc/onox/dkim/<domain>/default.private (if exists)
#   dkim_canon       = relaxed
#
# Key dosyaları onx-dkim-keygen tarafından `/etc/onox/dkim/<domain>/default.private`
# path'inde tutuluyor (Rspamd'a da kopyalanıyor /var/lib/rspamd/dkim/).
# Plus v84.2 listener yeni domain'de otomatik key generate ediyor.
#
# Eğer key dosyası yoksa Exim DKIM imzasız mail gönderir (strict=0, error yok).
#
# Idempotent — marker `# v84.4:` re-run safe.

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

require_root
require_cmd systemctl

EXIM_CONF="/etc/exim/exim.conf"
[[ -f "$EXIM_CONF" ]] || onx_die 2 "Exim config yok: $EXIM_CONF"

# Onx DKIM key dizini var mı?
DKIM_BASE="/etc/onox/dkim"
if [[ ! -d "$DKIM_BASE" ]]; then
    onx_log "DKIM key dizini yok — Exim config patch yapıldı ama key generate gerek (DkimBulkGenerator)"
fi

# ─── Idempotent guard ───────────────────────────────────────────────────────
if grep -q "^# v84.4: Outbound DKIM signing" "$EXIM_CONF"; then
    systemctl restart exim
    sleep 1
    onx_json_out \
        ok true \
        already_patched true \
        message "Exim DKIM signing zaten kuruluydu, Exim restart edildi"
    exit 0
fi

# Backup
cp -a "$EXIM_CONF" "${EXIM_CONF}.bak.v84.4.$(date +%s)"

# ─── remote_smtp transport'a DKIM signing ekle ──────────────────────────────
# Pattern: "remote_smtp:" satırından sonra "driver = smtp" altına DKIM directive'leri ekle
python3 <<'PYEOF'
import re

CONF = "/etc/exim/exim.conf"
with open(CONF) as f:
    text = f.read()

# DKIM signing block — Exim'in expansion variables ile dinamik per-sender domain
dkim_block = '''
    # v84.4: Outbound DKIM signing — Onoxsoft "default" selector
    # Key path: /etc/onox/dkim/<sender_domain>/default.private (onx-dkim-keygen
    # tarafından yazılır, MailDnsAutoFixer DKIM listener'ı otomatik tetikler).
    # Key yoksa imzalama atlanır (strict=0) — Exim normal mail gönderir.
    dkim_domain = ${sender_address_domain}
    dkim_selector = default
    dkim_private_key = ${if exists{/etc/onox/dkim/${dkim_domain}/${dkim_selector}.private}{/etc/onox/dkim/${dkim_domain}/${dkim_selector}.private}{}}
    dkim_canon = relaxed
    dkim_strict = 0'''

# remote_smtp transport block'unu bul, driver = smtp satırından sonra ekle
# Pattern: "remote_smtp:\n    driver = smtp" + sonrasındaki satırlar
pattern = re.compile(
    r'(remote_smtp:\s*\n\s*driver\s*=\s*smtp\s*\n)((?:\s+[a-z_]+\s*=.*\n)*)',
    re.MULTILINE
)

match = pattern.search(text)
if match:
    # Mevcut DKIM satırlarını sil (eğer varsa — idempotent)
    existing = match.group(2)
    cleaned = re.sub(r'^\s*dkim_(?:domain|selector|private_key|canon|strict)\s*=.*\n', '', existing, flags=re.MULTILINE)
    new_block = match.group(1) + cleaned.rstrip() + '\n' + dkim_block + '\n'
    new_text = text[:match.start()] + new_block + text[match.end():]
    with open(CONF, 'w') as f:
        f.write(new_text)
    print("OK: remote_smtp transport DKIM block updated")
else:
    print("ERROR: remote_smtp transport pattern not found in exim.conf")
    exit(1)
PYEOF

# Idempotent marker
if ! grep -q "^# v84.4:" "$EXIM_CONF"; then
    # En üste comment ekle (config'in başına)
    sed -i '1i\
# v84.4: Outbound DKIM signing enabled (remote_smtp transport)' "$EXIM_CONF"
fi

# ─── Syntax check ───────────────────────────────────────────────────────────
if ! exim -bV >/dev/null 2>&1; then
    LATEST_BAK=$(ls -t "${EXIM_CONF}".bak.v84.4.* 2>/dev/null | head -1)
    [[ -n "$LATEST_BAK" ]] && cp -f "$LATEST_BAK" "$EXIM_CONF"
    onx_die 3 "exim -bV syntax fail — rollback ($LATEST_BAK)"
fi

# ─── Restart Exim ───────────────────────────────────────────────────────────
systemctl restart exim
sleep 2

if ! systemctl is-active --quiet exim; then
    onx_die 3 "Exim restart sonrası inactive — journalctl -u exim"
fi

# ─── Verify ────────────────────────────────────────────────────────────────
# Test: exim -bP remote_smtp ile transport config'i göster (dkim_domain expansion)
DKIM_CONFIGURED="false"
if exim -bP transport remote_smtp 2>/dev/null | grep -q "dkim_domain"; then
    DKIM_CONFIGURED="true"
fi

# Mevcut key dosya sayısı (kaç domain'in DKIM'i hazır)
KEY_COUNT=0
if [[ -d "$DKIM_BASE" ]]; then
    KEY_COUNT=$(find "$DKIM_BASE" -name "default.private" 2>/dev/null | wc -l)
fi

onx_json_out \
    ok true \
    already_patched false \
    transport "remote_smtp" \
    dkim_selector "default" \
    dkim_canon "relaxed" \
    key_base_dir "$DKIM_BASE" \
    keys_available "$KEY_COUNT" \
    dkim_configured "$DKIM_CONFIGURED" \
    message "Exim outbound DKIM signing aktif. Yeni domain'lerde DkimAutoGenerate listener otomatik key üretir. Mevcut domain'ler için: artisan dkim:bulk-generate veya panel UI."
