# build stage
FROM python:3.12-slim-bookworm as BUILDER

# set environment variables
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=ON \
    PIP_DEFAULT_TIMEOUT=100 \
    DEBIAN_FRONTEND=noninteractive \
    POETRY_HOME=/etc/poetry \
    POETRY_VERSION=1.7.1 \
    POETRY_VIRTUALENVS_IN_PROJECT=1 \
    POETRY_VIRTUALENVS_CREATE=1 \
    POETRY_NO_INTERACTION=1 \
    POETRY_CACHE_DIR=/tmp/poetry_cache \
    APP_HOME=/home/app

# update system
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    && apt-get clean

# install poetry
RUN curl -sSL https://install.python-poetry.org | python3 -
ENV PATH="${POETRY_HOME}/bin:$PATH"

# install runtime dependencies
WORKDIR ${APP_HOME}
COPY ../poetry.lock ../pyproject.toml ./
RUN --mount=type=cache,target=${POETRY_CACHE_DIR} poetry install \
    --with shared,web_ui

# final stage
FROM python:3.12-slim-bookworm

# copy virtualenv made by poetry
ENV APP_HOME=/home/app \
    VIRTUAL_ENV=/home/app/.venv
COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"

# create home directory and app user
RUN mkdir -p /home/app && \
    addgroup --system app && \
    adduser --system --group app

# add code while changing ownership
WORKDIR $APP_HOME
COPY --chown=app:app ../shared ./shared
COPY --chown=app:app ./src ./src

# change to the app user
USER app

ENTRYPOINT [ "gunicorn", "src.main:server", "-b", "0.0.0.0:8050" ]
