# Build the React UI into static assets.
FROM registry.access.redhat.com/ubi10/nodejs-22 AS frontend-builder

USER root
WORKDIR /frontend

# Cache dependencies separately from frontend source changes.
COPY frontend/package*.json ./
RUN npm ci

COPY frontend/src ./src
COPY frontend/public ./public
COPY frontend/index.html \
     frontend/vite.config.ts \
     frontend/tsconfig.json \
     ./
# Copy
RUN mv ./public/samples/docker_samplePipeline.json ./public/samples/samplePipeline.json
RUN npm run build

# Install Python dependencies before copying application source.
FROM registry.access.redhat.com/ubi9/python-312 AS backend-builder

USER root
WORKDIR /opt/app-root

RUN pip install --no-cache-dir uv

# Cache dependencies separately from backend source changes.
COPY pyproject.toml uv.lock ./
# Default to GPU; use --build-arg COMPUTE_BACKEND=cpu for CPU-only wheels.
ARG COMPUTE_BACKEND=gpu
RUN uv export --locked --no-dev --extra "$COMPUTE_BACKEND" \
        --no-emit-project --format pylock.toml --output-file pylock.toml && \
    uv venv --python /usr/bin/python3.12 /opt/docpipe-venv && \
    uv pip install --python /opt/docpipe-venv/bin/python \
        --no-cache --require-hashes -r pylock.toml

# Run the API and serve the built UI as a non-root user.
FROM registry.access.redhat.com/ubi9/python-312-minimal

USER root
# Native Python extensions need GL, LDAP and OpenMP.
RUN microdnf install -y --nodocs --setopt=install_weak_deps=0 \
        mesa-libGL openldap libgomp && \
    microdnf clean all && \
    useradd -m -u 1000 docpipe

COPY --from=backend-builder --chown=1000:0 /opt/docpipe-venv/ /opt/docpipe-venv/
COPY --chown=1000:0 src/docpipe/ /opt/app-root/src/docpipe/
COPY --from=frontend-builder --chown=1000:0 /frontend/dist /opt/app-root/src/docpipe/api/static/

# Allow runtime downloads and storage writes under the supported data paths.
RUN mkdir -p \
        /opt/app-root/nltk_data \
        /opt/app-root/data \
        /opt/app-root/src/data \
        /data && \
    chown -R docpipe:root \
        /opt/app-root/nltk_data \
        /opt/app-root/data \
        /opt/app-root/src/data \
        /data

WORKDIR /opt/app-root/src
USER docpipe
ENV PYTHONPATH=/opt/app-root/src
ENV VIRTUAL_ENV=/opt/docpipe-venv
ENV PATH=/opt/docpipe-venv/bin:$PATH
ENV DOCPIPE_DATA_PATH=/data

EXPOSE 8080
CMD ["python", "-m", "uvicorn", "docpipe.api.main:app", "--host", "0.0.0.0", "--port", "8080"]
