#!/usr/bin/env bash
# onx-record-upsert — PowerDNS kaydı ekle veya guncelle
# Input:  {"zone":"example.com","name":"www.example.com","type":"A",
#           "content":"1.2.3.4","ttl":3600,"prio":0}
# Output: {"zone":...,"name":...,"type":...,"content":...,"record_id":...}

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/_lib/common.sh"

require_root
require_cmd mysql
onx_json_input

ZONE="$(onx_json_field zone)"
NAME="$(onx_json_field name)"
TYPE="$(onx_json_field type)"
CONTENT="$(onx_json_field content)"
TTL="$(onx_json_field ttl '3600')"
PRIO="$(onx_json_field prio '0')"

[[ -z "$ZONE" ]]    && onx_die 1 "zone zorunlu"
[[ -z "$NAME" ]]    && onx_die 1 "name zorunlu"
[[ -z "$TYPE" ]]    && onx_die 1 "type zorunlu"
[[ -z "$CONTENT" ]] && onx_die 1 "content zorunlu"
onx_validate_domain "$ZONE"
TYPE="${TYPE^^}"
[[ "$TYPE" =~ ^(A|AAAA|CNAME|MX|TXT|SRV|CAA|NAPTR|NS|PTR|SOA)$ ]] || \
    onx_die 1 "Gecersiz kayit tipi: '${TYPE}'"
[[ "$TTL" =~ ^[0-9]+$ ]]  || onx_die 1 "Gecersiz ttl: '${TTL}'"
[[ "$PRIO" =~ ^[0-9]+$ ]] || PRIO=0

ZONE_LOWER="${ZONE,,}"
NAME_LOWER="${NAME,,}"
onx_log "record-upsert: zone=${ZONE_LOWER} name=${NAME_LOWER} type=${TYPE}"

_mycnf_tmp

DOMAIN_ID="$(mysql_exec "${ONX_PDNS_DB}" \
    "SELECT id FROM domains WHERE name='${ZONE_LOWER}' LIMIT 1;" 2>/dev/null | tail -1)"
[[ -z "$DOMAIN_ID" || ! "$DOMAIN_ID" =~ ^[0-9]+$ ]] && \
    onx_die 2 "Zone bulunamadi: ${ZONE_LOWER}"

# INSERT ... ON DUPLICATE KEY UPDATE
# Unique key: (domain_id, name, type, content)
mysql --defaults-extra-file="$_MYCNF_TMP" --batch --silent "${ONX_PDNS_DB}" <<SQL
INSERT INTO records (domain_id, name, type, content, ttl, prio, disabled)
VALUES (${DOMAIN_ID}, '${NAME_LOWER}', '${TYPE}', '${CONTENT}', ${TTL}, ${PRIO}, 0)
ON DUPLICATE KEY UPDATE
  content = VALUES(content),
  ttl     = VALUES(ttl),
  prio    = VALUES(prio),
  disabled = 0;
SQL
[[ $? -ne 0 ]] && onx_die 3 "Kayit upsert basarisiz: ${NAME_LOWER} ${TYPE}"

# Kayit ID
RECORD_ID="$(mysql_exec "${ONX_PDNS_DB}" \
    "SELECT id FROM records WHERE domain_id=${DOMAIN_ID} AND name='${NAME_LOWER}' AND type='${TYPE}' AND content='${CONTENT}' LIMIT 1;" 2>/dev/null | tail -1)"

# SOA serial güncelle
mysql_exec "${ONX_PDNS_DB}" \
    "UPDATE records SET content=REGEXP_REPLACE(content, '([^ ]+ [^ ]+ )([0-9]+)(.*)', CONCAT('\$1', DATE_FORMAT(NOW(), '%Y%m%d01'), '\$3')) WHERE domain_id=${DOMAIN_ID} AND type='SOA';" \
    2>/dev/null || true

# Notify (zone Master ise)
pdns_control notify "${ZONE_LOWER}" 2>/dev/null || true

RECORD_ID="${RECORD_ID:-0}"
CONTENT_ESC="${CONTENT//\"/\\\"}"
json_ok "{\"zone\":\"${ZONE_LOWER}\",\"name\":\"${NAME_LOWER}\",\"type\":\"${TYPE}\",\"content\":\"${CONTENT_ESC}\",\"ttl\":${TTL},\"prio\":${PRIO},\"record_id\":${RECORD_ID}}"
