# =============================================================================
# File Upload Backend - Production Dockerfile
# Multi-stage build for minimal image size
# =============================================================================

# ---------- Stage 1: Build ----------
FROM node:22-alpine AS builder

# Install pnpm
RUN corepack enable && corepack prepare pnpm@latest --activate

WORKDIR /app

# Copy dependency files first (better Docker layer caching)
COPY package.json pnpm-lock.yaml ./

# Install ALL dependencies (including devDependencies needed for building)
RUN pnpm install --frozen-lockfile --unsafe-perm

# Copy source code, prisma schema, and config files
COPY . .

# prisma generate reads DATABASE_URL for prisma.config.ts (no actual DB connection needed)
ARG DATABASE_URL="postgresql://placeholder:placeholder@localhost:5432/placeholder"
ENV DATABASE_URL=${DATABASE_URL}

# Generate Prisma client
RUN pnpm exec prisma generate

# Compile TypeScript -> dist/
RUN pnpm run build

# Prune devDependencies, keep only production deps
# Also explicitly keep prisma + dotenv (needed at runtime for migrations)
RUN pnpm prune --prod && pnpm add prisma dotenv

# Re-generate Prisma client after prune (prune removes node_modules/.prisma/)
RUN pnpm exec prisma generate

# ---------- Stage 2: Production ----------
FROM node:22-alpine AS production

# Add non-root user for security
RUN addgroup -g 1001 -S nodejs && \
    adduser -S appuser -u 1001

WORKDIR /app

# Copy only production artifacts from builder
COPY --from=builder --chown=appuser:nodejs /app/dist ./dist
COPY --from=builder --chown=appuser:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:nodejs /app/package.json ./
COPY --from=builder --chown=appuser:nodejs /app/prisma ./prisma
COPY --from=builder --chown=appuser:nodejs /app/prisma.config.ts ./

# Set production environment
ENV NODE_ENV=production

# Switch to non-root user
USER appuser

# Expose port (default 3000, overridable via PORT env var)
EXPOSE 3030

# Start: run migrations, then start the server
CMD ["sh", "-c", "./node_modules/.bin/prisma migrate deploy && node dist/index.js"]
