# ===============================================================
# STAGE 1: BASE
# ===============================================================
FROM node:20-slim AS base

ENV NODE_ENV=production
WORKDIR /app

RUN corepack enable && corepack prepare pnpm@9.15.4 --activate
ENV HUSKY=0


# ===============================================================
# STAGE 2: PRUNER — minimal monorepo subset
# ===============================================================
FROM base AS pruner

WORKDIR /app
COPY . .

# Generate pruned workspace
RUN pnpm dlx turbo prune @workspace/outbox-worker --docker


# ===============================================================
# STAGE 2.5: DEVELOPMENT — source code + dev deps + hot reload
# ===============================================================
FROM base AS development

# Install OpenSSL (required by Prisma) and procps (for optional process checks)
RUN apt-get update -y && apt-get install -y openssl procps build-essential && rm -rf /var/lib/apt/lists/*

# Copy pruned workspace
COPY --from=pruner /app/out/json/ ./
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/full/ ./

# Stub DB for Prisma generation if needed during install
ENV DATABASE_URL="postgresql://stub:stub@localhost:5432/stub?schema=public"

# CRITICAL: Unset NODE_ENV so pnpm installs devDependencies
ENV NODE_ENV=

# Use hoisted linker
RUN echo "node-linker=hoisted" > .npmrc

# Install ALL dependencies (including devDependencies)
RUN pnpm install --frozen-lockfile

WORKDIR /app/apps/outbox-worker
CMD ["pnpm", "dev"]


# ===============================================================
# STAGE 3: BUILDER
# ===============================================================
FROM base AS builder

RUN apt-get update -y && apt-get install -y openssl build-essential && rm -rf /var/lib/apt/lists/*

COPY --from=pruner /app/out/json/ ./
COPY --from=pruner /app/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY --from=pruner /app/out/full/ ./

ENV DATABASE_URL="postgresql://stub:stub@localhost:5432/stub?schema=public"

ENV NODE_ENV=

RUN echo "node-linker=hoisted" > .npmrc

RUN pnpm install

RUN pnpm turbo build --filter=@workspace/outbox-worker...

WORKDIR /app/apps/outbox-worker
RUN test -f dist/index.js


# ===============================================================
# STAGE 4: PRODUCTION
# ===============================================================
FROM node:20-slim AS production

ENV NODE_ENV=production
WORKDIR /app

RUN apt-get update -y && apt-get install -y openssl procps ca-certificates && rm -rf /var/lib/apt/lists/*

# Create non-root user (enterprise standard)
# RUN groupadd -r nodejs && useradd -r -g nodejs nodejs
# USER nodejs

COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/packages ./packages
COPY --from=builder /app/apps/outbox-worker ./apps/outbox-worker

WORKDIR /app/apps/outbox-worker

# Healthcheck (Process Liveness)
HEALTHCHECK --interval=30s --timeout=5s \
    CMD pgrep -f "node dist/index.js" || exit 1

CMD ["node", "dist/index.js"]
