# syntax=docker/dockerfile:1.7
# Build multi-stage pour produire une image Next.js standalone slim.
# - deps : install des deps avec lockfile reproductible
# - builder : build Next + génération du standalone output
# - runner : runtime minimal (node:slim + standalone copié)

# ─── deps ───────────────────────────────────────────────────────────────
FROM node:20-bookworm-slim AS deps
WORKDIR /app

# Outils nécessaires à certains modules natifs (better-sqlite3 like).
RUN apt-get update -qq && apt-get install -qq -y --no-install-recommends \
    python3 build-essential ca-certificates \
  && rm -rf /var/lib/apt/lists/*

COPY package.json package-lock.json ./
RUN npm ci --omit=dev --include=optional

# ─── builder ────────────────────────────────────────────────────────────
FROM node:20-bookworm-slim AS builder
WORKDIR /app

RUN apt-get update -qq && apt-get install -qq -y --no-install-recommends \
    python3 build-essential ca-certificates \
  && rm -rf /var/lib/apt/lists/*

# Re-install avec dev deps pour le build (drizzle-kit, tsx, types).
COPY package.json package-lock.json ./
RUN npm ci

# Bust cache à partir d'ici dès que le SHA change (passé en --build-arg).
# Évite les "le code ne se met pas à jour" sans renoncer au cache d'apt
# qui flake régulièrement sur Debian.
ARG BUILD_SHA=dev
RUN echo "Build for $BUILD_SHA"

COPY . .

# Variables nécessaires au build (URL pour metadata, secret pour Auth init).
# Les vraies valeurs sont passées au runtime via docker-compose env_file.
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
# Placeholder — la vraie URL est lue depuis env au runtime.
ENV BETTER_AUTH_URL=https://socialex.pro
ENV BETTER_AUTH_SECRET=build-time-placeholder

RUN npm run build

# ─── runner ─────────────────────────────────────────────────────────────
FROM node:20-bookworm-slim AS runner
WORKDIR /app

# User non-root (uid 1001) pour exécuter Next.
RUN groupadd --system --gid 1001 nodejs \
 && useradd  --system --uid 1001 --gid nodejs nextjs

ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3000
ENV HOSTNAME=0.0.0.0

# Standalone : server.js + minimum vital de node_modules.
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
COPY --from=builder --chown=nextjs:nodejs /app/public ./public

# Migrations Drizzle + scripts (utilisés au lancement par db:migrate prod + seeds).
COPY --from=builder --chown=nextjs:nodejs /app/drizzle ./drizzle
COPY --from=builder --chown=nextjs:nodejs /app/scripts ./scripts
COPY --from=builder --chown=nextjs:nodejs /app/lib ./lib
COPY --from=builder --chown=nextjs:nodejs /app/tsconfig.json ./tsconfig.json
COPY --from=builder --chown=nextjs:nodejs /app/package.json ./package.json
# node_modules complet (incluant devDeps : tsx, esbuild, dotenv) pour
# permettre l'exécution des seeds TypeScript via tsx au runtime.
# Image plus volumineuse mais nécessaire pour les scripts d'init.
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules

# Dossier uploads (monté en volume au compose).
RUN mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads

USER nextjs
EXPOSE 3000

CMD ["node", "server.js"]
