FROM php:8.4-fpm-alpine AS base

# System dependencies for PHP extensions
RUN apk add --no-cache \
        bash \
        git \
        su-exec \
        icu-dev \
        libzip-dev \
        zlib-dev \
        libpng-dev \
        libjpeg-turbo-dev \
        freetype-dev \
        oniguruma-dev \
        $PHPIZE_DEPS \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j"$(nproc)" \
        pdo_mysql \
        mbstring \
        bcmath \
        gd \
        zip \
        intl \
        exif \
        pcntl \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apk del $PHPIZE_DEPS

# Composer (pulled from the official image)
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# Match the host user so generated/written files stay editable on the host.
# Relevant for the dev compose (bind-mounted code); in prod the entrypoint
# drops privileges to this user too.
ARG UID=1000
ARG GID=1000
RUN addgroup -g ${GID} app 2>/dev/null || true \
    && adduser -D -u ${UID} -G app app 2>/dev/null || adduser -D -u ${UID} app 2>/dev/null || true

# --- Composer dependencies: cached unless composer files change ---
FROM base AS vendor

COPY composer.json composer.lock ./
RUN composer install \
        --no-interaction \
        --no-progress \
        --prefer-dist \
        --no-dev \
        --no-scripts \
        --no-autoloader

# --- Frontend assets: cached unless sources change ---
FROM node:22-alpine AS assets

WORKDIR /var/www/html
COPY package.json package-lock.json* ./
RUN npm install --no-audit --no-fund
COPY vite.config.js ./
COPY resources ./resources
RUN npm run build

# --- Final PHP-FPM image ---
FROM base AS app

COPY --chown=app:app . /var/www/html
COPY --from=vendor --chown=app:app /var/www/html/vendor ./vendor
COPY --from=assets --chown=app:app /var/www/html/public/build ./public/build

RUN composer dump-autoload --optimize --no-interaction --no-dev \
    && php artisan storage:link \
    && chown -R app:app /var/www/html/storage /var/www/html/bootstrap/cache

COPY docker/php/prod-entrypoint.sh /usr/local/bin/prod-entrypoint
RUN chmod +x /usr/local/bin/prod-entrypoint

# Default (dev) behaviour: run as the host-matched user, just php-fpm.
# The prod compose overrides the entrypoint to run migrations/caching.
USER app
EXPOSE 9000
CMD ["php-fpm"]

# --- Caddy web server with the built public assets baked in ---
FROM caddy:2-alpine AS web

COPY docker/caddy/Caddyfile /etc/caddy/Caddyfile
COPY --from=app /var/www/html/public /var/www/html/public
