#!/usr/bin/env bash
# onx-db-config-write — Panel'den yönetilen MariaDB ayarlarını /etc/my.cnf.d/onox.cnf'ye yaz.
#
# Akış:
#   1. STDIN'den ini text al (Panel zaten formatlamış halde — [mysqld] + key=value blokları)
#   2. /etc/my.cnf.d/onox.cnf'ye yaz (RHEL) veya /etc/mysql/mariadb.conf.d/99-onox.cnf (Debian)
#   3. mysqld --help --verbose --no-defaults ile syntax test (her satır parse ediliyor mu)
#   4. Test başarılı ise eski dosyayı timestamp'li backup'a al, yeni dosyayı kaydet
#   5. Restart önerilir (bu script restart yapmaz — caller kararı)
#
# Input (stdin JSON):
#   {
#     "content":      "[mysqld]\nmax_connections=200\n...",
#     "validate_only": false  (default: false — true ise sadece syntax test)
#   }
#
# Output (stdout JSON):
#   {
#     "written":     true,
#     "path":        "/etc/my.cnf.d/onox.cnf",
#     "backup_path": "/etc/my.cnf.d/onox.cnf.bak-20260524",
#     "size_bytes":  234,
#     "needs_restart": true
#   }
#
# Exit codes: 0=ok 1=invalid-input 2=preflight-fail 3=exec-fail

set -euo pipefail

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

require_root
onx_json_input

CONTENT=$(echo "$INPUT" | jq -r '.content // ""')
VALIDATE_ONLY=$(onx_json_field "validate_only" "false")

[[ -z "${CONTENT}" ]] && onx_die 1 "content alanı boş — yazılacak my.cnf içeriği yok"

# OS detect
OS_FAMILY=""
TARGET_PATH=""
INCLUDE_DIR=""

if [[ -f /etc/redhat-release ]] || [[ -f /etc/almalinux-release ]] || [[ -f /etc/rocky-release ]]; then
    OS_FAMILY="rhel"
    INCLUDE_DIR="/etc/my.cnf.d"
    TARGET_PATH="${INCLUDE_DIR}/onox.cnf"
elif [[ -f /etc/debian_version ]]; then
    OS_FAMILY="debian"
    INCLUDE_DIR="/etc/mysql/mariadb.conf.d"
    TARGET_PATH="${INCLUDE_DIR}/99-onox.cnf"
else
    onx_die 2 "Desteklenmeyen OS — RHEL/Debian değil"
fi

[[ ! -d "${INCLUDE_DIR}" ]] && onx_die 2 "Include dizini yok: ${INCLUDE_DIR}"

# Test: geçici dosyaya yaz + mysqld --validate-config benzeri syntax check
TMP_CFG=$(mktemp /tmp/onox-test-XXXXXX.cnf)
echo "${CONTENT}" > "${TMP_CFG}"
chmod 0644 "${TMP_CFG}"

# Syntax test — mysqld --defaults-file= ile çalıştırıp --print-defaults çıktısı bekle
# (sadece parsing kontrolü, gerçek başlatma değil)
MYSQLD_BIN=""
for candidate in /usr/sbin/mariadbd /usr/sbin/mysqld /usr/libexec/mariadbd; do
    if [[ -x "${candidate}" ]]; then
        MYSQLD_BIN="${candidate}"
        break
    fi
done

if [[ -n "${MYSQLD_BIN}" ]]; then
    # --validate-config (MariaDB 10.6+ destekler), fallback --print-defaults
    if "${MYSQLD_BIN}" --defaults-file="${TMP_CFG}" --validate-config 2>/dev/null; then
        : # OK
    elif "${MYSQLD_BIN}" --defaults-file="${TMP_CFG}" --print-defaults 2>&1 \
         | grep -qi "unknown variable\|error"; then
        ERR=$("${MYSQLD_BIN}" --defaults-file="${TMP_CFG}" --print-defaults 2>&1 \
              | grep -iE "unknown variable|error" | head -3)
        rm -f "${TMP_CFG}"
        onx_die 3 "Config syntax hatası: ${ERR}"
    fi
fi

if [[ "${VALIDATE_ONLY}" == "true" ]]; then
    rm -f "${TMP_CFG}"
    jq -n \
        --arg path "${TARGET_PATH}" \
        '{validated: true, path: $path, message: "Syntax OK, dosya yazılmadı (validate_only=true)"}'
    exit 0
fi

# Backup mevcut dosyayı
BACKUP_PATH=""
if [[ -f "${TARGET_PATH}" ]]; then
    BACKUP_PATH="${TARGET_PATH}.bak-$(date +%Y%m%d%H%M%S)"
    cp -a "${TARGET_PATH}" "${BACKUP_PATH}"
fi

# Yeni içeriği yaz
mv "${TMP_CFG}" "${TARGET_PATH}"
chown root:root "${TARGET_PATH}"
chmod 0644 "${TARGET_PATH}"

SIZE=$(stat -c "%s" "${TARGET_PATH}")
onx_log "db-config-write: ${TARGET_PATH} yazıldı (${SIZE} bytes, backup: ${BACKUP_PATH})"

jq -n \
    --arg path "${TARGET_PATH}" \
    --arg backup "${BACKUP_PATH}" \
    --argjson size "${SIZE}" \
    '{written: true, path: $path, backup_path: $backup, size_bytes: $size, needs_restart: true}'
