# syntax=docker/dockerfile:1.7
# AutoCRM — Laravel 12 + Filament + Octane FrankenPHP
# Multi-stage: composer install + npm build + runtime

# ─── Stage 1: Composer dependencies ───────────────────────────
FROM composer:2 AS composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install \
    --no-dev \
    --no-interaction \
    --no-progress \
    --no-scripts \
    --prefer-dist \
    --optimize-autoloader

# ─── Stage 2: Node assets (Vite) ──────────────────────────────
FROM node:22-alpine AS node
WORKDIR /app
COPY package.json package-lock.json* ./
RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi
COPY resources ./resources
COPY vite.config.js ./
COPY public ./public
RUN npm run build

# ─── Stage 3: Runtime (FrankenPHP + PHP 8.4) ──────────────────
FROM dunglas/frankenphp:latest-php8.4 AS runtime
WORKDIR /app

# Install PHP extensions Laravel needs
RUN install-php-extensions \
    pdo_mysql \
    pcntl \
    bcmath \
    intl \
    gd \
    zip \
    redis \
    opcache \
    pcntl \
    sockets \
    exif

# System tools
RUN apt-get update && apt-get install -y --no-install-recommends \
    git \
    unzip \
    curl \
 && rm -rf /var/lib/apt/lists/*

# Copy application code
COPY --link . /app
# Composer vendor from stage 1
COPY --from=composer --link /app/vendor /app/vendor
# Built assets from stage 2
COPY --from=node --link /app/public/build /app/public/build

# Permissions
RUN chown -R www-data:www-data storage bootstrap/cache \
 && chmod -R 0775 storage bootstrap/cache

# OPcache production config
RUN { \
    echo "opcache.enable=1"; \
    echo "opcache.enable_cli=1"; \
    echo "opcache.jit_buffer_size=128M"; \
    echo "opcache.jit=tracing"; \
    echo "opcache.memory_consumption=256"; \
    echo "opcache.max_accelerated_files=20000"; \
    echo "opcache.validate_timestamps=0"; \
    echo "opcache.preload=/app/storage/preload.php"; \
    echo "opcache.preload_user=www-data"; \
} > /usr/local/etc/php/conf.d/opcache.ini

ENV OCTANE_SERVER=frankenphp \
    APP_BASE_PATH=/app \
    SERVER_NAME=":8000"

EXPOSE 8000

# Healthcheck
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
  CMD curl -fsSL http://localhost:8000/up || exit 1

# Entrypoint script handles migrations + cache
COPY docker/entrypoint.sh /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint

ENTRYPOINT ["/usr/local/bin/entrypoint"]
CMD ["php", "artisan", "octane:start", "--server=frankenphp", "--host=0.0.0.0", "--port=8000", "--admin-port=2019", "--workers=auto", "--max-requests=500"]
