#!/usr/bin/env bash
# onx-mariadb-slave-setup — MariaDB slave replication kurulumu
# Input:  {"master_host":"10.0.0.1","master_port":3306,"repl_user":"replicator",
#           "repl_password":"...","log_file":"mysql-bin.000001","log_pos":12345,"server_id":2}
# Output: {"server_id":2,"slave_io_running":"Yes","slave_sql_running":"Yes","seconds_behind_master":0}

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

require_root
require_cmd mysql
onx_json_input

MASTER_HOST="$(onx_json_field master_host)"
MASTER_PORT="$(onx_json_field master_port '3306')"
REPL_USER="$(onx_json_field repl_user 'replicator')"
REPL_PASSWORD="$(onx_json_field repl_password)"
LOG_FILE="$(onx_json_field log_file)"
LOG_POS="$(onx_json_field log_pos)"
SERVER_ID="$(onx_json_field server_id '2')"
CNF_FILE="/etc/my.cnf.d/onox.cnf"

[[ -z "$MASTER_HOST" ]]    && onx_die 1 "master_host zorunlu"
[[ -z "$REPL_PASSWORD" ]]  && onx_die 1 "repl_password zorunlu"
[[ -z "$LOG_FILE" ]]       && onx_die 1 "log_file zorunlu"
[[ -z "$LOG_POS" ]]        && onx_die 1 "log_pos zorunlu"
[[ "$SERVER_ID" =~ ^[0-9]+$ ]] || onx_die 1 "Gecersiz server_id: '${SERVER_ID}'"
[[ "$MASTER_PORT" =~ ^[0-9]+$ ]] || onx_die 1 "Gecersiz master_port: '${MASTER_PORT}'"

onx_log "mariadb-slave-setup: server_id=${SERVER_ID} master=${MASTER_HOST}:${MASTER_PORT}"

# --- /etc/my.cnf.d/onox.cnf güncelle ---
if grep -q '^\[mysqld\]' "$CNF_FILE" 2>/dev/null; then
    sed -i '/^server-id/d; /^relay_log/d; /^read_only/d; /^log_bin/d' "$CNF_FILE"
else
    printf '[mysqld]\n' > "$CNF_FILE"
fi

cat >> "$CNF_FILE" <<MYCNF
server-id  = ${SERVER_ID}
relay_log  = relay-bin
read_only  = 1
MYCNF

# --- Servisi yeniden başlat ---
systemctl restart mariadb || onx_die 3 "MariaDB yeniden başlatılamadı"

# --- Replication başlat ---
mysql -e "STOP SLAVE;" 2>/dev/null || true
mysql -e "CHANGE MASTER TO
  MASTER_HOST='${MASTER_HOST}',
  MASTER_PORT=${MASTER_PORT},
  MASTER_USER='${REPL_USER}',
  MASTER_PASSWORD='${REPL_PASSWORD}',
  MASTER_LOG_FILE='${LOG_FILE}',
  MASTER_LOG_POS=${LOG_POS};" \
    || onx_die 3 "CHANGE MASTER TO basarisiz"

mysql -e "START SLAVE;" || onx_die 3 "START SLAVE basarisiz"

# --- 5 saniye bekle, durumu kontrol et ---
sleep 5

SLAVE_STATUS=$(mysql -e "SHOW SLAVE STATUS\G" 2>/dev/null) \
    || onx_die 3 "SHOW SLAVE STATUS basarisiz"

IO_RUNNING=$(echo "$SLAVE_STATUS"  | grep 'Slave_IO_Running:'  | awk '{print $2}')
SQL_RUNNING=$(echo "$SLAVE_STATUS" | grep 'Slave_SQL_Running:' | awk '{print $2}')
LAG=$(echo "$SLAVE_STATUS"         | grep 'Seconds_Behind_Master:' | awk '{print $2}')
IO_ERROR=$(echo "$SLAVE_STATUS"    | grep 'Last_IO_Error:'  | sed 's/.*Last_IO_Error: //')
SQL_ERROR=$(echo "$SLAVE_STATUS"   | grep 'Last_SQL_Error:' | sed 's/.*Last_SQL_Error: //')

LAG="${LAG:-0}"
[[ "$LAG" == "NULL" ]] && LAG=0

IO_RUNNING_JSON=$(printf '%s' "${IO_RUNNING:-No}"   | jq -Rs '.')
SQL_RUNNING_JSON=$(printf '%s' "${SQL_RUNNING:-No}" | jq -Rs '.')
IO_ERROR_JSON=$(printf '%s' "${IO_ERROR:-}"         | jq -Rs '.')
SQL_ERROR_JSON=$(printf '%s' "${SQL_ERROR:-}"       | jq -Rs '.')

json_ok "{\"server_id\":${SERVER_ID},\"slave_io_running\":${IO_RUNNING_JSON},\"slave_sql_running\":${SQL_RUNNING_JSON},\"seconds_behind_master\":${LAG},\"last_io_error\":${IO_ERROR_JSON},\"last_sql_error\":${SQL_ERROR_JSON}}"
