#!/usr/bin/env bash
# onx-redis-replicaof — Redis replica/info komutları
# Input:  {"action":"set","master_host":"10.0.0.1","master_port":6379} | {"action":"info"}
# Output: {"ok":true,...}

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

require_root
require_cmd redis-cli
onx_json_input

ACTION="$(onx_json_field action 'set')"
REDIS_CLI="redis-cli"

case "$ACTION" in
    set)
        MASTER_HOST="$(onx_json_field master_host)"
        MASTER_PORT="$(onx_json_field master_port '6379')"
        [[ -z "$MASTER_HOST" ]] && onx_die 1 "master_host zorunlu"
        [[ "$MASTER_PORT" =~ ^[0-9]+$ ]] || onx_die 1 "Gecersiz master_port: '${MASTER_PORT}'"

        onx_log "redis-replicaof: set master=${MASTER_HOST}:${MASTER_PORT}"

        RESULT=$($REDIS_CLI REPLICAOF "$MASTER_HOST" "$MASTER_PORT" 2>&1) \
            || onx_die 3 "REPLICAOF basarisiz: ${RESULT}"

        RESULT_JSON=$(printf '%s' "$RESULT" | jq -Rs '.')
        json_ok "{\"ok\":true,\"action\":\"set\",\"master_host\":\"${MASTER_HOST}\",\"master_port\":${MASTER_PORT},\"result\":${RESULT_JSON}}"
        ;;

    info)
        onx_log "redis-replicaof: info"
        REPL_INFO=$($REDIS_CLI INFO replication 2>/dev/null) || onx_die 3 "redis-cli INFO replication basarisiz"

        ROLE=$(echo "$REPL_INFO"               | grep '^role:'               | cut -d: -f2 | tr -d '\r')
        MASTER_HOST_INFO=$(echo "$REPL_INFO"   | grep '^master_host:'        | cut -d: -f2 | tr -d '\r')
        MASTER_PORT_INFO=$(echo "$REPL_INFO"   | grep '^master_port:'        | cut -d: -f2 | tr -d '\r')
        MASTER_SYNC=$(echo "$REPL_INFO"        | grep '^master_sync_in_progress:' | cut -d: -f2 | tr -d '\r')
        CONNECTED=$(echo "$REPL_INFO"          | grep '^connected_slaves:'   | cut -d: -f2 | tr -d '\r')
        SLAVE_OFFSET=$(echo "$REPL_INFO"       | grep '^slave_repl_offset:'  | cut -d: -f2 | tr -d '\r')
        MASTER_OFFSET=$(echo "$REPL_INFO"      | grep '^master_repl_offset:' | cut -d: -f2 | tr -d '\r')

        # Lag hesapla (master_repl_offset - slave_repl_offset, sadece role=slave için anlamlı)
        LAG=0
        if [[ "$ROLE" == "slave" && -n "$MASTER_OFFSET" && -n "$SLAVE_OFFSET" ]]; then
            LAG=$(( MASTER_OFFSET - SLAVE_OFFSET )) 2>/dev/null || LAG=0
        fi

        ROLE_JSON=$(printf '%s' "${ROLE:-unknown}"          | jq -Rs '.')
        MH_JSON=$(printf '%s' "${MASTER_HOST_INFO:-}"       | jq -Rs '.')
        MP_JSON="${MASTER_PORT_INFO:-0}"

        json_ok "{\"ok\":true,\"action\":\"info\",\"role\":${ROLE_JSON},\"master_host\":${MH_JSON},\"master_port\":${MP_JSON},\"seconds_behind_master\":${LAG},\"connected_slaves\":\"${CONNECTED:-0}\"}"
        ;;

    pause)
        onx_log "redis-replicaof: pause (REPLICAOF NO ONE)"
        RESULT=$($REDIS_CLI REPLICAOF NO ONE 2>&1) || onx_die 3 "REPLICAOF NO ONE basarisiz"
        json_ok "{\"ok\":true,\"action\":\"pause\"}"
        ;;

    resume)
        MASTER_HOST="$(onx_json_field master_host)"
        MASTER_PORT="$(onx_json_field master_port '6379')"
        [[ -z "$MASTER_HOST" ]] && onx_die 1 "resume icin master_host zorunlu"
        $REDIS_CLI REPLICAOF "$MASTER_HOST" "$MASTER_PORT" \
            || onx_die 3 "REPLICAOF resume basarisiz"
        json_ok "{\"ok\":true,\"action\":\"resume\"}"
        ;;

    *)
        onx_die 1 "Bilinmeyen action: '${ACTION}' (set | info | pause | resume)"
        ;;
esac
