FROM almalinux:9.5 AS build_image
WORKDIR /workdir/sim_telarray
ENV GCC_PATH="/usr/bin/"
ARG BUILD_OPT="prod6-sc"
ARG EXTRA_DEF="-DMAXIMUM_TELESCOPES=128"
ARG HADRONIC_MODEL="qgs2"
ARG AVX_FLAG="avx2"
ARG CORSIKA_VERSION="77550"
ARG BERNLOHR_VERSION="1.68"
ARG BUILD_BRANCH=main
ARG PYTHON_VERSION=3.12
ARG SIMTOOLS_REQUIREMENT="git+https://github.com/gammasim/simtools.git"

RUN yum update -y && yum install -y \
    gcc-fortran gsl-devel libgfortran \
    autoconf automake csh patch perl which bzip2 && \
    yum clean all

ADD corsika_simtelarray.tar.gz .
ADD corsikaOptPatch.tar.gz ./corsika-$CORSIKA_VERSION
RUN tar -zxf corsika-$CORSIKA_VERSION.tar.gz && \
    tar -zxf bernlohr-$BERNLOHR_VERSION.tar.gz -C corsika-$CORSIKA_VERSION/bernlohr && \
    rm -f examples-with-data.tar.gz sim_telarray_config.tar.gz \
    corsika_simtelarray.tar.gz  corsika-$CORSIKA_VERSION.tar.gz \
    bernlohr-$BERNLOHR_VERSION.tar.gz

# Apply patches for non-optimized / optimized CORSIKA
RUN cd corsika-$CORSIKA_VERSION && \
    if [[ $CORSIKA_VERSION -eq 77550 ]]; then \
        (cd src && patch -b -p0 corsika.F < "../../corsika-77550.patch"); \
    fi && \
    if [[ "$AVX_FLAG" == "no_opt" ]]; then \
        ../corsika_build_script $HADRONIC_MODEL generic; \
    else \
        ./corsika_opt_patching.sh && \
        autoreconf && \
        ../corsika_build_script $HADRONIC_MODEL generic cerenkopt vlibm; \
    fi

# Build non-optimized / optimized CORSIKA
RUN make -C corsika-$CORSIKA_VERSION clean && rm -f */*.a lib/*/*.a && \
    AVX_EXTRA_FLAG=$([ "$AVX_FLAG" = "avx512f" ] && echo "-ffp-contract=off" || echo "") && \
    CFLAGS="" && CXXFLAGS="" && FFLAGS="" && \
    if [[ "$AVX_FLAG" == "no_opt" ]]; then \
        CFLAGS="-g  -std=c99 -O3"; \
        CXXFLAGS="-g  -std=c99 -O3"; \
        FFLAGS="-g -ffixed-line-length-132 -fno-automatic -frecord-marker=4 -std=legacy -O3"; \
    else \
        CFLAGS="-g -DCERENKOPT -DVLIBM -std=c99 -O3 ${AVX_FLAG:+-m$AVX_FLAG} ${avx_512_FLAG} -DVECTOR_SIZE=8 -DVECTOR_LENGTH=8"; \
        CXXFLAGS="-g -DCERENKOPT -DVLIBM -std=c99 -O3 ${AVX_FLAG:+-m$AVX_FLAG} ${avx_512_FLAG} -DVECTOR_SIZE=8 -DVECTOR_LENGTH=8"; \
        FFLAGS="-g -ffixed-line-length-132 -fno-automatic -frecord-marker=4 -std=legacy -DCERENKOPT -DVLIBM -std=c99 -O3 ${AVX_FLAG:+-m$AVX_FLAG} ${avx_512_FLAG} -DVECTOR_SIZE=8 -DVECTOR_LENGTH=8"; \
    fi && \
    make -C corsika-$CORSIKA_VERSION \
        CC="${GCC_PATH}/gcc -static" \
        CXX="${GCC_PATH}/g++ -static" \
        CPP="${GCC_PATH}/gcc -static -E" \
        F77="${GCC_PATH}/gfortran -L/lib64/" \
        CFLAGS="${CFLAGS}" \
        CXXFLAGS="${CXXFLAGS}" \
        FFLAGS="$FFLAGS" \
        install

# Rename executable to 'corsika'
RUN mv -f corsika-$CORSIKA_VERSION/run/corsika$CORSIKA_VERSIONLinux_* corsika-$CORSIKA_VERSION/run/corsika
# Build sim_telarray
RUN touch corsika-$CORSIKA_VERSION.tar.gz && \
    export NO_CORSIKA=1 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 && \
    find . -name "doc*" -type d -exec rm -rf {} + 2>/dev/null && \
    find . -name "*.o" -delete && \
    rm -rf /var/cache/yum/* /tmp/* /var/tmp/*

# Unzip QGSJet tables; remove tables not needed (e.g. remove qgs3 tables when using qgs2)
RUN cd corsika-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

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

FROM almalinux:9.5-minimal
WORKDIR /workdir
ARG BUILD_BRANCH=main
ARG SIMTOOLS_REQUIREMENT="https://github.com/gammasim/simtools.git"
ARG PYTHON_VERSION=3.12
COPY --from=build_image /workdir/sim_telarray/ /workdir/sim_telarray/

RUN microdnf update -y && microdnf install -y \
    bc \
    zstd \
    gsl-devel \
    gcc-fortran \
    procps \
    findutils \
    gcc-c++ \
    git \
    libgfortran \
    python${PYTHON_VERSION}-devel && \
    microdnf clean all

RUN BUILD_BRANCH=$(echo $BUILD_BRANCH | sed 's#refs/tags/##') \
  && git clone -b $BUILD_BRANCH ${SIMTOOLS_REQUIREMENT} --depth 1 \
  && python${PYTHON_VERSION} -m venv env \
  && source env/bin/activate \
  && pip install -U pip \
  && pip install --no-cache-dir "git+${SIMTOOLS_REQUIREMENT}@${BUILD_BRANCH}" \
  && echo ". /workdir/env/bin/activate" >> ~/.bashrc t

ENV SIMTEL_PATH="/workdir/sim_telarray"
ENV PATH="/workdir/env/bin/:$PATH"
SHELL ["/bin/bash", "-c"]
