# Dockerfile for CORSIKA and sim_telarray.
#
# Contains CORSIKA (non-optimized) and sim_telarray.
# Used as base image for the simtools-dev image.
#
# hadolint global ignore=DL3013,DL3033,DL3041
# - DL3041: ignore warnings about using latest
# - DL3013, DL3033: ignore warnings about installing non-specific versions with microdnf or yum)
FROM almalinux:9.5 AS build_image
ARG BUILD_OPT="prod6-sc"
ARG EXTRA_DEF="-DMAXIMUM_TELESCOPES=128"
ARG HADRONIC_MODEL="qgs2"
ARG AVX_FLAG="no_opt"
ARG CORSIKA_VERSION="77550"
ARG BERNLOHR_VERSION="1.68"

ENV GCC_PATH="/usr/bin/"
WORKDIR /workdir/sim_telarray

RUN yum update -y && yum install -y \
    gcc-fortran gsl-devel libgfortran \
    csh patch perl which bzip2 && \
    yum clean all && \
    rm -rf /var/cache/yum/* /tmp/* /var/tmp/*

ADD corsika_simtelarray.tar.gz .
RUN rm -f examples-with-data.tar.gz && \
    rm -f sim_telarray_config.tar.gz && \
    export EXTRA_DEFINES="${EXTRA_DEF}" && ./build_all $BUILD_OPT $HADRONIC_MODEL gsl

# CORSIKA source code is removed to follow
# the CORSIKA non-distribution policy.
RUN mv ./corsika-7*/run corsika-run && \
    rm -rf ./corsika-7[0-9]* && \
    find . -name "*.tar.gz" -delete && \
    rm -rf /var/cache/yum/* /tmp/* /var/tmp/*

# Unzip QGSJet tables; remove tables not needed (e.g. remove qgs3 tables when using qgs2)
WORKDIR /workdir/sim_telarray/corsika-run
RUN if [ "$HADRONIC_MODEL" = "qgs3" ]; then \
        if [ -f qgsdat-III.bz2 ]; then \
            bzip2 -dq qgsdat-III.bz2; \
        fi; \
        rm -f -v qgsdat-II-04.bz2; \
    fi && \
    if [ "$HADRONIC_MODEL" = "qgs2" ]; then \
        if [ -f qgsdat-II-04.bz2 ]; then \
            bzip2 -dq qgsdat-II-04.bz2; \
        fi; \
        rm -f -v qgsdat-III.bz2; \
    fi

# Add a yml file in workdir with the build options
WORKDIR /workdir/sim_telarray
RUN echo "build_opt: $BUILD_OPT" > ./build_opts.yml && \
    echo "extra_def: $EXTRA_DEF" >> ./build_opts.yml && \
    echo "hadronic_model: $HADRONIC_MODEL" >> ./build_opts.yml && \
    echo "avx_flag: $AVX_FLAG" >> ./build_opts.yml && \
    echo "corsika_version: $CORSIKA_VERSION" >> ./build_opts.yml && \
    echo "bernlohr_version: $BERNLOHR_VERSION" >> ./build_opts.yml

FROM almalinux:9.5-minimal
COPY --from=build_image /workdir/sim_telarray/ /workdir/sim_telarray/
WORKDIR /workdir
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN microdnf update -y && microdnf install -y \
    bc \
    zstd \
    gsl-devel \
    gcc-fortran \
    procps && \
    microdnf clean all && \
    rm -rf /var/cache/dnf/* /tmp/* /var/tmp/*

# create a symbolic link to the corsika executable
RUN cprog=$(/bin/ls /workdir/sim_telarray/corsika-run/corsika*"$(uname)"_* 2>/dev/null | tail -1) && \
    ln -sf "$cprog" /workdir/sim_telarray/corsika-run/corsika

ENV SIMTEL_PATH="/workdir/sim_telarray"
