ARG PYTHON_BASE=python:3.12-slim@sha256:57cd7c3a7a273101a6485ba99423ee568157882804b1124b4dd04266317710de
ARG PYPI_INDEX_URL=https://mirrors.cloud.tencent.com/pypi/simple

FROM ${PYTHON_BASE} AS builder

ARG PYPI_INDEX_URL
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_INDEX_URL=${PYPI_INDEX_URL} \
    SOURCE_DATE_EPOCH=315532800

WORKDIR /build
COPY apps/api/pyproject.toml apps/api/requirements-build.lock ./
RUN --mount=type=cache,id=mirannot-pip,target=/root/.cache/pip,sharing=locked \
    pip install --no-compile --require-hashes \
    -r requirements-build.lock
COPY apps/api/src ./src
RUN pip wheel --no-cache-dir --no-deps --no-build-isolation --wheel-dir /wheels .

FROM ${PYTHON_BASE} AS dependencies

ARG PYTHON_BASE
ARG PYPI_INDEX_URL
LABEL org.opencontainers.image.base.name="${PYTHON_BASE}"
LABEL org.opencontainers.image.licenses="AGPL-3.0-or-later"

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PIP_INDEX_URL=${PYPI_INDEX_URL}

WORKDIR /app
COPY apps/api/requirements-api.lock \
    apps/api/requirements-build.lock \
    apps/api/requirements-worker.lock \
    /usr/local/share/mirannot/locks/
RUN --mount=type=cache,id=mirannot-pip,target=/root/.cache/pip,sharing=locked \
    pip install --no-compile --require-hashes \
    -r /usr/local/share/mirannot/locks/requirements-api.lock
FROM dependencies AS worker-dependencies
RUN --mount=type=cache,id=mirannot-pip,target=/root/.cache/pip,sharing=locked \
    mkdir -p /worker-deps && pip install --no-compile --require-hashes \
    --prefix=/worker-deps -r /usr/local/share/mirannot/locks/requirements-worker.lock

FROM dependencies AS runtime
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir --no-compile --no-deps --no-index /wheels/*.whl \
    && rm -rf /wheels

COPY apps/api/alembic.ini ./
COPY apps/api/migrations ./migrations
COPY apps/api/scripts ./scripts
COPY apps/worker/album_offline_agent.py apps/worker/album_search_relay.py /usr/local/share/mirannot/offline-agent/
COPY apps/worker/offline_pipeline /usr/local/share/mirannot/offline-agent/offline_pipeline
COPY scripts/operations/publish_reaper_download_catalog.py \
    /usr/local/bin/publish_reaper_download_catalog.py
COPY scripts/operations/publish_reaper_client_update.py \
    /usr/local/bin/publish_reaper_client_update.py
COPY apps/reaper-client/scripts/build_internal_portable.py \
    apps/reaper-client/scripts/release_package.py \
    /usr/local/libexec/mirannot-reaper/
COPY apps/reaper-client/scripts/release_package.py \
    /usr/local/bin/release_package.py
COPY apps/reaper-client/resources/ /usr/local/libexec/mirannot-reaper/resources/
COPY packages/annotation-schemas ./packages/annotation-schemas
COPY LICENSE THIRD_PARTY_NOTICES.md /usr/local/share/licenses/mirannot/
COPY LICENSES /usr/local/share/licenses/mirannot/third-party/

EXPOSE 8000

FROM runtime AS worker
COPY --from=worker-dependencies /worker-deps /usr/local
CMD ["python", "-m", "mirannot_api.worker"]

FROM runtime AS api
CMD ["uvicorn", "mirannot_api.main:app", "--host", "0.0.0.0", "--port", "8000"]
