ARG NODE_BASE=node:24-alpine@sha256:a0b9bf06e4e6193cf7a0f58816cc935ff8c2a908f81e6f1a95432d679c54fbfd
ARG NPM_REGISTRY=https://mirrors.cloud.tencent.com/npm
ARG MIRANNOT_OPENDAW_BUILD_PROFILE=disabled
ARG MIRANNOT_SOURCE_CODE_URL=
ARG MIRANNOT_SOURCE_CODE_REVISION=
ARG MIRANNOT_RELEASE_CHANNEL=development

FROM ${NODE_BASE} AS dependencies

ARG NPM_REGISTRY
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
ENV COREPACK_NPM_REGISTRY=$NPM_REGISTRY
ENV npm_config_registry=$NPM_REGISTRY
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@10.30.3 --activate
COPY apps/web/package.json apps/web/pnpm-lock.yaml ./
RUN --mount=type=cache,id=mirannot-pnpm,target=/pnpm/store,sharing=locked \
    pnpm install --frozen-lockfile --store-dir /pnpm/store

FROM ${NODE_BASE} AS builder

ARG NPM_REGISTRY
ARG MIRANNOT_OPENDAW_BUILD_PROFILE
ARG MIRANNOT_RELEASE_CHANNEL
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
ENV COREPACK_NPM_REGISTRY=$NPM_REGISTRY
ENV npm_config_registry=$NPM_REGISTRY
ENV NEXT_TELEMETRY_DISABLED=1
WORKDIR /workspace/apps/web
RUN corepack enable && corepack prepare pnpm@10.30.3 --activate
COPY --from=dependencies /app/node_modules ./node_modules
COPY apps/web ./
COPY LICENSE THIRD_PARTY_NOTICES.md /workspace/
COPY LICENSES /workspace/LICENSES
RUN --mount=type=cache,id=mirannot-next,target=/workspace/apps/web/.next/cache,sharing=locked \
    case "$MIRANNOT_RELEASE_CHANNEL:$MIRANNOT_OPENDAW_BUILD_PROFILE" in \
      development:disabled|development:structure-transport|production:disabled|production:structure-transport|acceptance-candidate:structure-transport) ;; \
      *) echo "invalid MIRANNOT release-channel/openDAW-profile combination" >&2; exit 64 ;; \
    esac && \
    case "$MIRANNOT_OPENDAW_BUILD_PROFILE" in \
      disabled) \
        MIRANNOT_RELEASE_CHANNEL="$MIRANNOT_RELEASE_CHANNEL" \
        MIRANNOT_DEFER_SOURCE_BINDING=1 \
        pnpm build ;; \
      structure-transport) \
        NEXT_PUBLIC_MIRANNOT_OPENDAW_SPIKE_ENABLED=1 \
        NEXT_PUBLIC_MIRANNOT_OPENDAW_STRUCTURE_EDIT_ENABLED=1 \
        NEXT_PUBLIC_MIRANNOT_OPENDAW_STRUCTURE_TRANSPORT_ENABLED=1 \
        MIRANNOT_RELEASE_CHANNEL="$MIRANNOT_RELEASE_CHANNEL" \
        MIRANNOT_DEFER_SOURCE_BINDING=1 \
        pnpm build ;; \
      *) echo "invalid MIRANNOT_OPENDAW_BUILD_PROFILE" >&2; exit 64 ;; \
    esac
FROM builder AS source

ARG MIRANNOT_SOURCE_CODE_URL
ARG MIRANNOT_SOURCE_CODE_REVISION
ARG MIRANNOT_RELEASE_CHANNEL
ARG MIRANNOT_OPENDAW_BUILD_PROFILE
RUN node scripts/validate-source-binding.mjs
COPY . /workspace/source
RUN if [ -n "$MIRANNOT_SOURCE_CODE_REVISION" ]; then \
      node scripts/package-corresponding-source.mjs \
        /workspace/source \
        /workspace/apps/web/public/legal \
        "$MIRANNOT_SOURCE_CODE_REVISION"; \
    fi

FROM ${NODE_BASE} AS runtime

ARG NODE_BASE
ARG MIRANNOT_OPENDAW_BUILD_PROFILE
ARG MIRANNOT_SOURCE_CODE_URL
ARG MIRANNOT_SOURCE_CODE_REVISION
ARG MIRANNOT_RELEASE_CHANNEL
LABEL org.opencontainers.image.base.name="${NODE_BASE}"
LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later"
LABEL org.opencontainers.image.revision="${MIRANNOT_SOURCE_CODE_REVISION}"
LABEL org.opencontainers.image.source="${MIRANNOT_SOURCE_CODE_URL}"
LABEL org.mirannot.opendaw.profile="${MIRANNOT_OPENDAW_BUILD_PROFILE}"
LABEL org.mirannot.release.channel="${MIRANNOT_RELEASE_CHANNEL}"

ENV MIRANNOT_SOURCE_CODE_URL=${MIRANNOT_SOURCE_CODE_URL}
ENV MIRANNOT_SOURCE_CODE_REVISION=${MIRANNOT_SOURCE_CODE_REVISION}
ENV MIRANNOT_RELEASE_CHANNEL=${MIRANNOT_RELEASE_CHANNEL}
ENV MIRANNOT_OPENDAW_BUILD_PROFILE=${MIRANNOT_OPENDAW_BUILD_PROFILE}
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV HOSTNAME=0.0.0.0
ENV PORT=3000
WORKDIR /app
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/.next/static ./.next/static
COPY --from=source --chown=nextjs:nodejs /workspace/apps/web/public ./public
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/content/wiki-examples ./content/wiki-examples
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/content/wiki-media ./content/wiki-media
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/content/wiki-rights ./content/wiki-rights
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/content/wiki-standards.generated.json ./content/wiki-standards.generated.json
COPY --from=builder --chown=nextjs:nodejs /workspace/apps/web/content/wiki-standards.lock.json ./content/wiki-standards.lock.json
COPY --chown=nextjs:nodejs apps/web/pnpm-lock.yaml /usr/local/share/mirannot/locks/pnpm-lock.yaml
COPY --chown=nextjs:nodejs LICENSE THIRD_PARTY_NOTICES.md /usr/local/share/licenses/mirannot/
COPY --chown=nextjs:nodejs LICENSES /usr/local/share/licenses/mirannot/third-party/
COPY --chown=nextjs:nodejs apps/web/scripts/validate-source-binding.mjs ./validate-source-binding.mjs
USER nextjs
EXPOSE 3000
CMD ["sh", "-c", "node validate-source-binding.mjs && exec node server.js"]
