#!/bin/zsh
# ⚕️  MedTranscribe — trial launcher (macOS, via Docker Desktop)
#
# Double-click this file. It starts the official container image and opens the browser.
# Nothing is uploaded: the app runs locally, the language model runs on this machine.
#
# Requires Docker Desktop for Mac. The image is multi-arch, so Apple Silicon and
# Intel Macs both pull a native build. The image is downloaded once (~3.4 GB).

set -u

IMAGE="aliaskepler/medtranscribe:latest"
NAME="medtranscribe"
PORT=5022

export PATH="/usr/local/bin:/opt/homebrew/bin:/Applications/Docker.app/Contents/Resources/bin:$PATH"

say() { printf "%s\n" "$1"; }
pause_exit() { [ "${PS1:-}" = "" ] && read -r "?Enter zum Schliessen..." ; exit "${1:-1}"; }

say ""
say "============================================================"
say " MedTranscribe — Testversion"
say "============================================================"
say ""


# -- 0) Stop-Skript neben dieser Datei anlegen (falls es fehlt) -----------------
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
STOP_NAME="0 Stop MedTranscribe (Trial).command"
if [ ! -f "$SCRIPT_DIR/$STOP_NAME" ]; then
    cat > "$SCRIPT_DIR/$STOP_NAME" <<'STOPEOF'
#!/bin/zsh
# ⚖️  MedTranscribe — Testversion stoppen (macOS, Docker)

set -u
export PATH="/usr/local/bin:/opt/homebrew/bin:/Applications/Docker.app/Contents/Resources/bin:$PATH"

NAME="medtranscribe"

if ! command -v docker >/dev/null 2>&1; then
    echo "Docker Desktop ist nicht installiert - es laeuft nichts zu stoppen."
    read -r "?Enter zum Schliessen..."
    exit 1
fi

if ! docker container inspect "$NAME" >/dev/null 2>&1; then
    echo "Kein Container \"$NAME\" vorhanden."
    read -r "?Enter zum Schliessen..."
    exit 0
fi

echo "Stoppe MedTranscribe..."
docker stop "$NAME" >/dev/null || { echo "Der Container konnte nicht gestoppt werden."; read -r "?Enter zum Schliessen..."; exit 1; }

echo ""
echo "MedTranscribe ist gestoppt. Ihre Daten bleiben in den Volumes erhalten."
echo "Neustart: \"MedTranscribe-Trial-macOS.command\" ausfuehren."
echo ""
echo "Endgueltig entfernen (Datenverlust):"
echo "  docker rm -f $NAME"
echo "  docker volume rm ps-input ps-output ps-model-inputs ps-prompts ps-license-state ps-recorder-output ps-landing-data"
echo ""
read -r "?Enter zum Schliessen..."
STOPEOF
    chmod +x "$SCRIPT_DIR/$STOP_NAME"
fi
# -- 1) Docker installiert? ---------------------------------------------------
if ! command -v docker >/dev/null 2>&1; then
    say " Docker Desktop ist nicht installiert."
    say ""
    say "  1. https://www.docker.com/products/docker-desktop/ herunterladen"
    say "  2. Installieren und starten"
    say "  3. Dieses Skript erneut ausfuehren"
    say ""
    open "https://www.docker.com/products/docker-desktop/" 2>/dev/null
    pause_exit 1
fi

# -- 2) Docker-Dienst laeuft? -------------------------------------------------
if ! docker info >/dev/null 2>&1; then
    say " Docker Desktop laeuft noch nicht - wird gestartet..."
    open -a Docker 2>/dev/null || true
    say " Warte auf Docker (bis zu 3 Minuten)..."
    READY=""
    for _ in $(seq 1 90); do
        if docker info >/dev/null 2>&1; then READY=1; break; fi
        sleep 2
    done
    if [ -z "$READY" ]; then
        say ""
        say " Docker Desktop ist nicht rechtzeitig bereit geworden."
        say " Bitte Docker Desktop manuell starten und dieses Skript erneut ausfuehren."
        pause_exit 1
    fi
fi

