# syntax=docker/dockerfile:1

FROM node:22-bookworm-slim AS deps
WORKDIR /app
COPY package.json package-lock.json ./
# Wie in der CI (.github/workflows/ci.yml) npm install statt npm ci: die
# committete package-lock.json ist nicht deckungsgleich mit package.json
# (fehlend: @emnapi/core, @emnapi/runtime, magicast).
# --ignore-scripts, weil postinstall "prisma generate" aufruft — das Schema
# liegt in dieser Stage noch nicht vor. Die build-Stage generiert den Client
# ohnehin explizit.
RUN npm install --no-audit --no-fund --ignore-scripts

FROM node:22-bookworm-slim AS build
WORKDIR /app
# OpenSSL: Prisma erkennt sonst die Version nicht und faellt auf openssl-1.1 zurueck
# (Warnung "failed to detect the libssl/openssl version", Review 25.09.2026).
RUN apt-get update && apt-get install -y --no-install-recommends openssl && rm -rf /var/lib/apt/lists/*
ENV NEXT_TELEMETRY_DISABLED=1
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# AGPL §13 (Pilot Dominiak): Quellcode genau dieser Version fuer die Nutzer der Instanz —
# als Archiv VOR dem Build (ohne node_modules/.next; Geheimnisse schliesst .dockerignore aus).
# Ausgeliefert ueber /quellcode (nur angemeldet).
RUN tar czf /tmp/quellcode.tar.gz --exclude=./node_modules --exclude=./.next .
# PostgreSQL-Client generieren + Production-Build (force-dynamic Seiten -> kein DB-Zugriff im Build)
# + Server-Dienste vorkompilieren (Schlank Stufe 1, 11.11.2026): dist/*.cjs statt tsx zur Laufzeit,
# mit dem Postgres-Client und dessen Linux-Engine (scripts/dienste-bauen.mjs).
RUN npx prisma generate --schema=prisma/schema.postgres.prisma \
  && NODE_OPTIONS=--max-old-space-size=4096 npx next build \
  && DIENSTE_PROVIDER=postgresql node scripts/dienste-bauen.mjs

# Vorschalt-Dienst „bei-bedarf“ (Schlank Stufe 1, scheeren/bei-bedarf): startet Fenster-Assistent,
# Altbestand-Leser u. a. erst bei der ersten Verbindung und beendet sie nach Leerlauf. Statisch gebaut,
# landet in /usr/local/bin des App-Abbilds (das Claude-Helfer-Abbild baut darauf auf und erbt es).
FROM golang:1.23-bookworm AS bei-bedarf
WORKDIR /b
COPY scheeren/bei-bedarf/ .
RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /bei-bedarf .

FROM node:22-bookworm-slim AS runner
WORKDIR /app
# Sicherheitsupdates des Basis-Images (z. B. perl-base, Trivy-Befund 11.10.2026). Docker cached diesen
# Schritt: neu ausgefuehrt wird er erst, wenn sich der Grundbaustein aendert (das woechentliche
# Image-Auto-Update auf dem Server baut dann neu) oder bei --no-cache.
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
  && apt-get install -y --no-install-recommends openssl && rm -rf /var/lib/apt/lists/*
ENV NODE_ENV=production NEXT_TELEMETRY_DISABLED=1
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/.next ./.next
# Vorkompilierte Server-Dienste (dist/start.cjs mit ROLLEN=web,mcp,assistent; dist/mcp-http.cjs,
# dist/assistent.cjs, dist/fenster-assistent.cjs, dist/altbestand-leser.cjs, stdio-MCP-Server …).
COPY --from=build /app/dist ./dist
COPY --from=bei-bedarf /bei-bedarf /usr/local/bin/bei-bedarf
# src/ bleibt im Abbild: Verwaltungsskripte (scheeren/*.ts) laufen weiter per tsx aus den Quellen,
# src/api/openapi.ts liest src/app/api/v1 zur Laufzeit, und AGPL-Nutzer sehen die Quellen.
COPY --from=build /app/src ./src
COPY --from=build /app/public ./public
COPY --from=build /app/prisma ./prisma
# Fix-Welle (Blocking 3): src/app/api/v1/openapi.json/route.ts liest die Datei zur
# Laufzeit relativ zu process.cwd() (`path.join(process.cwd(), "openapi", "openapi.json")`)
# — ohne diese Zeile fehlte das Verzeichnis in der runner-Stage komplett, /api/docs und
# GET /api/v1/openapi.json warfen ENOENT -> 500 auf jeder Produktivinstanz.
COPY --from=build /app/openapi ./openapi
# Task 6 (Phase 14a): pdfkit registriert die vier Liberation-Sans-Schnitte fuer den
# PDF/A-3b-Modus zur Laufzeit aus assets/fonts/ (src/lib/pdf/fonts.ts liest relativ zu
# process.cwd()) — ohne diese Zeile fehlten die Schriften in der runner-Stage komplett.
COPY --from=build /app/assets ./assets
COPY --from=build /app/package.json ./package.json
COPY --from=build /app/next.config.ts ./next.config.ts
COPY --from=build /app/tsconfig.json ./tsconfig.json
COPY --from=build /app/prisma.config.ts ./prisma.config.ts
COPY --from=build /app/prisma.postgres.config.ts ./prisma.postgres.config.ts
COPY --from=build /app/scripts ./scripts
# Verwaltungsskripte (firma.ts, adminkonto.ts …) fuer Server-Instanzen: per
# `docker compose exec -T app node_modules/.bin/tsx scheeren/<skript>.ts` aufrufbar (kurzlebig, bleibt tsx).
COPY --from=build /app/scheeren ./scheeren
COPY --from=build /tmp/quellcode.tar.gz ./quellcode/quellcode.tar.gz
EXPOSE 3000
CMD ["sh", "./scripts/docker-entrypoint.sh"]
