#!/usr/bin/env bash
# Construye (si hace falta) y abre una shell en el contenedor del curso, con
# PostgreSQL 18 ya corriendo. La imagen se construye desde la raíz del
# repositorio para incluir los datos de ejemplo (datasets/chasqui). El directorio actual se monta en /work y los
# datos de PostgreSQL se guardan en el volumen de Docker "bd-pgdata".
#
#   run.sh               abre una shell (si el contenedor ya está abierto en
#                        otra terminal, abre una segunda shell en el mismo)
#   run.sh make test     ejecuta un comando dentro del contenedor
#   run.sh --rebuild     reconstruye la imagen
#   run.sh --reset-db    borra el volumen con las bases de datos (pide confirmación)
set -euo pipefail

IMAGE=bd
NAME=bd
VOLUME=bd-pgdata
HERE="$(cd "$(dirname "$0")" && pwd)"

case "${1:-}" in
    --rebuild)
        docker build -t "$IMAGE" -f "$HERE/Dockerfile" "$HERE/.."
        shift
        ;;
    --reset-db)
        read -r -p "Se borran todas las bases de datos del curso. ¿Continuar? [s/N] " ok
        [ "$ok" = "s" ] || exit 1
        docker rm -f "$NAME" >/dev/null 2>&1 || true
        docker volume rm "$VOLUME"
        exit 0
        ;;
esac

if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
    docker build -t "$IMAGE" -f "$HERE/Dockerfile" "$HERE/.."
fi

[ $# -eq 0 ] && set -- bash
TTY=-i; [ -t 0 ] && TTY=-it

# Un solo servidor por volumen: si el contenedor ya corre (otra terminal),
# se entra al mismo. Así dos sesiones pueden intercalar transacciones.
if [ "$(docker inspect -f '{{.State.Running}}' "$NAME" 2>/dev/null)" = "true" ]; then
    MOUNT="$(docker inspect -f '{{range .Mounts}}{{if eq .Destination "/work"}}{{.Source}}{{end}}{{end}}' "$NAME")"
    case "$PWD/" in
        "$MOUNT"/*) WD="/work${PWD#"$MOUNT"}" ;;
        *) echo "Aviso: el contenedor abierto monta $MOUNT; aquí /work es esa carpeta." >&2; WD=/work ;;
    esac
    exec docker exec $TTY -w "$WD" "$NAME" "$@"
fi

exec docker run --rm $TTY --name "$NAME" \
    -v "$PWD":/work -v "$VOLUME":/var/lib/postgresql \
    -w /work "$IMAGE" "$@"
