ARG PHP_VERSION=8.3

# APT: packages to install.
ARG APT_DEFAULT_PACKAGES="msmtp,mariadb-client"
ARG APT_EXTRA_PACKAGES=""

# PHP: extensions to install.
ARG PHP_DEFAULT_EXTENSIONS="apcu,gd,opcache,pdo_mysql,uploadprogress"
ARG PHP_EXTRA_EXTENSIONS=""

# PHP: php.ini file to load (production or development).
ARG PHP_ENVIRONMENT=production

# Drupal.
ARG DRUPAL_SITE=default
ARG DOCROOT_FOLDER=web

###
# Build full app code.
###
FROM composer:2 AS build
ARG COMPOSER_INSTALL_ARGS="--ignore-platform-reqs --prefer-dist"
ARG COMPOSER_INSTALL_ARGS_EXTRA=""
ARG DRUPAL_SITE
ARG DOCROOT_FOLDER

WORKDIR /app

COPY $DOCROOT_FOLDER/sites/$DRUPAL_SITE/default.settings.php $DOCROOT_FOLDER/sites/$DRUPAL_SITE/settings.php
COPY patches patches
COPY composer.json composer.json
COPY composer.lock composer.lock

RUN --mount=type=cache,target=/tmp/cache set -eux; \
  composer install $COMPOSER_INSTALL_ARGS $COMPOSER_INSTALL_ARGS_EXTRA

COPY . .
RUN set -eux; \
  composer dumpautoload --optimize


###
# Put code on apache-php image and prepare execution environment.
###
FROM php:${PHP_VERSION}-apache-bookworm

ARG APT_DEFAULT_PACKAGES
ARG APT_EXTRA_PACKAGES
ARG PHP_DEFAULT_EXTENSIONS
ARG PHP_EXTRA_EXTENSIONS
ARG PHP_ENVIRONMENT
ARG DRUPAL_SITE
ARG DOCROOT_FOLDER
ARG GIT_COMMIT

# Install APT packages.
RUN set -eux; \
  apt-get update; \
  DEBIAN_FRONTEND=noninteractive \
  apt-get install -y --no-install-recommends \
    $(echo $APT_DEFAULT_PACKAGES $APT_EXTRA_PACKAGES | sed -s 's/,/ /g') \
  ; \
  \
  apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
  rm -rf /var/lib/apt/lists/*

# Enable Apache modules.
RUN set -eux; \
  if command -v a2enmod; then \
    a2enmod expires rewrite; \
  fi

# Install PHP extensions.
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN set -eux; \
  chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions \
    $(echo $PHP_DEFAULT_EXTENSIONS $PHP_EXTRA_EXTENSIONS | sed -s 's/,/ /g')

# Enable php.ini.
RUN cp /usr/local/etc/php/php.ini-$PHP_ENVIRONMENT /usr/local/etc/php/php.ini

# Copy over services configuration.
COPY docker/services/apache-php/ /

# Copy codebase from build stage.
COPY --from=build /app /var/www/html

# Adjust filesystem.
RUN mkdir -p private-files tmp translations $DOCROOT_FOLDER/sites/$DRUPAL_SITE/files $DOCROOT_FOLDER/sites/$DRUPAL_SITE/local/assets; \
  chown -R www-data:www-data private-files tmp translations $DOCROOT_FOLDER/sites/$DRUPAL_SITE/files $DOCROOT_FOLDER/sites/$DRUPAL_SITE/local; \
  chmod -R 2775 private-files tmp translations $DOCROOT_FOLDER/sites/$DRUPAL_SITE/files $DOCROOT_FOLDER/sites/$DRUPAL_SITE/local; \
  chmod ugo-w $DOCROOT_FOLDER/sites/$DRUPAL_SITE; \
  chown www-data:www-data $DOCROOT_FOLDER/sites/$DRUPAL_SITE/settings.*; \
  chmod 400 $DOCROOT_FOLDER/sites/$DRUPAL_SITE/settings.*

# Unique deploy identifier used by drupal/settingsphp.
ENV DEPLOYMENT_IDENTIFIER=$GIT_COMMIT

# Copy commit hash to a file.
RUN echo "$DEPLOYMENT_IDENTIFIER" > $DOCROOT_FOLDER/hash.txt

# Apache needs this for the vhost. See docker/services/apache-php/etc/apache2/sites-enabled/drupal.conf
ENV APP_DOMAIN=localhost
ENV APP_EXTRA_DOMAINS=drupal
ENV DOCROOT_FOLDER=$DOCROOT_FOLDER

# Make drush available in the path.
ENV PATH=${PATH}:/var/www/html/vendor/bin

CMD ["apache2-foreground"]

# vim:set ft=dockerfile:
