ARG COMPOSER_IMAGE=composer:2.9.5@sha256:698d3801b2a622ace460c4743c781282fcbcb733a4cbf8b31c44731e846585e8
ARG NODE_IMAGE=node:22-bookworm-slim@sha256:d649c27dae7ba0137b3cef5dd75baa422c08dc3d9e3fc0c23dfb172dc3cc6436
ARG PHP_IMAGE=php:8.4-fpm-bookworm@sha256:c5fb7a0c02f4efe280691910c8b734995fa83598cdcf3115ef5dcb2e4617681c

FROM ${COMPOSER_IMAGE} AS composer_binary
FROM ${NODE_IMAGE} AS node_binary

FROM ${PHP_IMAGE} AS php_base

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        gettext-base \
        git \
        libfcgi-bin \
        libfreetype6-dev \
        libicu-dev \
        libjpeg62-turbo-dev \
        libmagickwand-dev \
        libonig-dev \
        libpng-dev \
        libpq-dev \
        libsqlite3-dev \
        libssl-dev \
        libxml2-dev \
        libzip-dev \
        nginx \
        procps \
        unzip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j"$(nproc)" \
        bcmath \
        gd \
        intl \
        opcache \
        pcntl \
        pdo_mysql \
        pdo_pgsql \
        pdo_sqlite \
        pgsql \
        soap \
        zip \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY --from=composer_binary /usr/bin/composer /usr/local/bin/composer

WORKDIR /var/www

FROM php_base AS build

COPY --from=node_binary /usr/local/ /usr/local/
COPY . /var/www

RUN composer install --prefer-dist --no-interaction --no-progress \
    && corepack enable pnpm \
    && pnpm install --frozen-lockfile \
    && pnpm run build

FROM build AS test

RUN cp .env.example .env \
    && php artisan key:generate\
    && composer audit --locked --no-interaction \
    && COMPOSER_ALLOW_SUPERUSER=1 composer ci:check

FROM build AS production_builder

RUN composer install \
        --classmap-authoritative \
        --no-dev \
        --no-interaction \
        --no-progress \
        --prefer-dist \
    && rm -rf node_modules tests phpunit.xml

FROM php_base AS runtime

COPY docker/entrypoint.sh /usr/local/bin/kanbangit-entrypoint
COPY docker/nginx/nginx.conf.template /etc/nginx/nginx.conf.template
COPY docker/php-fpm-healthcheck.sh /usr/local/bin/php-fpm-healthcheck
COPY --from=production_builder --chown=www-data:www-data /var/www /var/www

RUN chmod +x /usr/local/bin/kanbangit-entrypoint /usr/local/bin/php-fpm-healthcheck \
    && mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
    && printf '%s\n' \
        '[global]' \
        'daemonize = no' \
        '' \
        '[www]' \
        'pm.status_path = /status' \
        > /usr/local/etc/php-fpm.d/zz-kanbangit.conf \
    && mkdir -p \
        /var/www/bootstrap/cache \
        /var/www/storage/app/public \
        /var/www/storage/framework/cache \
        /var/www/storage/framework/sessions \
        /var/www/storage/framework/testing \
        /var/www/storage/framework/views \
        /var/www/storage/logs \
    && ln -s ../storage/app/public /var/www/public/storage \
    && chown -R www-data:www-data /var/www/bootstrap/cache /var/www/storage

USER www-data

EXPOSE 8080 9000

ENTRYPOINT ["kanbangit-entrypoint"]
CMD ["php-fpm"]
