FROM node:24-bookworm-slim AS node_dependencies

WORKDIR /node-app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev --legacy-peer-deps

FROM python:3.12-slim-bookworm AS application

LABEL org.opencontainers.image.title="Learnin' Man" \
      org.opencontainers.image.description="A family-friendly browser game for learning basic machine-learning concepts" \
      org.opencontainers.image.version="0.25.0" \
      org.opencontainers.image.licenses="CC0-1.0"

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    LEARNIN_MAN_DATA_DIR=/data \
    LEARNIN_MAN_LOG_DIR=/logs \
    LEARNIN_MAN_STATIC_DIR=/app/static \
    LEARNIN_MAN_TRAINER=/app/trainer/ppo-worker.mjs \
    LEARNIN_MAN_ALLOWED_ORIGIN=http://localhost:8080

WORKDIR /app

COPY requirements.txt ./
RUN python -m pip install --no-cache-dir -r requirements.txt

COPY app ./app
COPY static ./static
COPY trainer ./trainer
COPY --from=node_dependencies /usr/local/bin/node /usr/local/bin/node
COPY --from=node_dependencies /node-app/node_modules ./node_modules
COPY --from=node_dependencies /node-app/node_modules/planck/dist/planck.mjs ./static/vendor/planck.mjs

RUN groupadd --gid 10001 learninman \
    && useradd --uid 10001 --gid 10001 --create-home --home-dir /home/learninman learninman \
    && mkdir -p /data /logs \
    && chown -R learninman:learninman /data /logs

FROM application AS test

COPY requirements-dev.txt ./
RUN python -m pip install --no-cache-dir -r requirements-dev.txt
COPY package.json package-lock.json ./
COPY tests ./tests
RUN python -m pytest -q \
    && node --test tests/js/*.test.mjs

FROM application AS runtime

USER learninman

EXPOSE 8080

HEALTHCHECK --interval=15s --timeout=5s --start-period=20s --retries=4 \
  CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/api/health', timeout=3)"

ENTRYPOINT []
CMD ["python", "-m", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080", "--no-access-log"]
