# Image PHP-FPM cho Laravel, dựng trên Alpine.
#
# Bản cũ dùng `php:8.4-fpm` (nền Debian) và nặng 866 MB. Phần lớn dung lượng đó là thư viện
# hệ thống không dùng tới lúc chạy: trình biên dịch, header của libpng/libzip, và cả
# Composer nằm lại trong image chạy thật.
#
# Ở đây tách hai tầng: tầng build có toolchain và Composer, tầng chạy chỉ giữ đúng phần
# mở rộng PHP đã biên dịch. Có 2 container dùng chung image này (app, queue) nên phần
# tiết kiệm được nhân đôi.

# ─── Tầng 1: biên dịch extension + cài vendor ──────────────────────────────
FROM php:8.4-fpm-alpine AS build

# `.build-deps` là nhóm ảo: gỡ nguyên nhóm sau khi biên dịch xong, không sót header nào.
RUN apk add --no-cache --virtual .build-deps \
        $PHPIZE_DEPS libpng-dev oniguruma-dev libxml2-dev libzip-dev icu-dev \
    && apk add --no-cache libpng oniguruma libzip icu-libs \
    && docker-php-ext-install -j"$(nproc)" \
        pdo_mysql mbstring exif pcntl bcmath gd zip \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apk del .build-deps

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

WORKDIR /var/www/html

# Chép manifest trước mã nguồn: sửa code mà không đụng composer.json thì tầng cài
# dependency vẫn dùng lại được cache.
COPY backend/composer.json backend/composer.lock ./

RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist --no-interaction

COPY backend .

RUN composer dump-autoload --optimize --no-dev

# ─── Tầng 2: image chạy thật ───────────────────────────────────────────────
FROM php:8.4-fpm-alpine AS runtime

# Chỉ thư viện lúc chạy, không có header lẫn trình biên dịch.
RUN apk add --no-cache libpng oniguruma libzip icu-libs

# Extension đã biên dịch ở tầng build, bê thẳng sang.
COPY --from=build /usr/local/lib/php/extensions /usr/local/lib/php/extensions
COPY --from=build /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d
COPY docker/php/uploads.ini /usr/local/etc/php/conf.d/uploads.ini

# OPcache có sẵn trong image nhưng để mặc định kiểu dev. Ở production, tắt kiểm tra
# thời gian sửa tệp là bớt được một lần stat() cho MỖI tệp PHP ở MỖI request.
# Lưu ý: bật cái này thì sửa code xong phải restart container mới có hiệu lực.
RUN { \
        echo 'opcache.enable=1'; \
        echo 'opcache.memory_consumption=256'; \
        echo 'opcache.interned_strings_buffer=16'; \
        echo 'opcache.max_accelerated_files=20000'; \
        echo 'opcache.validate_timestamps=0'; \
    } > /usr/local/etc/php/conf.d/opcache.ini

WORKDIR /var/www/html

COPY --from=build --chown=www-data:www-data /var/www/html /var/www/html
COPY docker/php/entrypoint.sh /usr/local/bin/toolchat-entrypoint

RUN chmod +x /usr/local/bin/toolchat-entrypoint \
    && chown -R www-data:www-data storage bootstrap/cache

EXPOSE 9000

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