#!/bin/sh
set -e

echo "=== Настройка репликации ==="
echo "Этот узел: NODE_ID=${NODE_ID}"
echo "Удаленный хост: ${REMOTE_HOST}"

echo "Ждем локальную базу..."
sleep 10

until PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do
    echo "Локальная база не готова, ждем..."
    sleep 2
done
echo "Локальная база готова"

echo "Настройка генераторов ID (NODE_ID=${NODE_ID})..."

PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
DO \$\$
DECLARE
    r RECORD;
BEGIN
    FOR r IN
        SELECT table_schema, table_name, column_name
        FROM information_schema.columns
        WHERE is_identity = 'YES'
          AND table_schema = 'public'
    LOOP
        EXECUTE format(
            'ALTER TABLE %I.%I ALTER COLUMN %I SET GENERATED BY DEFAULT AS IDENTITY (START WITH %s INCREMENT BY 2)',
            r.table_schema, r.table_name, r.column_name, ${NODE_ID}
        );
        RAISE NOTICE 'Настроен ID для %.%', r.table_name, r.column_name;
    END LOOP;
END \$\$;
EOF

echo "Проверяем/создаем публикацию..."

PUB_EXISTS=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_publication WHERE pubname = 'all_tables_pub';")

if [ "$PUB_EXISTS" -gt 0 ]; then
    echo "Публикация уже существует"
else
    echo "Создаем публикацию..."
    PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
CREATE PUBLICATION all_tables_pub FOR ALL TABLES;
EOF
    echo "Публикация создана!"
fi

echo "Ждем удаленный хост ${REMOTE_HOST}:${REMOTE_PORT}..."
TIMEOUT=300
ELAPSED=0

while ! PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do
    sleep 5
    ELAPSED=$((ELAPSED + 5))
    if [ $ELAPSED -ge $TIMEOUT ]; then
        echo "Таймаут ожидания удаленного хоста. Подписка НЕ настроена."
        echo "Публикация создана - удаленный хост сможет подписаться на нас."
        echo "Для создания подписки запустите позже:"
        echo "docker compose restart replication-setup"
        exit 0
    fi
    echo "Удаленный хост недоступен, ждем... (${ELAPSED}s/${TIMEOUT}s)"
done
echo "Удаленный хост доступен"

REMOTE_PUB=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_publication WHERE pubname = 'all_tables_pub';" 2>/dev/null || echo "0")

if [ "$REMOTE_PUB" -eq 0 ]; then
    echo "ВНИМАНИЕ: На удалённом хосте нет публикации 'all_tables_pub'!"
    echo "Подписка не будет создана. Сначала запустите скрипт на удалённом хосте."
    exit 0
fi

EXISTING=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_subscription WHERE subname = 'sub_from_remote';")

if [ "$EXISTING" -gt 0 ]; then
    echo "Подписка уже существует, пропускаем создание"
else
    echo "Создаем подписку на удаленный хост..."

    PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
CREATE SUBSCRIPTION sub_from_remote
CONNECTION 'host=${REMOTE_HOST} port=${REMOTE_PORT} user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} dbname=${POSTGRES_DB}'
PUBLICATION all_tables_pub
WITH (
    origin = none
);
EOF

    echo "Подписка создана!"
fi

echo ""
echo "=== Репликация настроена! ==="
echo "Публикация: all_tables_pub (другие могут подписаться на нас)"
echo "Подписка: sub_from_remote (мы получаем данные от ${REMOTE_HOST})"
