# syntax=docker/dockerfile:1
FROM oven/bun:1.4.0@sha256:5ff609364c049b54eb0ff560ec96319729a972078ef2c755d758f0c6ef89c2d6 AS bun
FROM node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 AS toolchain
COPY --from=bun /usr/local/bin/bun /usr/local/bin/bun
RUN ln -s /usr/local/bin/bun /usr/local/bin/bunx \
    && apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates openssl \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
ENV NEXT_TELEMETRY_DISABLED=1 TURBO_TELEMETRY_DISABLED=1 BUN_CONFIG_MAX_HTTP_REQUESTS=16

FROM toolchain AS dependencies
COPY . .
RUN --mount=type=cache,target=/root/.bun/install/cache \
    bun install --frozen-lockfile --ignore-scripts

FROM dependencies AS workspace
RUN bun run --filter @trycompai/db build \
    && bun run --filter @trycompai/auth build \
    && bun run --filter @trycompai/billing build \
    && bun run --filter @trycompai/company build \
    && bun run --filter @trycompai/email build \
    && bun run --filter @trycompai/integration-platform build

FROM workspace AS api-builder
RUN bun run --filter @trycompai/api build

FROM workspace AS web-builder
ARG COMPONENT=app
ARG PUBLIC_APP_URL=https://compliance.zephior.com
ARG PUBLIC_API_URL=https://api.compliance.zephior.com
ARG PUBLIC_PORTAL_URL=https://employee.compliance.zephior.com
ENV NEXT_PUBLIC_APP_URL=$PUBLIC_APP_URL \
    NEXT_PUBLIC_API_URL=$PUBLIC_API_URL \
    NEXT_PUBLIC_BETTER_AUTH_URL=$PUBLIC_API_URL \
    NEXT_PUBLIC_PORTAL_URL=$PUBLIC_PORTAL_URL \
    NEXT_PUBLIC_SELF_HOSTED=true \
    NEXT_OUTPUT_STANDALONE=true \
    NODE_OPTIONS=--max-old-space-size=8192
RUN cd apps/$COMPONENT \
    && bun run db:generate \
    && SKIP_ENV_VALIDATION=true bunx next build

FROM node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 AS api
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates fontconfig fonts-dejavu-core \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
COPY --from=api-builder --chown=node:node /workspace/node_modules ./node_modules
COPY --from=api-builder --chown=node:node /workspace/packages ./packages
COPY --from=api-builder --chown=node:node /workspace/apps/api/dist ./apps/api/dist
COPY --from=api-builder --chown=node:node /workspace/apps/api/package.json ./apps/api/package.json
COPY --from=api-builder --chown=node:node /workspace/apps/api/node_modules ./apps/api/node_modules
ENV NODE_ENV=production PORT=3333
USER node
WORKDIR /workspace/apps/api
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s \
    CMD node -e "fetch('http://127.0.0.1:3333/v1/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
CMD ["node", "dist/src/main.js"]

FROM api AS maintenance
COPY --from=bun /usr/local/bin/bun /usr/local/bin/bun
WORKDIR /workspace/packages/db
HEALTHCHECK NONE
CMD ["bun", "x", "prisma", "migrate", "deploy"]

FROM node:22-bookworm-slim@sha256:83f487e0a63425e5b4d146fb5e5be574bcbe1b7b843d3ebafdd95eaf7767a7e5 AS web
ARG COMPONENT=app
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
COPY --from=web-builder --chown=node:node /workspace/apps/${COMPONENT}/.next/standalone ./
COPY --from=web-builder --chown=node:node /workspace/apps/${COMPONENT}/.next/static ./apps/${COMPONENT}/.next/static
COPY --from=web-builder --chown=node:node /workspace/apps/${COMPONENT}/public ./apps/${COMPONENT}/public
ENV NODE_ENV=production HOSTNAME=0.0.0.0 PORT=3000 APP_COMPONENT=$COMPONENT
USER node
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s \
    CMD node -e "fetch('http://127.0.0.1:3000/').then(r=>process.exit(r.status<500?0:1)).catch(()=>process.exit(1))"
CMD ["sh", "-c", "exec node apps/$APP_COMPONENT/server.js"]
