FROM debian:12.10-slim AS freerdp-build

ENV DEBIAN_FRONTEND=noninteractive

RUN printf '%s\n' \
    'Types: deb-src' \
    'URIs: http://deb.debian.org/debian' \
    'Suites: bookworm bookworm-updates' \
    'Components: main' \
    'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
    '' \
    'Types: deb-src' \
    'URIs: http://deb.debian.org/debian-security' \
    'Suites: bookworm-security' \
    'Components: main' \
    'Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg' \
    >/etc/apt/sources.list.d/debian-src.sources

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        build-essential \
        binutils \
        ca-certificates \
        cmake \
        dpkg-dev \
        git \
        ninja-build \
        pkg-config \
    && apt-get build-dep -y freerdp2 \
    && git clone --depth 1 --branch 2.11.7 https://github.com/FreeRDP/FreeRDP.git /tmp/freerdp-src \
    && sed -i 's/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} TRUE/' /tmp/freerdp-src/channels/cliprdr/client/CMakeLists.txt \
    && sed -i 's/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} TRUE/' /tmp/freerdp-src/channels/drdynvc/client/CMakeLists.txt \
    && sed -i 's/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} TRUE/' /tmp/freerdp-src/channels/rdpdr/client/CMakeLists.txt \
    && sed -i 's/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE/add_channel_client_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} TRUE/' /tmp/freerdp-src/channels/rdpsnd/client/CMakeLists.txt \
    && sed -i 's/#define VirtualChannelEntryEx cliprdr_VirtualChannelEntryEx/#define VirtualChannelEntryEx FREERDP_API VirtualChannelEntryEx/' /tmp/freerdp-src/channels/cliprdr/client/cliprdr_main.c \
    && sed -i 's/#define VirtualChannelEntryEx drdynvc_VirtualChannelEntryEx/#define VirtualChannelEntryEx FREERDP_API VirtualChannelEntryEx/' /tmp/freerdp-src/channels/drdynvc/client/drdynvc_main.c \
    && sed -i 's/#define VirtualChannelEntryEx rdpdr_VirtualChannelEntryEx/#define VirtualChannelEntryEx FREERDP_API VirtualChannelEntryEx/' /tmp/freerdp-src/channels/rdpdr/client/rdpdr_main.c \
    && sed -i 's/BOOL VCAPITYPE rdpsnd_VirtualChannelEntryEx/BOOL VCAPITYPE FREERDP_API VirtualChannelEntryEx/' /tmp/freerdp-src/channels/rdpsnd/client/rdpsnd_main.c \
    && cmake -S /tmp/freerdp-src -B /tmp/freerdp-build -G Ninja \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_INSTALL_PREFIX=/opt/freerdp \
        -DCMAKE_INSTALL_LIBDIR=lib \
        -DWITH_CHANNELS=ON \
        -DBUILTIN_CHANNELS=OFF \
        -DWITH_CLIENT=ON \
        -DWITH_CLIENT_COMMON=ON \
        -DWITH_SERVER=OFF \
        -DWITH_SHADOW=OFF \
        -DWITH_X11=OFF \
        -DWITH_WAYLAND=OFF \
    && cmake --build /tmp/freerdp-build \
    && cmake --install /tmp/freerdp-build \
    && test -f /opt/freerdp/lib/freerdp2/libcliprdr-client.so \
    && test -f /opt/freerdp/lib/freerdp2/libdrdynvc-client.so \
    && test -f /opt/freerdp/lib/freerdp2/librdpgfx-client.so \
    && test -f /opt/freerdp/lib/freerdp2/librdpdr-client.so \
    && test -f /opt/freerdp/lib/freerdp2/librdpsnd-client.so \
    && readelf --dyn-syms /opt/freerdp/lib/freerdp2/libcliprdr-client.so | grep VirtualChannelEntryEx \
    && readelf --dyn-syms /opt/freerdp/lib/freerdp2/libdrdynvc-client.so | grep VirtualChannelEntryEx \
    && readelf --dyn-syms /opt/freerdp/lib/freerdp2/librdpdr-client.so | grep VirtualChannelEntryEx \
    && readelf --dyn-syms /opt/freerdp/lib/freerdp2/librdpsnd-client.so | grep VirtualChannelEntryEx \
    && rm -rf /var/lib/apt/lists/* /tmp/freerdp-src /tmp/freerdp-build

FROM debian:12.10-slim AS build

ENV DEBIAN_FRONTEND=noninteractive
ENV PKG_CONFIG_PATH=/opt/freerdp/lib/pkgconfig
ENV LD_LIBRARY_PATH=/opt/freerdp/lib

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        build-essential \
        ca-certificates \
        cmake \
        ninja-build \
        pkg-config \
        freerdp2-x11 \
        freerdp2-dev \
        libboost-dev \
        libssl-dev \
        libwinpr2-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /opt/rap-rdp-worker

COPY --from=freerdp-build /opt/freerdp /opt/freerdp

COPY . .

RUN cmake --preset dev \
    && cmake --build --preset dev \
    && cmake --install build

FROM debian:12.10-slim

ENV DEBIAN_FRONTEND=noninteractive
ENV FREERDP_PLUGIN_PATH=/opt/freerdp/lib/freerdp2
ENV LD_LIBRARY_PATH=/opt/freerdp/lib

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        freerdp2-x11 \
        freerdp2-dev \
        libssl3 \
        libwinpr2-dev \
    && rm -rf /var/lib/apt/lists/*

COPY --from=freerdp-build /opt/freerdp /opt/freerdp
COPY --from=build /usr/local/bin/rdp-worker /usr/local/bin/rdp-worker
COPY --from=build /usr/local/bin/rdp-worker-dataplane-token-probe /usr/local/bin/rdp-worker-dataplane-token-probe
COPY --from=build /usr/local/bin/rdp-worker-dataplane-bind-probe /usr/local/bin/rdp-worker-dataplane-bind-probe
COPY --from=build /usr/local/bin/rdp-worker-graphics-adapter-probe /usr/local/bin/rdp-worker-graphics-adapter-probe
COPY --from=build /usr/local/bin/rdp-worker-cursor-adapter-probe /usr/local/bin/rdp-worker-cursor-adapter-probe
COPY --from=build /usr/local/bin/rdp-worker-service-adapter-protocol-probe /usr/local/bin/rdp-worker-service-adapter-protocol-probe

CMD ["/usr/local/bin/rdp-worker"]
