# Standalone backend Dockerfile (when building from backend/ context directly)
# For CapRover, use the root-level Dockerfile.backend instead.
# This is for: docker build -t thegrind-api -f backend/Dockerfile .
# (run from repo root)

FROM node:20-alpine AS builder

RUN apk add --no-cache libc6-compat openssl python3 make g++

WORKDIR /build

COPY shared/package.json ./shared/
COPY shared/tsconfig.json ./shared/
COPY shared/src/ ./shared/src/

COPY prisma/ ./prisma/

# Merge schemas
RUN cp prisma/schema.prisma prisma/merged.prisma && \
    for f in prisma/schema-*.prisma; do \
      [ -f "$f" ] && sed '/^datasource /,/^}/d; /^generator /,/^}/d' "$f" >> prisma/merged.prisma; \
    done

COPY backend/package*.json ./backend/
COPY backend/nest-cli.json ./backend/
COPY backend/tsconfig*.json ./backend/

WORKDIR /build/backend
RUN npm install --legacy-peer-deps

COPY backend/src/ ./src/
COPY backend/routes/ ./routes/ 2>/dev/null || true
COPY backend/services/ ./services/ 2>/dev/null || true

RUN mkdir -p prisma && cp /build/prisma/merged.prisma ./prisma/schema.prisma
RUN cp /build/prisma/*.prisma ./prisma/ 2>/dev/null || true
RUN npx prisma generate --schema=./prisma/schema.prisma
RUN npm run build
RUN npm prune --production --legacy-peer-deps 2>/dev/null || true

FROM node:20-alpine
RUN apk add --no-cache libc6-compat openssl tini
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /build/backend/dist ./dist
COPY --from=builder /build/backend/node_modules ./node_modules
COPY --from=builder /build/backend/package.json ./package.json
COPY --from=builder /build/backend/prisma ./prisma
EXPOSE 3001
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["sh", "-c", "npx prisma db push --schema=./prisma/schema.prisma --skip-generate --accept-data-loss 2>&1 || true; node dist/main.js"]