# syntax=docker/dockerfile:1

##############
# Base Image #
##############
FROM python:3.13-slim-bookworm AS base

# Install system dependencies in a dedicated layer (with BuildKit apt cache mounts)
RUN --mount=type=cache,id=apt-cache,target=/var/cache/apt \
    --mount=type=cache,id=apt-lists,target=/var/lib/apt/lists \
    rm -f /etc/apt/apt.conf.d/docker-clean && \
    echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
        gcc \
        g++ \
        python3-dev \
        build-essential

COPY --from=ghcr.io/astral-sh/uv:0.9.24 /uv /uvx /usr/local/bin/

ENV UV_LINK_MODE=copy \
    UV_PYTHON_DOWNLOADS=never \
    UV_PROJECT_ENVIRONMENT=/usr/local

#########
# Build #
#########
FROM base AS builder

ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

WORKDIR /app

# Copy dependency files first for better layer caching
COPY pyproject.toml uv.lock ./

# Install dependencies with aggressive caching
RUN --mount=type=cache,target=/root/.cache/uv \
    uv sync --locked --no-install-project --no-dev --no-group cicd

###########
# Runtime #
###########
FROM python:3.13-slim-bookworm AS runtime

ARG ENV_APP_NAME
ARG ENV_VERSION
ARG ENV_HASH

ENV APP_NAME=$ENV_APP_NAME \
    VERSION=$ENV_VERSION \
    HASH=$ENV_HASH \
    PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

WORKDIR /app

# Copy Python packages from builder (excluding uv itself and build tools)
COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin

# Remove uv from runtime to keep image small
RUN rm -f /usr/local/bin/uv /usr/local/bin/uvx

# App code last for better layer reuse
COPY src /app/src/
COPY alembic.ini /app/
COPY alembic /app/alembic/
COPY docker-entrypoint.sh /app/
RUN chmod +x /app/docker-entrypoint.sh

ENTRYPOINT ["/app/docker-entrypoint.sh"]
