# QFP-58 build environment: KiCad (pcbnew + kicad-cli), openEMS/CSXCAD with Python bindings, and the
# locked Python deps from uv.lock. Everything the generator and the simulations need, nothing from the host.
#   ./run.sh                      -> full build into the project root (see run.sh)
ARG KICAD_VERSION=10.0.6
ARG UV_VERSION=0.12.17
FROM ghcr.io/astral-sh/uv:${UV_VERSION} AS uv

# ----------------------------------------------------------------------------- build stage
FROM kicad/kicad:${KICAD_VERSION} AS build
ARG OPENEMS_VERSION=v0.0.36
USER root
COPY --from=uv /uv /usr/local/bin/uv

# openEMS 0.0.36+ is not packaged for Debian trixie: build fparser -> CSXCAD -> openEMS into /usr/local.
RUN apt-get update \
 && apt-get install -y --no-install-recommends ca-certificates build-essential cmake git python3-dev \
        libhdf5-dev libvtk9-dev libcgal-dev libtinyxml-dev libboost-thread-dev libboost-system-dev \
        libboost-date-time-dev libboost-serialization-dev libboost-chrono-dev libboost-program-options-dev \
 && git clone --depth 1 --branch ${OPENEMS_VERSION} --recurse-submodules \
        https://github.com/thliebig/openEMS-Project.git /tmp/openEMS \
 && cmake -S /tmp/openEMS -B /tmp/openEMS/build -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_APPCSXCAD=NO \
 && cmake --build /tmp/openEMS/build -j"$(nproc)" \
 && ldconfig

# Python env: the system interpreter (it carries pcbnew) plus the locked deps. The openEMS/CSXCAD bindings are
# compiled against the libraries above; 0.0.36's bindings predate Cython 3, so drop the unused
# `cimport cython.numeric` (upstream openEMS a87a75e) and build with Cython 3.0.
ENV UV_PROJECT_ENVIRONMENT=/opt/venv UV_PYTHON_DOWNLOADS=never UV_LINK_MODE=copy
COPY pyproject.toml uv.lock /tmp/qfp58/
RUN cd /tmp/qfp58 \
 && uv venv --system-site-packages --python /usr/bin/python3 /opt/venv \
 && uv sync --frozen --group sim --no-install-project \
 && sed -i '/^cimport cython.numeric$/d' /tmp/openEMS/openEMS/python/openEMS/_nf2ff.pxd \
 && uv pip install --python /opt/venv "cython>=3.0,<3.1" setuptools \
 && uv pip install --python /opt/venv --no-build-isolation /tmp/openEMS/CSXCAD/python /tmp/openEMS/openEMS/python \
 && uv pip uninstall --python /opt/venv cython setuptools

# Debian packages owning the shared libraries the build links against (dpkg knows them under /usr/lib).
RUN find /usr/local/bin /usr/local/lib /opt/venv -type f \( -name '*.so*' -o -perm -u+x \) -print0 \
      | xargs -0 ldd 2>/dev/null | awk '/=> \//{print $3}' | sed 's#^/lib/#/usr/lib/#' | sort -u \
      | xargs -r dpkg -S 2>/dev/null | cut -d: -f1 | sort -u > /runtime-packages.txt

# ----------------------------------------------------------------------------- final image
FROM kicad/kicad:${KICAD_VERSION}
USER root
COPY --from=build /runtime-packages.txt /tmp/
RUN apt-get update \
 && xargs -a /tmp/runtime-packages.txt apt-get install -y --no-install-recommends \
 && rm -rf /var/lib/apt/lists/* /tmp/runtime-packages.txt
COPY --from=build /usr/local /usr/local
COPY --from=build /opt/venv /opt/venv
RUN ldconfig \
 && /opt/venv/bin/python -c "import pcbnew, scipy, shapely, skrf, h5py, CSXCAD, openEMS; print('pcbnew', pcbnew.Version())"

ENV PATH=/opt/venv/bin:$PATH MPLBACKEND=Agg HOME=/tmp
WORKDIR /work
USER kicad
CMD ["python", "src/generate.py"]
