#!/usr/bin/env bash
# onx-dovecot-conf-write — Dovecot conf.d/ dosyalarını DB ayarlarından yazar.
# stdin: {"settings":[{"key":"mail_location","value":"maildir:/var/vmail/%d/%n/Maildir"},…]}
# stdout: {"files_written":[…],"checked":true}

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

require_root
require_cmd doveconf

onx_json_input

SETTINGS_LEN=$(echo "$INPUT" | jq '.settings | length' 2>/dev/null || echo 0)
if [[ "$SETTINGS_LEN" -lt 1 ]]; then
    onx_die 1 "Geçersiz girdi: 'settings' dizisi boş veya eksik"
fi

CONF_DIR="/etc/dovecot/conf.d"
mkdir -p "$CONF_DIR"

# Anahtar → dosya eşleşme tablosu
declare -A KEY_FILE_MAP=(
    # 10-mail.conf
    [mail_location]="10-mail"
    [mail_uid]="10-mail"
    [mail_gid]="10-mail"
    [first_valid_uid]="10-mail"
    [mailbox_format]="10-mail"
    # 10-auth.conf
    [auth_mechanisms]="10-auth"
    [disable_plaintext_auth]="10-auth"
    [passdb_driver]="10-auth"
    [userdb_driver]="10-auth"
    [auth_username_format]="10-auth"
    # 10-master.conf
    [lmtp_save_to_detail_mailbox]="10-master"
    [lmtp_user_concurrency_limit]="10-master"
    # 10-ssl.conf
    [ssl]="10-ssl"
    [ssl_cert]="10-ssl"
    [ssl_key]="10-ssl"
    [ssl_min_protocol]="10-ssl"
    [ssl_cipher_list]="10-ssl"
    # 10-logging.conf
    [log_path]="10-logging"
    [mail_debug]="10-logging"
    [auth_verbose]="10-logging"
    [auth_debug]="10-logging"
    # 15-mailboxes.conf
    [imap_idle_notify_interval]="15-mailboxes"
    [imap_max_line_length]="15-mailboxes"
    [imap_logout_format]="15-mailboxes"
    [pop3_uidl_format]="15-mailboxes"
    [pop3_lock_session]="15-mailboxes"
    # 20-protocols.conf
    [protocols]="20-protocols"
    # 90-quota.conf
    [quota_plugin]="90-quota"
    [quota_rule]="90-quota"
    [quota_rule_default]="90-quota"
    [quota_warning]="90-quota"
    # 90-sieve.conf
    [sieve]="90-sieve"
    [sieve_dir]="90-sieve"
    [sieve_default]="90-sieve"
    [sieve_max_script_size]="90-sieve"
    [sieve_max_actions]="90-sieve"
)

declare -A FILE_CONTENTS  # section → içerik

# Her setting'i ilgili dosyaya ata
while IFS= read -r setting; do
    KEY=$(echo "$setting" | jq -r '.key')
    VALUE=$(echo "$setting" | jq -r '.value')

    SECTION="${KEY_FILE_MAP[$KEY]:-}"
    if [[ -z "$SECTION" ]]; then
        # Bilinmeyen key → onox-extra.conf'a yaz
        SECTION="onox-extra"
    fi

    FILE_CONTENTS[$SECTION]+="${KEY} = ${VALUE}"$'\n'
done < <(echo "$INPUT" | jq -c '.settings[]')

FILES_WRITTEN=()

# Her section için dosya yaz
for SECTION in "${!FILE_CONTENTS[@]}"; do
    OUTFILE="${CONF_DIR}/onox-${SECTION}.conf"
    TS=$(date -Iseconds)
    {
        echo "# ONOX-managed Dovecot config — ${SECTION}"
        echo "# Generated by onx-dovecot-conf-write — do not edit manually"
        echo "# Generated: ${TS}"
        echo ""
        echo "${FILE_CONTENTS[$SECTION]}"
    } > "$OUTFILE"
    FILES_WRITTEN+=("onox-${SECTION}.conf")
done

# Sözdizimi kontrolü
if ! doveconf -n >/dev/null 2>&1; then
    # Geri al
    for SECTION in "${!FILE_CONTENTS[@]}"; do
        rm -f "${CONF_DIR}/onox-${SECTION}.conf"
    done
    onx_die 3 "doveconf -n başarısız — yazılan dosyalar geri alındı"
fi

# JSON array üret
FILES_JSON=$(printf '%s\n' "${FILES_WRITTEN[@]}" | jq -R '.' | jq -s '.')

json_ok "{\"files_written\":${FILES_JSON},\"checked\":true,\"count\":${#FILES_WRITTEN[@]}}"
