# 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)
RUN npx prisma generate --schema=prisma/schema.postgres.prisma \
  && npx next build

FROM node:22-bookworm-slim AS runner
WORKDIR /app
RUN apt-get update && 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
# Remote-MCP (src/mcp/http/server.ts) laeuft per tsx direkt aus den Quellen im selben
# Image (zweiter Container, anderes CMD) — deshalb das ganze src/ statt nur src/generated.
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 mcp npx tsx scheeren/<skript>.ts` aufrufbar.
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"]
