# syntax=docker/dockerfile:1

# =============================================================================
# Stage 1 — toolchain
# Скачиваем ARM GCC тулчейн. Этот слой кэшируется надолго:
# инвалидируется только при изменении TOOLCHAIN_VERSION.
# =============================================================================
FROM ubuntu:22.04@sha256:3ba65aa20f86a0fad9df2b2c259c613df006b2e6d0bfcc8a146afb8c525a9751 AS toolchain

ARG TOOLCHAIN_VERSION=13.3.rel1

RUN apt-get update && apt-get install -y --no-install-recommends \
        wget xz-utils ca-certificates \
    && rm -rf /var/lib/apt/lists/*

RUN set -eux && \
    UNAME_ARCH="$(uname -m)" && \
    case "${UNAME_ARCH}" in \
        "x86_64")  HOST_ARCH="x86_64" ;; \
        "aarch64") HOST_ARCH="aarch64" ;; \
        *) echo "Unsupported arch: ${UNAME_ARCH}" && exit 1 ;; \
    esac && \
    wget -qO- \
    "https://developer.arm.com/-/media/Files/downloads/gnu/${TOOLCHAIN_VERSION}/binrel/arm-gnu-toolchain-${TOOLCHAIN_VERSION}-${HOST_ARCH}-arm-none-eabi.tar.xz" \
    | tar -xJ -C /opt && \
    ln -s /opt/arm-gnu-toolchain-${TOOLCHAIN_VERSION}-${HOST_ARCH}-arm-none-eabi /opt/arm-toolchain


# =============================================================================
# Stage 2 — dev
# Устанавливаем инструменты разработки поверх готового тулчейна.
# Этот слой меняется чаще (обновление clang, cmake и т.д.),
# но слой Stage 1 при этом не инвалидируется и берётся из кэша.
# =============================================================================
FROM toolchain AS dev

LABEL maintainer="von.akimov@gmail.com" \
      version="0.1.1"

ENV DEBIAN_FRONTEND=noninteractive

ENV PATH="/opt/arm-toolchain/bin:${PATH}"

# Устанавливаем LLVM GPG ключ и репозиторий (llvm >= 16 для поддержки If в .clangd), затем все dev-инструменты
RUN apt-get update && apt-get install -y --no-install-recommends \
        gnupg ca-certificates wget && \
    wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key \
    | gpg --dearmor -o /usr/share/keyrings/llvm.gpg && \
    echo "deb [signed-by=/usr/share/keyrings/llvm.gpg] http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main" \
    > /etc/apt/sources.list.d/llvm.list && \
    apt-get update && apt-get install -y --no-install-recommends \
        curl git cmake ninja-build bear \
        python3 python3-pip \
        clang-17 clangd-17 libclang-rt-17-dev clang-tidy-17 clang-format-17 \
        gdb-multiarch \
        build-essential \
        libncurses5 \
    && update-alternatives --install /usr/bin/clangd       clangd       /usr/bin/clangd-17       100 \
    && update-alternatives --install /usr/bin/clang        clang        /usr/bin/clang-17       100 \
    && update-alternatives --install /usr/bin/clang-tidy   clang-tidy   /usr/bin/clang-tidy-17   100 \
    && update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-17 100 \
    && pip3 install --no-cache-dir cmake-format==0.6.13 \
    && ln -s /usr/bin/clangd /usr/local/bin/clangd \
    && ln -s /usr/bin/clang  /usr/local/bin/clang \
    && rm -rf /var/lib/apt/lists/*


# uv — менеджер Python-окружений для spsdk и других host-инструментов.
# spsdk НЕ ставится через pip напрямую — версия фиксируется в tools/host/uv.lock.
# uv sync в postCreateCommand подтянет нужную версию автоматически.
ARG UV_VERSION=0.5.0
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh

ARG JUST_VERSION=1.36.0

RUN curl -sSf https://just.systems/install.sh \
    | bash -s -- --tag ${JUST_VERSION} --to /usr/local/bin

ARG USER_ID=1000
ARG GROUP_ID=1000
ARG WORKSPACE_PATH="/workspace"

# Создаем группу/пользователя с UID хоста
RUN groupadd --gid $GROUP_ID devgroup && \
    useradd --uid $USER_ID --gid devgroup \
            --create-home --shell /bin/bash devuser && \
    mkdir -p $WORKSPACE_PATH && \
    chown -R devuser:devgroup $WORKSPACE_PATH
    
USER devuser
WORKDIR $WORKSPACE_PATH