#!/usr/bin/env bash
# Construye (si hace falta) y abre una shell en el contenedor del curso. El
# directorio actual se monta en /work.
#
#   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
#
# El puerto 3000 del contenedor queda publicado en localhost:3000, para abrir
# en el navegador la aplicación que se está desarrollando. Si existe
# ~/.gitconfig, se monta (solo lectura) para que los commits hechos dentro del
# contenedor lleven su nombre y su correo.
set -euo pipefail

IMAGE=is
NAME=is
HERE="$(cd "$(dirname "$0")" && pwd)"

if [ "${1:-}" = "--rebuild" ]; then
    docker build -t "$IMAGE" -f "$HERE/Dockerfile" "$HERE/.."
    shift
fi

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

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

GITCONFIG=()
[ -f "$HOME/.gitconfig" ] && GITCONFIG=(-v "$HOME/.gitconfig":/root/.gitconfig:ro)

exec docker run --rm $TTY --name "$NAME" -p 3000:3000 \
    --add-host=host.docker.internal:host-gateway \
    -v "$PWD":/work ${GITCONFIG[@]+"${GITCONFIG[@]}"} -w /work "$IMAGE" "$@"
