#!/usr/bin/env bash
# onx-db-restart — systemctl restart mariadb / mysqld
#
# Aktif DB servisini tespit eder (mariadb veya mysqld), restart eder.
# Restart süresi (downtime) ölçülür ve dönülür.
#
# Input:  {} (bos obje kabul edilir)
# Output: {"restarted":true, "service":"mariadb|mysqld", "downtime_seconds":N}
# Exit:   0=ok, 1=invalid-input, 2=preflight-fail, 3=exec-fail

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

require_root
require_cmd systemctl
onx_json_input

# Aktif DB servisini tespit et — v1.1 fix:
# list-unit-files grep'i her sistemde uyuşmuyor (RHEL 9'da output formatı farklı).
# systemctl status <name> daha sağlam: servis varsa exit 0 veya 3, yoksa 4.
SERVICE=""
for candidate in mariadb mariadb-server mysqld mysql mysql-server; do
    # systemctl status servis YOK iken exit 4 verir (LoadState=not-found).
    # Servis varsa (running/stopped/failed/inactive) exit 0/3 — load state OK.
    state=$(systemctl show -p LoadState --value "${candidate}.service" 2>/dev/null || echo "not-found")
    if [[ "${state}" == "loaded" ]]; then
        SERVICE="${candidate}"
        break
    fi
done

# Fallback: process tablosundan tespit (eğer systemd kapalıysa veya custom unit)
if [[ -z "${SERVICE}" ]]; then
    if pgrep -x mariadbd >/dev/null 2>&1; then
        SERVICE="mariadb"
    elif pgrep -x mysqld >/dev/null 2>&1; then
        SERVICE="mysqld"
    fi
fi

if [[ -z "${SERVICE}" ]]; then
    # Son çare: hangi servis dosyaları mevcut?
    AVAILABLE=$(systemctl list-unit-files --type=service --no-legend 2>/dev/null \
                | awk '{print $1}' | grep -iE 'maria|mysql' | tr '\n' ',' | sed 's/,$//')
    onx_die 2 "DB servisi bulunamadi (mariadb/mariadb-server/mysqld/mysql/mysql-server). Mevcut benzer servisler: ${AVAILABLE:-yok}"
fi

onx_log "db-restart: ${SERVICE} servisi yeniden baslatiliyor"

START_TS=$(date +%s)
if ! systemctl restart "${SERVICE}"; then
    onx_die 3 "systemctl restart ${SERVICE} basarisiz"
fi

# Aktif olana kadar 30sn bekle (timeout)
TIMEOUT=30
WAITED=0
while ! systemctl is-active --quiet "${SERVICE}"; do
    sleep 1
    WAITED=$((WAITED + 1))
    if [[ ${WAITED} -ge ${TIMEOUT} ]]; then
        onx_die 3 "${SERVICE} restart sonrasi ${TIMEOUT}sn icinde aktif olamadi"
    fi
done

END_TS=$(date +%s)
DOWNTIME=$((END_TS - START_TS))

onx_log "db-restart: ${SERVICE} aktif (downtime ${DOWNTIME}sn)"

json_ok "{\"restarted\":true,\"service\":\"${SERVICE}\",\"downtime_seconds\":${DOWNTIME}}"
