# Image de base des jobs CI lourds — construite SUR CHAQUE machine à runner.
#
# Elle cuit une fois pour toutes ce que chaque exécution de CI réinstallait.
# Mesures du dépôt kadans (run 628, 2026-07-29, runner ARM64 2 vCPU / 3 Gio) :
#
#   npm install -g bun                          →    8,6 s par run
#   playwright install --with-deps chromium     →  104,0 s par run  (apt-get)
#                                                  ────────
#                                                   112,6 s jetées à CHAQUE run,
#                                                   sur le job du chemin critique
#
# Le cache `actions/cache` ne peut rien contre ces 104 s : il couvre le
# NAVIGATEUR (299 Mo déjà mis en cache), pas ses dépendances SYSTÈME —
# `--with-deps` relance `apt-get` quoi qu'il arrive.
#
# ⚠ ON HÉRITE DE L'IMAGE DE RUNNER MAISON, ET C'EST ESSENTIEL : elle porte le
# certificat de la CA interne (step-ca). Une image repartant de `node:20-bookworm`
# ne ferait pas confiance à gitea.arcodange.lab, et tout job qui lui parle
# échouerait en TLS.
ARG CI_BASE_FROM=gitea.arcodange.lab/arcodange-org/runner-images:ubuntu-latest-ca
FROM ${CI_BASE_FROM}

ARG BUN_VERSION=1.3.14
ARG PLAYWRIGHT_VERSION=1.61.1

ENV DEBIAN_FRONTEND=noninteractive

# Chemin des navigateurs, figé et hors du HOME : un job qui tourne sous un autre
# utilisateur doit les retrouver.
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright

# ══════════════════════════════════════════════════════════════════════════
# ⚠ TROIS `RUN` SÉPARÉS, ET C'EST LE POINT DE CONCEPTION DE CE FICHIER.
#
# La première version faisait `npm i -g bun` puis `playwright install --with-deps`
# en deux couches, dont une de 1,36 Go — irrecevable par le registre. Ici, même
# si l'on décidait un jour de pousser cette image, chaque couche reste du même
# ordre de grandeur que celles qui passent déjà (261 Mo pour la plus grosse de
# `runner-images:ubuntu-latest-ca`).
#
# Ne pas fusionner ces `RUN` pour « gagner une couche » : le gain serait nul et
# la couche redeviendrait impossible à transporter.
# ══════════════════════════════════════════════════════════════════════════

# 0. NODE 20, ET C'EST OBLIGATOIRE — pas une préférence.
#
# ⚠ `runner-images:ubuntu-latest-ca` livre **Node 18** (v18.20.8, vérifié en le
# lançant). Or `nuxi` importe `node:util.styleText`, ABSENT de Node 18 : c'est la
# raison d'être du `container: node:20-bookworm` que la CI de kadans portait, et
# que son `CLAUDE.md` interdit explicitement de retirer.
#
# Sans cette couche, une CI qui bascule sur cette image casse au premier `nuxt
# build` — et le message parle d'un import introuvable, pas d'une version de Node.
# Le défaut a été trouvé en CONSTRUISANT l'image puis en lançant `node --version`
# dedans ; aucune lecture du Dockerfile ne l'aurait montré.
# ⚠⚠ ET INSTALLER NE SUFFIT PAS — il faut aussi que `node` RÉSOLVE vers le bon.
# Constaté en lançant l'image : après l'installation de Node 20 par apt,
# `node --version` rendait toujours **v18.20.8**, parce que l'image de base
# précuit un node pour le toolcache d'act et le met EN TÊTE du PATH :
#
#   which node → /opt/acttoolcache/node/18.20.8/arm64/bin/node
#   PATH       → /opt/acttoolcache/node/18.20.8/arm64/bin:/usr/local/sbin:/usr/bin:…
#   /usr/bin/node --version → v20.20.2   ← le bon, mais il PERD
#
# On retire donc l'entrée 18 du toolcache : le segment de PATH devient inexistant
# (inoffensif) et la résolution retombe sur /usr/bin/node, en 20.
# ⚠ Conséquence assumée : `actions/setup-node` ne trouvera plus de Node 18
# préinstallé dans cette image. Aucun workflow de kadans ne l'utilise, et l'image
# n'est servie qu'aux jobs qui DEMANDENT le label `ci-node-playwright`.
ARG NODE_MAJOR=20
RUN curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" -o /tmp/nodesource.sh \
    && bash /tmp/nodesource.sh \
    && apt-get install -y --no-install-recommends nodejs \
    && rm -f /tmp/nodesource.sh \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /opt/acttoolcache/node \
    && echo "node résolu : $(which node) $(node --version)" \
    && node --version | grep -q "^v${NODE_MAJOR}\."

# 1. Bun (~180 Mo) — installé APRÈS Node 20, pour que son npm global soit celui
#    de Node 20 et non celui de Node 18.
RUN npm install -g "bun@${BUN_VERSION}" \
    && npm cache clean --force

# 2. Les dépendances SYSTÈME de Chromium — c'est CETTE couche qui rachète les
#    104 s d'apt-get de chaque run.
RUN npx --yes "playwright@${PLAYWRIGHT_VERSION}" install-deps chromium \
    && rm -rf /var/lib/apt/lists/*

# 3. Le navigateur lui-même, séparé de ses dépendances système : les deux ne
#    bougent pas au même rythme, et Docker ne réinvalide alors que la bonne.
RUN npx --yes "playwright@${PLAYWRIGHT_VERSION}" install chromium

# La trace opposable de ce qui est réellement cuit ici. La CI de kadans la LIT et
# la confronte à son `bun.lock` : une dérive de version doit échouer FORT, avec sa
# cause, plutôt que de se manifester par un « Executable doesn't exist » à
# vingt minutes de là.
RUN printf 'node=%s\nbun=%s\nplaywright=%s\n' \
      "$(node --version)" "$(bun --version)" "${PLAYWRIGHT_VERSION}" \
      > /etc/ci-base.versions \
    && cat /etc/ci-base.versions
