# syntax=docker/dockerfile:1
ARG EMSDK_VERSION=6.0.10
FROM debian:bookworm-slim AS native
RUN apt-get update && apt-get install -y --no-install-recommends build-essential cmake pkg-config python3 libsdl2-dev libsdl2-image-dev zlib1g-dev ffmpeg ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /src
COPY . .
RUN python3 tools/extract_assets.py && cmake -S . -B build/native -DCMAKE_BUILD_TYPE=Release && cmake --build build/native -j4
RUN mkdir -p web/public/audio && cd assets && ../build/native/pop-worker --export-audio /src/web/public/audio
RUN cp web/public/audio/soundmeta.bin assets/soundmeta.bin && python3 tools/compress_audio.py && python3 tools/export_scenes.py && python3 tools/source_archive.py

FROM emscripten/emsdk:${EMSDK_VERSION} AS wasm
WORKDIR /src
COPY --from=native /src/CMakeLists.txt ./
COPY --from=native /src/engine ./engine
COPY --from=native /src/tools ./tools
COPY --from=native /src/vendor ./vendor
COPY --from=native /src/assets ./assets
RUN emcmake cmake -S . -B build/wasm -DCMAKE_BUILD_TYPE=Release && cmake --build build/wasm -j4

FROM node:22-bookworm-slim AS browser
WORKDIR /src/web
COPY web/package*.json ./
RUN npm ci
COPY web/ ./
COPY --from=native /src/web/public/audio ./public/audio
COPY --from=native /src/web/public/source.tar.gz ./public/source.tar.gz
COPY --from=wasm /src/web/public/engine ./public/engine
RUN npm run build

FROM golang:1.26-bookworm AS gateway
WORKDIR /src/server
COPY server/go.* ./
RUN go mod download
COPY server/ ./
RUN CGO_ENABLED=1 go build -trimpath -o /pop-server .

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends libsdl2-2.0-0 libsdl2-image-2.0-0 zlib1g ca-certificates curl && rm -rf /var/lib/apt/lists/* && useradd --uid 10001 --create-home prince && mkdir /data && chown prince:prince /data
WORKDIR /app
COPY --from=native /src/build/native/pop-worker ./pop-worker
COPY --from=native /src/assets ./assets
COPY --from=browser /src/web/dist ./web
COPY --from=gateway /pop-server ./pop-server
COPY tools/container-entrypoint.sh ./entrypoint.sh
USER prince
VOLUME /data
EXPOSE 8080/tcp 50000-50100/udp
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s CMD curl --fail --silent http://127.0.0.1:8080/healthz || exit 1
ENTRYPOINT ["/bin/sh", "/app/entrypoint.sh"]
