#!/usr/bin/env bash
# klvd-psql — проваливание в SQL-диалог (или -c/-f) с БД САП «Клавдий».
# Локальная СУБД (контейнер klvd_postgres)  → docker exec psql.
# Внешняя СУБД (контейнера нет)             → эфемерный контейнер postgres:16
#   с клиентом psql, подключается к POSTGRESQL_HOST из .env. Образ-клиент
#   при отсутствии вытягивается автоматически (для air-gapped — скачайте
#   postgres:16 заранее: docker pull postgres:16).
# Запуск: klvd-psql           (диалог)
#        klvd-psql -c "..."   (один запрос)
#        klvd-psql -f file.sql
#        klvd-psql < file.sql
set -euo pipefail

INSTALL_DIR="${KLVD_INSTALL_DIR:-/opt/klvd}"
SECRETS="$INSTALL_DIR/secrets"
ENV_FILE="$INSTALL_DIR/.env"

die() { echo "[klvd-psql] $*" >&2; exit 1; }

[[ -f "$SECRETS/pg_user"     ]] || die "Не найден $SECRETS/pg_user. Запустите из INSTALL_DIR (по умолчанию /opt/klvd)."
[[ -f "$SECRETS/pg_password" ]] || die "Не найден $SECRETS/pg_password."

PGUSER="$(cat "$SECRETS/pg_user")"
PGPASSWORD="$(cat "$SECRETS/pg_password")"

# Параметры подключения из .env (с разумными дефолтами).
PGHOST="127.0.0.1"; PGPORT="5432"; PGDB="klvd"; PGSSLMODE="prefer"
if [[ -f "$ENV_FILE" ]]; then
    # shellcheck disable=SC1090
    set -a; . "$ENV_FILE"; set +a
    : "${POSTGRESQL_HOST:=127.0.0.1}"; : "${POSTGRESQL_PORT:=5432}"
    : "${POSTGRESQL_DB:=klvd}";         : "${POSTGRESQL_SSL:=prefer}"
    PGHOST="$POSTGRESQL_HOST"; PGPORT="$POSTGRESQL_PORT"
    PGDB="$POSTGRESQL_DB";     PGSSLMODE="$POSTGRESQL_SSL"
fi

CONTAINER="klvd_postgres"

# 1) Локальная СУБД — psql из контейнера klvd_postgres (быстро, без сети).
if docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "$CONTAINER"; then
    exec docker exec -i -e PGPASSWORD="$PGPASSWORD" "$CONTAINER" \
        psql -U "$PGUSER" -d "$PGDB" -v ON_ERROR_STOP=1 "$@"
fi

# 2) Внешняя СУБД — эфемерный контейнер-клиент postgres:16.
PG_CLIENT_IMAGE="postgres:16"
if ! docker image inspect "$PG_CLIENT_IMAGE" >/dev/null 2>&1; then
    echo "[klvd-psql] Образ-клиент $PG_CLIENT_IMAGE не найден locally — вытягивается…" >&2
    docker pull "$PG_CLIENT_IMAGE" \
        || die "Не удалось вытянуть $PG_CLIENT_IMAGE. Для air-gapped: docker pull $PG_CLIENT_IMAGE на машине с доступом, затем загрузите образ сюда (docker save/load)."
fi

# --network host: POSTGRESQL_HOST может быть 127.0.0.1 (туннель/forward) или внешний адрес.
# PGSSLMODE (из .env POSTGRESQL_SSL) передаётся в контейнер как env — psql подхватит.
exec docker run --rm -i --network host \
    -e PGPASSWORD="$PGPASSWORD" -e PGSSLMODE="$PGSSLMODE" \
    "$PG_CLIENT_IMAGE" \
    psql -h "$PGHOST" -p "$PGPORT" -U "$PGUSER" -d "$PGDB" -v ON_ERROR_STOP=1 "$@"
