# syntax=docker/dockerfile:1

# ---- Stage 1: build frontend assets ----
FROM node:20-alpine AS node_builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY resources/ resources/
COPY vite.config.js tailwind.config.js postcss.config.js ./
RUN npm run build

# ---- Stage 2: install PHP dependencies ----
FROM composer:2 AS composer_builder
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --optimize --no-dev

# ---- Stage 3: runtime image ----
FROM php:8.2-fpm-alpine AS app

RUN apk add --no-cache \
        libzip-dev \
        zip \
        icu-dev \
        oniguruma-dev \
        mariadb-client \
    && docker-php-ext-install \
        pdo_mysql \
        bcmath \
        zip \
        intl \
        opcache \
        pcntl \
        posix \
    && pecl install redis \
    && docker-php-ext-enable redis

WORKDIR /var/www/html

COPY --from=composer_builder /app /var/www/html
# Baked into a separate path (not the volume mount point) so the entrypoint
# can sync fresh assets into the shared volume on every container start,
# even when public/build is overlaid by a named volume from a prior release.
COPY --from=node_builder /app/public/build /var/www/html/public-build-release

COPY docker/php/opcache.ini /usr/local/etc/php/conf.d/opcache.ini
COPY docker/php/security.ini /usr/local/etc/php/conf.d/security.ini
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

ENTRYPOINT ["entrypoint.sh"]
CMD ["php-fpm"]
