# Image unique pour l'API et le worker : même code, même base de sites, deux
# commandes. Deux images divergeraient à la première mise à jour oubliée.
#
# Construction en deux étapes. L'étape « build » installe d'abord les seules
# dépendances, à partir de pyproject.toml : cette couche n'est refaite que si
# les dépendances changent, pas à chaque modification de code. Elle tire Maigret
# et sa base de 3 300 sites, c'est la plus coûteuse du projet.

FROM python:3.12-slim-bookworm AS base

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    TZ=Europe/Paris

# tzdata : l'image slim n'embarque aucune base de fuseaux, la variable TZ
# resterait sans effet et tous les horodatages sortiraient en UTC.
RUN apt-get update \
 && apt-get install -y --no-install-recommends tzdata ca-certificates curl \
 && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
 && rm -rf /var/lib/apt/lists/*

# ------------------------------------------------------------------- build
FROM base AS build

RUN apt-get update \
 && apt-get install -y --no-install-recommends build-essential \
 && rm -rf /var/lib/apt/lists/*

WORKDIR /build

# 1. Dépendances seules. La liste est extraite de pyproject.toml pour rester la
#    source unique de vérité — pas de requirements.txt parallèle qui dériverait.
#    Commande sur une seule ligne : un heredoc imbriqué ici serait interprété
#    par l'analyseur du Dockerfile, pas par le shell.
COPY pyproject.toml ./
RUN python -c "import tomllib,pathlib;print(chr(10).join(tomllib.loads(pathlib.Path('pyproject.toml').read_text())['project']['dependencies']))" > /tmp/requirements.txt \
 && cat /tmp/requirements.txt \
 && pip install --prefix=/opt/limier --no-warn-script-location -r /tmp/requirements.txt

# 2. Le paquet lui-même, sans ses dépendances déjà présentes. Installe aussi les
#    commandes limier-api et limier-worker.
COPY src ./src
RUN pip install --prefix=/opt/limier --no-warn-script-location --no-deps .

# ----------------------------------------------------------------- runtime
FROM base AS runtime

# /opt/limier/lib/python3.12/site-packages devient
# /usr/local/lib/python3.12/site-packages, l'emplacement standard de l'image.
COPY --from=build /opt/limier /usr/local

WORKDIR /app
# alembic.ini et migrations/ ne sont pas dans le paquet : ils sont nécessaires
# au runtime pour « alembic upgrade head ».
COPY alembic.ini ./
COPY migrations ./migrations

RUN groupadd -r limier -g 1000 \
 && useradd -r -u 1000 -g limier -d /app -s /sbin/nologin limier \
 && mkdir -p /data/sites \
 && chown -R limier:limier /app /data

USER limier

# Base de sites inscriptible : l'auto-contrôle nocturne y écrit la version
# corrigée. Le paquet Maigret, lui, reste en lecture seule.
ENV LIMIER_SITES_DB_PATH=/data/sites/data.json

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=3 \
  CMD curl -fsS http://127.0.0.1:8000/api/sante || exit 1

CMD ["limier-api"]