# -- 3) Ollama auf dem Host pruefen (nur Hinweis) -----------------------------
if ! curl -s -f -o /dev/null --max-time 3 http://127.0.0.1:11434/api/tags; then
    say " Hinweis: Ollama antwortet nicht auf Port 11434."
    say "          Die Berichtsgenerierung braucht Ollama auf diesem Rechner:"
    say "            https://ollama.com/download"
    say "            ollama pull qwen3-coder:30b"
    say ""
fi

# -- 4) Image holen, falls noch nicht vorhanden ------------------------------
if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
    say " Erststart: Image wird heruntergeladen (mehrere GB, einmalig)..."
    if ! docker pull "$IMAGE"; then
        say ""
        say " Download fehlgeschlagen. Internetverbindung pruefen und erneut starten."
        pause_exit 1
    fi
    say ""
fi

# -- 5) Container starten oder anlegen ---------------------------------------
if docker container inspect "$NAME" >/dev/null 2>&1; then
    say " Vorhandenen Container starten..."
    # Older launchers created the container without a restart policy.
    docker update --restart unless-stopped "$NAME" >/dev/null 2>&1 || true
    if ! docker start "$NAME" >/dev/null; then
        say ""
        say " Der Container liess sich nicht starten. Details:"
        docker logs --tail 20 "$NAME"
        pause_exit 1
    fi
else
    say " Container anlegen..."
    if ! docker run -d --name "$NAME" \
        --restart unless-stopped \
        --add-host host.docker.internal:host-gateway \
        -p "$PORT:5022" \
        -p 5004:5004 \
        -p 5078:5078 \
        -p 5032:5032 \
        -e LICENSE_ENFORCE=0 \
        -e TRIAL_KEY_REQUIRED=1 \
        -e TRIAL_DAYS=14 \
        -e LICENSE_API=https://medtranscribe.ch/api \
        -e OLLAMA_URL=http://host.docker.internal:11434 \
        -v mt-input:/app/prototype/INPUT \
        -v mt-output:/app/prototype/OUTPUT \
        -v mt-model-inputs:/app/prototype/model_inputs \
        -v mt-prompts:/app/PROMPTS \
        -v mt-license-state:/app/prototype/license-state \
        -v "mt-recorder-output:/app/live consultation for annotated noise/output" \
        -v mt-landing-data:/app/landing/server/data \
        "$IMAGE" >/dev/null; then
        say ""
        say " Der Container konnte nicht angelegt werden."
        say " Laeuft bereits eine Instanz auf Port $PORT?"
        pause_exit 1
    fi
fi

# -- 6) Auf Bereitschaft warten ----------------------------------------------
say " Warte auf die Anwendung..."
UP=""
for _ in $(seq 1 90); do
    # The image ships a HEALTHCHECK; older images report "none" and fall back to
    # an HTTP probe, so both work.
    HEALTH=$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}' "$NAME" 2>/dev/null || echo none)
    if [ "$HEALTH" = "healthy" ]; then UP=1; break; fi
    if [ "$HEALTH" = "none" ] && curl -s -f -o /dev/null --max-time 2 "http://127.0.0.1:$PORT/api/health"; then UP=1; break; fi
    sleep 2
done

if [ -z "$UP" ]; then
    say ""
    say " Die Anwendung ist nicht gestartet. Letzte Zeilen aus dem Container:"
    docker logs --tail 30 "$NAME"
    say ""
    pause_exit 1
fi

open "http://127.0.0.1:$PORT"

say ""
say "============================================================"
say " Fertig - MedTranscribe laeuft:  http://127.0.0.1:$PORT"
say "============================================================"
say ""
say "  Stoppen:      \"0 Stop MedTranscribe (Trial).command\" ausfuehren"
say "                oder:  docker stop $NAME"
say "  Log ansehen:  docker logs -f $NAME"
say "  Daten:        docker volume ls   (mt-input, mt-output, ...)"
say ""
say "  Hinweis: Bitte ausschliesslich mit anonymisierten oder"
say "           synthetischen Faellen testen. Kein Medizinprodukt."
say ""
say "  Ein gekaufter Schluessel (MT-XXXX-XXXX-XXXX) wird in der App"
say "  eingegeben und schaltet die Vollversion frei."
say ""
pause_exit 0
