# syntax=docker/dockerfile:1

# Сборка и запуск Lark DE в контейнере.
#
# Этапы:
#   builder  — Rust, библиотеки разработки и `cargo build --release`
#   runtime  — библиотеки времени выполнения и сам композитор
#   headless — runtime плюс Xvfb и клиент: проверка без дисплея
#   binary   — только исполняемый файл, чтобы забрать его из образа
#
# Примеры:
#   docker build -t lark .                              # образ для запуска
#   docker build --target binary -o dist .              # только бинарник: dist/lark
#   docker build --target headless -t lark:headless .   # образ для проверки
#
# Сборка на удалённой машине и возврат бинарника: scripts/build-remote.sh.

# --- Этап сборки -------------------------------------------------------------

FROM rust:1-bookworm AS builder

ENV DEBIAN_FRONTEND=noninteractive

# Системные зависимости из docs/BUILD.md. clang и cmake нужны крейтам,
# которые генерируют привязки во время сборки, остальное находит pkg-config.
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        build-essential \
        ca-certificates \
        clang \
        cmake \
        git \
        libclang-dev \
        libdbus-1-dev \
        libdrm-dev \
        libexpat1-dev \
        libffi-dev \
        libgbm-dev \
        libinput-dev \
        libpipewire-0.3-dev \
        libseat-dev \
        libudev-dev \
        libwayland-dev \
        libxkbcommon-dev \
        pkg-config \
 && rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY . .

# Реестр Cargo, git-зависимости и target подключены как кэш: повторная
# сборка после правки кода не скачивает и не компилирует всё заново.
RUN --mount=type=cache,target=/usr/local/cargo/registry \
    --mount=type=cache,target=/usr/local/cargo/git \
    --mount=type=cache,target=/src/target \
    cargo build --release --locked \
 && install -m755 target/release/lark /usr/local/bin/lark

# --- Этап запуска ------------------------------------------------------------

FROM debian:bookworm-slim AS runtime

ENV DEBIAN_FRONTEND=noninteractive

# Библиотеки времени выполнения: Wayland, xkbcommon, DRM и GBM нужны
# композитору; libX11, libxcursor, libxi, libxrandr и libxkbcommon-x11 —
# окну winit в X-сессии; libEGL и llvmpipe (libgl1-mesa-dri) — OpenGL ES,
# в том числе программный рендеринг; DejaVu — кириллица в подписях.
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        fonts-dejavu-core \
        libdrm2 \
        libegl-mesa0 \
        libegl1 \
        libgbm1 \
        libgl1 \
        libgl1-mesa-dri \
        libglx-mesa0 \
        libinput10 \
        libseat1 \
        libudev1 \
        libwayland-client0 \
        libwayland-server0 \
        libx11-6 \
        libx11-xcb1 \
        libxcursor1 \
        libxi6 \
        libxkbcommon-x11-0 \
        libxkbcommon0 \
        libxrandr2 \
 && rm -rf /var/lib/apt/lists/*

COPY --from=builder /usr/local/bin/lark /usr/local/bin/lark

ENTRYPOINT ["/usr/local/bin/lark"]

# --- Этап проверки без дисплея -----------------------------------------------

FROM runtime AS headless

# Xvfb даёт виртуальный X-сервер, import снимает экран, xdotool позволяет
# «нажать» кнопку перед снимком. weston-terminal и foot — клиенты с
# .desktop-файлами: на них видно, что меню читает установленные приложения,
# а окна появляются в сессии.
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        foot \
        imagemagick \
        weston \
        x11-utils \
        xdotool \
        xvfb \
 && rm -rf /var/lib/apt/lists/*

COPY scripts/dev-run.sh /usr/local/share/lark/dev-run.sh

# Рендеринг программный: доступа к видеокарте у контейнера нет.
ENV LIBGL_ALWAYS_SOFTWARE=1 \
    LARK_BIN=/usr/local/bin/lark \
    LARK_TEST_CLIENT=weston-terminal \
    LARK_TEST_RUNTIME=/tmp/lark-test-run \
    LARK_TEST_SHOT=/tmp/lark-shot.png \
    LARK_TEST_LOG=/tmp/lark-dev-run.log

# Точку входа runtime переопределяем: контейнер запускает проверку, а не
# композитор напрямую.
ENTRYPOINT []
CMD ["/usr/local/share/lark/dev-run.sh"]

# --- Только бинарник ---------------------------------------------------------

FROM scratch AS binary

COPY --from=builder /usr/local/bin/lark /lark
