# syntax=docker/dockerfile:1

FROM python:3.12-slim AS build

COPY --from=ghcr.io/astral-sh/uv:0.12.11 /uv /usr/local/bin/uv

WORKDIR /app

ENV UV_COMPILE_BYTECODE=1 \
    UV_LINK_MODE=copy \
    UV_PROJECT_ENVIRONMENT=/app/.venv \
    UV_PYTHON=/usr/local/bin/python3 \
    UV_PYTHON_DOWNLOADS=never \
    UV_PYTHON_PREFERENCE=only-system

# all, empty for no drivers, or space-separated extra names.
ARG EXTRAS=all

RUN <<'EOF'
set -eu
cat > /usr/local/bin/uv-sync-extras <<'SCRIPT'
#!/bin/sh
set -eu
flags=""
if [ "$EXTRAS" = "all" ]; then
  flags="--all-extras"
else
  for extra in $EXTRAS; do
    flags="$flags --extra $extra"
  done
fi
exec uv sync --frozen --no-dev $flags "$@"
SCRIPT
chmod +x /usr/local/bin/uv-sync-extras
EOF

RUN --mount=type=bind,source=uv.lock,target=uv.lock \
    --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
    --mount=type=cache,target=/root/.cache/uv \
    uv-sync-extras --no-install-project

COPY pyproject.toml uv.lock README.md ./
COPY src src

RUN --mount=type=cache,target=/root/.cache/uv \
    uv-sync-extras --no-editable

FROM python:3.12-slim

RUN groupadd --gid 10001 runtime \
    && useradd --uid 10001 --gid runtime --create-home --shell /usr/sbin/nologin runtime

COPY --from=build --chown=10001:10001 /app/.venv /app/.venv

ENV PATH="/app/.venv/bin:${PATH}" \
    PYTHONUNBUFFERED=1

USER 10001
WORKDIR /home/runtime

ENTRYPOINT ["elementary-runtime"]
CMD ["run"]
