ARG REPO_URL=docker.io
ARG IMAGE_BUILDER=golang:1.23.0-alpine3.20
ARG IMAGE_RUNNER=alpine:3.20

## --- Builder

FROM ${REPO_URL}/${IMAGE_BUILDER} AS builder
LABEL stage=builder
WORKDIR /build

ARG GOPROXY_URL
ENV GOPROXY=${GOPROXY_URL}
SHELL [ "/bin/sh", "-ec" ]

RUN apk add --no-cache make

COPY go.mod go.sum Makefile ./
COPY cmd/ cmd/
COPY internal/ internal/

ENV GOOS=linux
ENV GOARCH=amd64

RUN cp $(go env GOROOT)/misc/wasm/wasm_exec.js .

RUN make build
RUN make build/wasm

## --- Runner

FROM ${REPO_URL}/${IMAGE_RUNNER}

ARG UID=1337
ARG GID=1337
ENV APPLICATION_HOME=/home/app \
    TARGET_USER=app \
    TARGET_GROUP=app

RUN apk add --no-cache tzdata ; \
    getent group ${GID} || addgroup --gid ${GID} ${TARGET_GROUP} ; \
    adduser -u ${UID} -g ${TARGET_GROUP} -D -S -h ${APPLICATION_HOME} ${TARGET_USER}
WORKDIR ${APPLICATION_HOME}

# Persisted game-data directory (DATA_FILE lives here). A named volume mounted
# at /data inherits this ownership on first use, so the unprivileged app user
# can write the temp-file + rename that repo.go performs.
RUN mkdir -p /data && chown ${TARGET_USER}:${TARGET_GROUP} /data

USER ${TARGET_USER}

COPY --from=builder /tmp/bin/server /usr/bin/server
COPY --from=builder --chown=${TARGET_USER}:${TARGET_GROUP} /tmp/bin/game.wasm    ./
COPY --from=builder --chown=${TARGET_USER}:${TARGET_GROUP} /build/wasm_exec.js   ./
COPY --chown=${TARGET_USER}:${TARGET_GROUP} web/*.html ./

COPY --chown=${TARGET_USER}:${TARGET_GROUP} entrypoint.sh ./

CMD [ "/bin/sh", "/home/app/entrypoint.sh", "/usr/bin/server" ]
