##############
# Base image #
##############
FROM debian:12-slim AS base

ENV DEBIAN_FRONTEND=noninteractive
ARG USER=fred

WORKDIR /app

RUN apt-get -y update \
        && apt-get install -y --no-install-recommends \
            gnupg2 \
            ca-certificates \
            wget \
            gettext-base \
        && apt-get -y clean \
        && rm -rf /var/lib/apt/lists/*


RUN set -eux && \
    adduser --home /app --disabled-password --gecos ${USER} ${USER} && \
    chmod go+rwx /app


RUN wget --output-document=/usr/share/keyrings/cznic-archive-keyring.gpg https://archive.nic.cz/dists/cznic-archive-keyring.gpg && \
    echo "deb [signed-by=/usr/share/keyrings/cznic-archive-keyring.gpg] http://archive.nic.cz/scratch bookworm main" > /etc/apt/sources.list.d/fred.list


#####################
# Build Application #
#####################
FROM base AS builder

ARG BUILD_JOBS=1
ENV CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS

WORKDIR /app

COPY . /app

RUN apt-get -y update                       \
        && apt-get -y install --no-install-recommends \
            cmake                           \
            pkg-config                      \
            build-essential                 \
            libomniorb4-dev                 \
            omniidl                         \
            libpq-dev                       \
            libmpdec-dev                    \
            nlohmann-json3-dev              \
            libboost-all-dev                \
            libcurl4-openssl-dev            \
            libssh-dev                      \
            libminizip-dev                  \
            libxml2-dev                     \
            libidn11-dev                    \
            libgrpc++-dev                   \
            libprotobuf-dev                 \
            protobuf-compiler               \
            protobuf-compiler-grpc          \
        && apt-get -y clean                 \
        && rm -rf /var/lib/apt/lists/*

RUN echo "Using $CMAKE_BUILD_PARALLEL_LEVEL job(s) for build" && \
    cmake -B build -S . && cmake --build build #--target fred-rifd

################
# Common image #
################
FROM base AS common

# libboost-serialization - rifd, pifd, adifd
# libmpdec - rifd, pifd, accifd, adifd
# libidn - rifd, mifd, pifd, adifd
# libgrpc++ - rifd, mifd, pifd
# libxml2 - adifd
RUN apt-get -y update                       \
        && apt-get -y install --no-install-recommends \
            libpq5                          \
            libmpdec3                       \
            libomniorb4-2                   \
            libboost-program-options1.74.0  \
            libboost-thread1.74.0           \
            libboost-regex1.74.0            \
            libboost-serialization1.74.0    \
            libidn12                        \
            libxml2                         \
            libgrpc++1.51                   \
        && apt-get -y clean                 \
        && rm -rf /var/lib/apt/lists/*

USER ${USER}:${USER}

COPY --from=config --chown=${USER}:${USER} ./docker-entrypoint.sh /

ENTRYPOINT ["/docker-entrypoint.sh"]

######################
# Final image - rifd #
######################
FROM common AS rifd

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-rifd /usr/local/bin/fred-rifd
COPY --from=config --chown=${USER}:${USER} fred-rifd.conf.template /etc/fred/fred-server.conf.template

EXPOSE 2224

CMD ["fred-rifd", "-ORBnativeCharCodeSet", "UTF-8", "-ORBendPoint", "giop:tcp::2224", "--config", "/etc/fred/fred-server.conf"]

######################
# Final image - mifd #
######################
FROM common AS mifd

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-mifd /usr/local/bin/fred-mifd
COPY --from=config --chown=${USER}:${USER} fred-mifd.conf.template /etc/fred/fred-server.conf.template

EXPOSE 2227

CMD ["fred-mifd", "-ORBnativeCharCodeSet", "UTF-8", "-ORBendPoint", "giop:tcp::2227", "--config", "/etc/fred/fred-server.conf"]

########################
# Final image - accifd #
########################
FROM common AS accifd

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-accifd /usr/local/bin/fred-accifd
COPY --from=config --chown=${USER}:${USER} fred-accifd.conf.template /etc/fred/fred-server.conf.template

EXPOSE 2235

CMD ["fred-accifd", "-ORBnativeCharCodeSet", "UTF-8", "-ORBendPoint", "giop:tcp::2235", "--config", "/etc/fred/fred-server.conf"]

######################
# Final image - pifd #
######################
FROM common AS pifd

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-pifd /usr/local/bin/fred-pifd
COPY --from=config --chown=${USER}:${USER} fred-pifd.conf.template /etc/fred/fred-server.conf.template

EXPOSE 2223

CMD ["fred-pifd", "-ORBnativeCharCodeSet", "UTF-8", "-ORBendPoint", "giop:tcp::2223", "--config", "/etc/fred/fred-server.conf"]

#######################
# Final image - adifd #
#######################
FROM common AS adifd

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-adifd /usr/local/bin/fred-adifd
COPY --from=config --chown=${USER}:${USER} fred-adifd.conf.template /etc/fred/fred-server.conf.template

EXPOSE 2222

CMD ["fred-adifd", "-ORBnativeCharCodeSet", "UTF-8", "-ORBendPoint", "giop:tcp::2222", "--config", "/etc/fred/fred-server.conf"]

############################
# Final image - fred-admin #
############################
FROM common AS admin

COPY --from=builder --chown=${USER}:${USER} /app/build/bin/fred-admin /usr/local/bin/fred-admin
COPY --from=config --chown=${USER}:${USER} fred-admin.conf.template /etc/fred/fred-server.conf.template
COPY --from=config --chown=${USER}:${USER} ./docker-entrypoint_fred-admin.sh /

WORKDIR /usr/local/etc/fred

ENTRYPOINT ["/docker-entrypoint_fred-admin.sh"]
#CMD ["echo 'call this with docker compose [-f file] run fred-admin fred-admin command'"]
