# Get postgreSQL client
FROM dhi.io/postgres:18.1-debian13-dev AS postgres

# Get diamond aligner
FROM docker.io/buchfink/diamond:version2.1.24 AS diamond

# Get bun
FROM dhi.io/bun:1-debian13-dev AS bun

# Builder and development
FROM dhi.io/python:3.14.8-debian13-dev AS dev

# Install dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl=8.14.* \
    dpkg-dev=1.22.* \
    git=1:2.47.* \
    && rm -rf /var/lib/apt/lists/*

# Copy tools and libraries
COPY --from=bun /usr/local/bin/bun* /usr/bin/
COPY --from=diamond /usr/local/bin/diamond /usr/bin/
COPY --from=postgres /opt/postgresql/18/bin/* /usr/bin/
COPY --from=postgres /opt/postgresql/18/lib/libpq.so* /usr/lib/
RUN arch="$(dpkg-architecture -qDEB_HOST_MULTIARCH)" && \
    cp -a /usr/lib/${arch}/libpcre2* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libselinux* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libbrotlicommon* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libbrotlidec* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libcom_err* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libgnutls* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libgssapi_krb5* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libhogweed* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libidn2* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libk5crypto* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libkeyutils* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libkrb5* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libkrb5support* /usr/lib/ && \
    cp -a /usr/lib/${arch}/liblber* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libldap* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libnettle* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libnghttp2* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libnghttp3* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libp11-kit* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libpsl* /usr/lib/ && \
    cp -a /usr/lib/${arch}/librtmp* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libsasl2* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libssh2* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libtasn1* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libunistring* /usr/lib/ && \
    cp -a /usr/lib/${arch}/libcurl* /usr/lib/ && \
    mv /usr/lib/libpq.so* /usr/lib/${arch}/ && \
    ldconfig

WORKDIR /usr/src/app

# Copy only dependency manifests first so pip and playwright layers stay
# cached when app code (or the Dockerfile itself) changes
COPY --chown=nonroot:nonroot pyproject.toml README.md LICENSE ./

# Install Python dependencies to virtual environment
ARG DJANGO_DEPENDENCIES=".[dev,test]"
ENV DJANGO_DEPENDENCIES=${DJANGO_DEPENDENCIES}
RUN python -m venv /opt/python/
ENV PATH="/opt/python/bin:$PATH"
RUN pip install ${DJANGO_DEPENDENCIES} --no-cache-dir .

# Copy application folder
COPY --chown=nonroot:nonroot . .

# Production image
FROM dhi.io/python:3.14.8-debian13 AS prod
LABEL maintainer="Biodiversity Cell Atlas <bca@biodiversitycellatlas.org>" \
    description="Biodiversity Cell Atlas website and data portal"
USER nonroot

# Copy application folder
WORKDIR /usr/src/app
COPY --from=dev --chown=nonroot:nonroot /usr/src/app/ .

# Copy binaries and dependencies from other container images
COPY --from=bun /usr/local/bin/bun* /usr/bin/
COPY --from=diamond /usr/local/bin/diamond /usr/bin/
COPY --from=dev /usr/bin/bash /usr/bin/
COPY --from=dev /usr/bin/chmod /usr/bin/
COPY --from=dev /usr/bin/find /usr/bin/
COPY --from=dev /usr/bin/git /usr/bin/
COPY --from=dev /usr/bin/grep /usr/bin/
COPY --from=dev /usr/bin/mkdir /usr/bin/
COPY --from=dev /usr/bin/sh /usr/bin/
COPY --from=dev /usr/lib/libcom_err* /usr/lib/
COPY --from=dev /usr/lib/libgssapi_krb5* /usr/lib/
COPY --from=dev /usr/lib/libk5crypto* /usr/lib/
COPY --from=dev /usr/lib/libkeyutils* /usr/lib/
COPY --from=dev /usr/lib/libkrb5* /usr/lib/
COPY --from=dev /usr/lib/libkrb5support* /usr/lib/
COPY --from=dev /usr/lib/liblber* /usr/lib/
COPY --from=dev /usr/lib/libldap* /usr/lib/
COPY --from=dev /usr/lib/libpcre2* /usr/lib/
COPY --from=dev /usr/lib/libsasl2* /usr/lib/
COPY --from=dev /usr/lib/libselinux* /usr/lib/

# Copy Python packages from virtual environment
COPY --from=dev /opt/python/ /opt/python/
ENV VIRTUAL_ENV=/opt/python/
ENV PATH="/opt/python/bin:$PATH"

SHELL ["/usr/bin/bash", "-o", "pipefail", "-c"]
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=5 \
    CMD python scripts/healthcheck.py
EXPOSE 8000
CMD ["gunicorn", "config.wsgi", "--bind", "0.0.0.0:8000"]
