FROM ruby:3.4.9-slim AS build

ENV APP_PATH=/opt/hth/application/backend/current
ARG TARGETARCH

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends \
        build-essential \
        curl \
        git \
        cmake \
        pkg-config \
        libicu-dev \
        libffi-dev \
        libssl-dev \
        libyaml-dev \
        libzstd-dev \
        zlib1g-dev && \
    useradd -m -u 21212 -U -s /bin/bash hth && \
    mkdir -p /var/opt/hth/shared && mkdir -p /var/opt/hth/backups && chown -R hth:hth /var/opt/hth

RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
    apt-get update && \
    apt-get install -y nodejs && \
    npm install -g yarn@1.22.22

RUN if [ "$TARGETARCH" = "amd64" ]; then \
        export MONGO_ARCH=x86_64; \
    elif [ "$TARGETARCH" = "arm64" ]; then \
        export MONGO_ARCH=arm64; \
    fi && curl -sSL https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2404-${MONGO_ARCH}-100.15.0.tgz | \
    tar -xz --strip-components=2 -C /usr/local/bin \
    mongodb-database-tools-ubuntu2404-${MONGO_ARCH}-100.15.0/bin/mongodump \
    mongodb-database-tools-ubuntu2404-${MONGO_ARCH}-100.15.0/bin/mongorestore

USER hth
WORKDIR ${APP_PATH}

COPY --chown=hth:hth package.json yarn.lock ${APP_PATH}/
RUN yarn install

COPY --chown=hth:hth Gemfile Gemfile.lock ${APP_PATH}/
ENV BUNDLE_APP_CONFIG=${APP_PATH}/.bundle
RUN bundle config set path 'vendor/bundle' && \
    bundle config set without 'development test' && \
    bundle install --jobs $(nproc) --retry 3 && \
    bundle clean --force

COPY --chown=hth:hth . ${APP_PATH}/
# consider skipping the assets precompilation step for workers
RUN bundle exec rake webpacker:clobber && \
    bundle exec rake assets:clean && \
    bundle exec rake assets:precompile

# --------------------------------------------------

FROM build AS development

USER root

RUN apt-get install -y --no-install-recommends curl graphicsmagick libicu76 procps && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY --chown=hth:hth . ${APP_PATH}/
COPY --chown=hth:hth --from=build ${APP_PATH}/vendor ${APP_PATH}/vendor
WORKDIR ${APP_PATH}

USER hth

RUN bundle config set path 'vendor/bundle' && \
    bundle config set without '' && \
    bundle install --jobs $(nproc) --retry 3 && \
    bundle clean --force

# --------------------------------------------------

FROM ruby:3.4.9-slim AS production

ENV APP_PATH=/opt/hth/application/backend/current \
    HOME=/opt/hth

USER 0

RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends curl graphicsmagick libicu76 procps && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY --chown=21212:21212 . ${APP_PATH}/
COPY --chown=21212:21212 --from=build /var/opt/hth /var/opt/hth
COPY --chown=21212:21212 --from=build ${APP_PATH}/vendor ${APP_PATH}/vendor
COPY --chown=21212:21212 --from=build ${APP_PATH}/public/admin ${APP_PATH}/public/admin

WORKDIR ${APP_PATH}

USER 21212:21212

ENV BUNDLE_APP_CONFIG=${APP_PATH}/.bundle

RUN bundle config set path 'vendor/bundle' && \
    bundle config set without 'development test'

# --------------------------------------------------

FROM development AS workers_development

COPY --from=gobackup /app/dist/gobackup /usr/local/bin/gobackup

CMD ["bundle", "exec", "resque-pool", "--environment", "development"]

# --------------------------------------------------

FROM production AS workers_production

COPY --from=gobackup /app/dist/gobackup /usr/local/bin/gobackup
COPY --from=build /usr/local/bin/mongodump /usr/local/bin/mongodump
COPY --from=build /usr/local/bin/mongorestore /usr/local/bin/mongorestore

CMD ["bundle", "exec", "resque-pool", "--environment", "production"]

# --------------------------------------------------

FROM development AS backend_development

CMD ["bundle", "exec", "unicorn", "-E", "development", "-c", "/opt/hth/application/backend/current/config/unicorn_docker.rb"]

# --------------------------------------------------

FROM production AS backend_production

CMD ["bundle", "exec", "unicorn", "-E", "deployment", "-c", "/opt/hth/application/backend/current/config/unicorn_docker.rb"]
