ARG DEPLOY_DIR=/opt/openmensa-parsers
ARG USERNAME=flaskd
ARG LISTEN_PORT=3080


### Shared base container
FROM python:3.13-slim AS basesys
ARG DEPLOY_DIR
ARG USERNAME

# Install dependencies
RUN pip install --no-cache-dir uv

# Add app user
RUN adduser --disabled-password ${USERNAME}

# Create app folder
RUN mkdir -p ${DEPLOY_DIR}

# Enable local venv
ENV PIPENV_VENV_IN_PROJECT=1

# Switch to app folder
WORKDIR ${DEPLOY_DIR}

# Copy app folder contents
COPY openmensa_parsers/ ./openmensa_parsers
COPY tests ./tests
COPY Makefile .
COPY README.md .
COPY pyproject.toml .
COPY uv.lock .

# Apply app user to app folder
RUN chown -R ${USERNAME} .

# Prepare environment
USER ${USERNAME}


### Build & test container
FROM basesys AS buildsys
ARG DEPLOY_DIR
ARG USERNAME

# Install required build dependencies
USER root
RUN apt-get update && apt-get install -y build-essential python3-dev

# Install environment
USER ${USERNAME}
RUN uv sync --frozen --extra dev

# Run tests
RUN make test

# Clean up test environment
RUN rm -rf .venv
RUN rm -rf ./tests ./Makefile

# Install production environment
RUN uv sync --frozen --no-dev


### Production container

FROM basesys
ARG DEPLOY_DIR
ARG LISTEN_PORT
ARG USERNAME

# Install dependencies
USER root
RUN apt-get update && apt-get install -y curl libpython3.13

# Copy built app
USER ${USERNAME}
COPY --from=buildsys ${DEPLOY_DIR}/.venv ${DEPLOY_DIR}/.venv
WORKDIR ${DEPLOY_DIR}

# Prepare runtime environment variables
ENV LISTEN_PORT=${LISTEN_PORT}
ENV LISTEN=0.0.0.0:${LISTEN_PORT}

EXPOSE ${LISTEN_PORT}
CMD ["sh", "-c", "uv run uwsgi --master --http11-socket \"$LISTEN\" --plugins python --protocol uwsgi --wsgi openmensa_parsers.views:app --virtualenv ./.venv"]

HEALTHCHECK --interval=15s --timeout=3s CMD curl -f http://127.0.0.1:$LISTEN_PORT/health_check || exit 1
