FROM dunglas/frankenphp:php8.4-alpine AS base

RUN install-php-extensions \
    intl \
    opcache \
    pdo_pgsql \
    zip

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /app

###
# Dev stage
###
FROM base AS dev

COPY composer.json composer.lock symfony.lock ./
RUN composer install --no-scripts --no-autoloader --prefer-dist

COPY . .
RUN composer dump-autoload

ENV APP_ENV=dev \
    SERVER_NAME=":80" \
    POSTGRES_HOST=database \
    POSTGRES_PORT=5432 \
    POSTGRES_VERSION=16 \
    POSTGRES_DB=app \
    POSTGRES_USER=app \
    POSTGRES_PASSWORD=pwd

###
# Composer install stage (provides vendor assets for node build)
###
FROM base AS composer-deps

COPY composer.json composer.lock symfony.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist

###
# Node build stage (for prod assets)
###
FROM node:22-alpine AS node-build

WORKDIR /app

# Copy vendor UX assets so npm can resolve file: dependencies
COPY --from=composer-deps /app/vendor/symfony/ux-react/assets vendor/symfony/ux-react/assets

COPY package.json package-lock.json* ./
RUN npm install

COPY assets/ ./assets/
COPY vite.config.js ./

RUN npm run build

###
# Prod stage
###
FROM base AS prod

COPY composer.json composer.lock symfony.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist

COPY . .

# Copy Vite-built assets
COPY --from=node-build /app/public/build /app/public/build

RUN APP_ENV=prod composer dump-autoload --classmap-authoritative \
    && APP_ENV=prod composer run-script post-install-cmd \
    && chown -R www-data:www-data var/

ENV APP_ENV=prod \
    SERVER_NAME=localhost \
    POSTGRES_HOST=database \
    POSTGRES_PORT=5432 \
    POSTGRES_VERSION=16 \
    POSTGRES_DB=app \
    POSTGRES_USER=app \
    POSTGRES_PASSWORD=pwd
