#!/usr/bin/env bash
#
# onx-pdns-api-enable — PowerDNS HTTP API'sini idempotent şekilde aktif et.
# DNS-01 challenge için acme.sh dns_pdns hook'u bu API'yi kullanır.
#
# Stdin (JSON):
#   {} (parametre yok — idempotent)
#
# Stdout (JSON):
#   {"ok":true,"api_url":"http://127.0.0.1:8081","api_key_path":"/etc/onoxsoft/pdns-api.key","server_id":"localhost"}
#
# Davranış:
#   - /etc/onoxsoft/pdns-api.key yoksa rastgele 32-byte hex API key üretir
#   - /etc/pdns/pdns.conf içinde api=yes / api-key / webserver ayarlarını upsert eder
#   - pdns servisi yeniden başlatılır (sadece değişiklik varsa)
#   - Tekrar çağrıldığında değişiklik yapmaz, mevcut key'i döndürür
#
# Exit codes:
#   0 = ok
#   2 = preflight fail (pdns kurulu değil)
#   3 = exec fail (config yazılamadı, pdns restart fail)

set -uo pipefail

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

PDNS_CONF="/etc/pdns/pdns.conf"
API_KEY_FILE="/etc/onoxsoft/pdns-api.key"
WEBSERVER_PORT="8081"
WEBSERVER_ADDR="127.0.0.1"
SERVER_ID="localhost"

# ── Preflight ──────────────────────────────────────────────────────────────
[[ -f "${PDNS_CONF}" ]] || onx_die 2 "PowerDNS config dosyası yok: ${PDNS_CONF}"
command -v openssl >/dev/null 2>&1 || onx_die 2 "openssl bulunamadı"
systemctl list-unit-files 2>/dev/null | grep -q "^pdns.service" || onx_die 2 "pdns systemd unit yok"

# ── API key üret veya mevcut olanı oku ─────────────────────────────────────
mkdir -p /etc/onoxsoft
if [[ ! -f "${API_KEY_FILE}" ]]; then
    API_KEY=$(openssl rand -hex 32)
    printf '%s' "${API_KEY}" > "${API_KEY_FILE}"
    chmod 600 "${API_KEY_FILE}"
    chown root:root "${API_KEY_FILE}"
else
    API_KEY=$(cat "${API_KEY_FILE}")
fi

[[ -z "${API_KEY}" ]] && onx_die 3 "API key okunamadı: ${API_KEY_FILE}"

# ── Config upsert helper ───────────────────────────────────────────────────
# Tek bir key=value satırını config'e idempotent yazar.
# Eğer satır yoksa append, yanlış değer varsa replace.
upsert_setting() {
    local key="$1"
    local value="$2"
    local conf="$3"

    if grep -qE "^[[:space:]]*${key}[[:space:]]*=" "${conf}"; then
        # Mevcut satırı güncelle
        sed -i -E "s|^[[:space:]]*${key}[[:space:]]*=.*|${key}=${value}|" "${conf}"
    else
        # Yeni satır ekle
        printf '\n# ONOXSOFT: DNS-01 challenge için eklendi\n%s=%s\n' "${key}" "${value}" >> "${conf}"
    fi
}

CONF_CHANGED=0
TMPCONF=$(mktemp)
cp "${PDNS_CONF}" "${TMPCONF}"

upsert_setting "api"            "yes"               "${TMPCONF}"
upsert_setting "api-key"        "${API_KEY}"        "${TMPCONF}"
upsert_setting "webserver"      "yes"               "${TMPCONF}"
upsert_setting "webserver-address" "${WEBSERVER_ADDR}" "${TMPCONF}"
upsert_setting "webserver-port" "${WEBSERVER_PORT}" "${TMPCONF}"
upsert_setting "webserver-allow-from" "127.0.0.1,::1" "${TMPCONF}"

if ! diff -q "${PDNS_CONF}" "${TMPCONF}" >/dev/null 2>&1; then
    cp "${TMPCONF}" "${PDNS_CONF}"
    chmod 644 "${PDNS_CONF}"
    CONF_CHANGED=1
fi
rm -f "${TMPCONF}"

# ── Pdns restart (sadece config değiştiyse) ────────────────────────────────
if [[ "${CONF_CHANGED}" -eq 1 ]]; then
    systemctl restart pdns >/dev/null 2>&1 || onx_die 3 "pdns restart başarısız"
    sleep 1
    systemctl is-active pdns >/dev/null 2>&1 || onx_die 3 "pdns aktif değil restart sonrası"
fi

# ── API health check ───────────────────────────────────────────────────────
API_URL="http://${WEBSERVER_ADDR}:${WEBSERVER_PORT}"
API_RESP=$(curl -s --max-time 5 -H "X-API-Key: ${API_KEY}" "${API_URL}/api/v1/servers/${SERVER_ID}" || echo "")

if [[ -z "${API_RESP}" ]] || ! echo "${API_RESP}" | jq -e '.id' >/dev/null 2>&1; then
    onx_die 3 "PDNS API erişilemiyor: ${API_URL}. Config kontrol: ${PDNS_CONF}"
fi

# ── Output ─────────────────────────────────────────────────────────────────
jq -nc \
    --arg url "${API_URL}" \
    --arg key_path "${API_KEY_FILE}" \
    --arg sid "${SERVER_ID}" \
    --argjson changed "${CONF_CHANGED}" \
    '{ok:true,api_url:$url,api_key_path:$key_path,server_id:$sid,config_changed:($changed==1)}'

exit 0
