# need buildx

ARG BUILDER_IMAGE=registry.gosuslugi.local/ervu-uat/etl-deps:1.9.14
ARG RUNTIME_IMAGE=registry.gosuslugi.local/ervu-uat/basealt/altsp:c10f2

################################################################################
FROM $BUILDER_IMAGE AS builder

ARG ETL_VERSION=2.13.0

ARG MVN_FLAGS="-DskipTests=true --batch-mode --no-transfer-progress -P-highdeps -Dmaven.wagon.http.connectionTimeout=120000 -Dmaven.wagon.http.connectTimeout=120000 -Dmaven.wagon.http.readTimeout=60000  -Dmaven.wagon.http.retryHandler.count=3 --quiet"

ENV BUILD_PACKAGES=" \
    curl \
    git-core \
    fontconfig \
    fonts-ttf-open-sans \
    fonts-console-terminus \
    glibc-locales \
    java-21-openjdk-headless \
    java-21-openjdk-devel \
    libswtpm \
    maven \
    unzip \
"

WORKDIR /src/


RUN apt-get update -qq -y \
 && apt-get install -qq -y $BUILD_PACKAGES \
 && apt-get clean

COPY ./etl /src/etl
COPY ./config/uat/settings.xml /root/.m2/settings.xml

WORKDIR /src/etl

# build
RUN mvn clean install ${MAVEN_OPTS} ${MVN_FLAGS}

WORKDIR /opt
RUN cp /src/etl/assemblies/client/target/hop-client-${ETL_VERSION}.zip . \
 && unzip hop-client-${ETL_VERSION}.zip \
 && rm hop-client-${ETL_VERSION}.zip \
 && mv hop/ etl/


################################################################################
FROM $RUNTIME_IMAGE AS run

# JSON configs to update with DB_* envs (space separated)
ENV CONFIG_JSON=""
# List of jobs (workflows) to run once and exit
ENV JOBS_RUN_ONCE=""
# List of jobs (workflows) to run every time on startup
ENV JOBS_ON_STARTUP=""
# List of jobs (workflows) to run with cron
#   syntax: JOBS_CRON="<cron_schedule_without_space>@<project_file_name1> <second_cron_schedule>@<project_file_name1> ..."
#   example: JOBS_CRON="*/1_*_*_*_*@repeated/job_every_minute.hwf" - run repeated/job_every_minute.hwf every minute
ENV JOBS_CRON=""

# Writable workpath
ENV WORKING_PATH=/home/etl
# params from https://github.com/apache/hop/blob/release/2.9.0/docker/Dockerfile
# path to where the artifacts should be deployed to
ENV DEPLOYMENT_PATH=/opt/etl
# volume mount point
ENV VOLUME_MOUNT_POINT=/files
# parent directory in which the hop config artifacts live
# ENV HOP_HOME= ...
# specify the hop log level
ENV HOP_LOG_LEVEL=Basic
# path to hop workflow or pipeline e.g. ~/project/main.hwf
ENV HOP_FILE_PATH=
# file path to hop log file, e.g. ~/hop.err.log
ENV HOP_LOG_PATH=$DEPLOYMENT_PATH/hop.err.log
# path to jdbc drivers
ENV HOP_SHARED_JDBC_FOLDERS=
# name of the Hop project to use
ENV HOP_PROJECT_NAME=mappings
# path to the home of the Hop project..
ENV HOP_PROJECT_FOLDER=$DEPLOYMENT_PATH/config/projects/mappings
# name of the project config file including file extension
ENV HOP_PROJECT_CONFIG_FILE_NAME=project-config.json
# environment to use with hop run
ENV HOP_ENVIRONMENT_NAME=prod
# comma separated list of paths to environment config files (including filename and file extension).
ENV HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS=
# hop run configuration to use
ENV HOP_RUN_CONFIG=local
# parameters that should be passed on to the hop-run command
# specify as comma separated list, e.g. PARAM_1=aaa,PARAM_2=bbb
ENV HOP_RUN_PARAMETERS=
# An optional export of metadata in JSON format
ENV HOP_RUN_METADATA_EXPORT=
# System properties that should be set
# specify as comma separated list, e.g. PROP1=xxx,PROP2=yyy
ENV HOP_SYSTEM_PROPERTIES=
# any JRE settings you want to pass on
# The “-XX:+AggressiveHeap” tells the container to use all memory assigned to the container.
# this removed the need to calculate the necessary heap Xmx
ENV HOP_OPTIONS=-XX:+AggressiveHeap
# Path to custom entrypoint extension script file - optional
# e.g. to fetch Hop project files from S3 or gitlab
ENV HOP_CUSTOM_ENTRYPOINT_EXTENSION_SHELL_FILE_PATH=
# The server user
ENV HOP_SERVER_USER=cluster
# The server password
ENV HOP_SERVER_PASSWORD=cluster
# The server hostname
ENV HOP_SERVER_HOSTNAME=0.0.0.0
ENV HOP_SERVER_PORT=8080
ENV HOP_SERVER_SHUTDOWNPORT=8079
# Optional metadata folder to be included in the hop server XML
ENV HOP_SERVER_METADATA_FOLDER=
# Optional server SSL configuration variables
ENV HOP_SERVER_KEYSTORE=
ENV HOP_SERVER_KEYSTORE_PASSWORD=
ENV HOP_SERVER_KEY_PASSWORD=
# Memory optimization options for the server
ENV HOP_SERVER_MAX_LOG_LINES=
ENV HOP_SERVER_MAX_LOG_TIMEOUT=
ENV HOP_SERVER_MAX_OBJECT_TIMEOUT=


ENV PACKAGES=" \
    curl \
    procps \
    java-21-openjdk-headless \
    jq \
    at \
    startup \
    su \
 "

# install run packages

RUN apt-get update -qq -y \
 && apt-get dist-upgrade -qq -y \
 && apt-get install -qq -y $PACKAGES \
 && apt-get clean \
 && rm -rf /var/cache/apt \
 && rm -rf /var/lib/apt/lists/*

RUN chmod 777 -R /tmp && chmod o+t -R /tmp

COPY --from=builder /opt /opt

RUN \
  groupadd --system --gid 500 etl \
  && adduser --system --no-create-home -d ${WORKING_PATH} --uid 500 --gid 500 etl \
  && mkdir -p ${WORKING_PATH} \
  && mkdir -p ${VOLUME_MOUNT_POINT} \
  && mkdir -p ${DEPLOYMENT_PATH} \
  && chown -R etl:etl ${DEPLOYMENT_PATH} \
  && chown -R etl:etl ${VOLUME_MOUNT_POINT}

WORKDIR ${DEPLOYMENT_PATH}

COPY entrypoint.sh ./
COPY --from=builder /src/etl/docker/resources/run.sh ./
COPY --from=builder /src/etl/docker/resources/load-and-execute.sh ./

RUN chmod +x *.sh

EXPOSE 8080 8079

# make volume available so that hop pipeline and workflow files can be provided easily
VOLUME ["/files"]

RUN mkdir -p ${HOP_PROJECT_FOLDER}
WORKDIR ${HOP_PROJECT_FOLDER}

RUN mkdir -p datasets metadata \
    && chown -R etl:etl ${HOP_PROJECT_FOLDER}

# cron needs root, move to sudo
#USER etl
ENV PATH=$PATH:${DEPLOYMENT_PATH}/hop
WORKDIR ${WORKING_PATH}

ENTRYPOINT ["/bin/bash", "-c"]

CMD ["/opt/etl/entrypoint.sh"]
