# syntax=docker/dockerfile:1

# ---- base: pnpm-enabled Node ----
FROM node:22-alpine AS base
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
RUN corepack enable
WORKDIR /repo

# ---- build: install workspace, bundle backend (+ core) ----
FROM base AS build
# Manifests first for better layer caching.
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json tsconfig.base.json ./
COPY packages/core/package.json packages/core/package.json
COPY packages/backend/package.json packages/backend/package.json
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
    pnpm install --frozen-lockfile
# Sources.
COPY packages/core packages/core
COPY packages/backend packages/backend
# Bundle backend + core source into packages/backend/dist.
RUN pnpm --filter @altricade/backend build
# Produce a pruned, production-only deployment (dist + migrations + prod node_modules).
RUN pnpm --filter @altricade/backend deploy --prod /app

# ---- dev: hot-reload for local development (used by docker-compose.override.yml) ----
# Inherits the full workspace + dev deps (tsx) from the build stage. Source is
# bind-mounted over this at runtime so edits reload live.
FROM build AS dev
WORKDIR /repo/packages/backend
EXPOSE 4000
CMD ["pnpm", "dev"]

# ---- runtime: slim, non-root ----
FROM base AS runtime
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build --chown=node:node /app /app
USER node
EXPOSE 4000
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
  CMD wget -qO- "http://127.0.0.1:${BACKEND_PORT:-4000}/health" || exit 1
CMD ["node", "dist/server.js"]
