# Nobel Auto Services — Multi-stage Dockerfile

FROM node:20-alpine AS base
RUN npm install -g pnpm@9.12.0

# ─── Builder stage ────────────────────────────────────────────────────────────
FROM base AS builder
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./
COPY packages/shared/package.json ./packages/shared/
COPY packages/db/package.json ./packages/db/
COPY packages/ui/package.json ./packages/ui/
COPY apps/api/package.json ./apps/api/
COPY apps/ops/package.json ./apps/ops/
COPY apps/web/package.json ./apps/web/

RUN pnpm install --frozen-lockfile

COPY . .

# Generate Prisma client
RUN pnpm --filter @nobel/db prisma:generate

# Build API
RUN pnpm --filter @nobel/api build

# Build ops (admin) frontend
RUN pnpm --filter @nobel/ops build

# Build customer web frontend
RUN pnpm --filter @nobel/web build

# ─── API runner ───────────────────────────────────────────────────────────────
# Replicates the pnpm workspace layout so workspace symlinks stay valid, and
# runs the API with tsx: the workspace packages (@nobel/shared, @nobel/db)
# publish TypeScript sources, which plain `node dist/` cannot load.
FROM node:20-alpine AS api-runner
WORKDIR /app

COPY --from=builder /app/package.json /app/pnpm-workspace.yaml ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/packages ./packages
COPY --from=builder /app/apps/api ./apps/api

ENV NODE_ENV=production
EXPOSE 4000
CMD ["sh", "-c", "./packages/db/node_modules/.bin/prisma migrate deploy --schema=./packages/db/prisma/schema.prisma && cd apps/api && ./node_modules/.bin/tsx src/index.ts"]

# ─── Ops (admin) frontend runner — served under /admin/ ───────────────────────
FROM nginx:alpine AS ops-runner
COPY --from=builder /app/apps/ops/dist /usr/share/nginx/html/admin
COPY docker/nginx-spa-admin.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

# ─── Customer web frontend runner — served at / ───────────────────────────────
FROM nginx:alpine AS web-runner
COPY --from=builder /app/apps/web/dist /usr/share/nginx/html
COPY docker/nginx-spa.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
