# ============================================================================
# Connexa Backend — image de production (build multi-étapes)
# ============================================================================

# --- Étape 1 : build -------------------------------------------------------
FROM node:20-alpine AS builder

WORKDIR /app

# Dépendances système requises par Prisma et Sharp
RUN apk add --no-cache openssl

COPY package*.json ./
RUN npm ci

COPY prisma ./prisma
RUN npx prisma generate

COPY tsconfig*.json nest-cli.json ./
COPY src ./src
RUN npm run build

# Élague les dépendances de dev pour l'image finale
RUN npm prune --omit=dev

# --- Étape 2 : runtime -----------------------------------------------------
FROM node:20-alpine AS runner

WORKDIR /app
ENV NODE_ENV=production

# openssl+wget (santé/prisma) + client Docker pour l'Ops Center (services,
# logs, restart via le daemon — socket monté :ro par compose).
# Le socket reste un privilège fort : GID 113 = groupe docker de l'hôte,
# et l'API borne chaque appel (allowlist, execFile sans shell, audit).
# Sans le bon GID, le CLI échoue proprement (permission refusée).
ARG DOCKER_GID=113
RUN apk add --no-cache openssl wget docker-cli docker-cli-compose \
  && (addgroup -g ${DOCKER_GID} docker 2>/dev/null || addgroup docker 2>/dev/null || true) \
  && adduser node docker 2>/dev/null || true

# Copie des artefacts depuis l'étape de build
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
COPY package*.json ./
# Catalogue mini-dramas (snapshot JSON lu au runtime)
COPY data ./data

# Répertoire des uploads (monté en volume en production)
RUN mkdir -p /app/uploads && chown -R node:node /app

USER node

EXPOSE 3001

# Applique les migrations puis démarre l'API
CMD ["sh", "-c", "npx prisma migrate deploy && node dist/main.js"]
