
# =========================
# Stage 1: Base runtime
# =========================
FROM php:8.1-fpm-alpine AS base

LABEL maintainer="support@cyber-duck.co.uk"
ENV COMPOSER_MEMORY_LIMIT="-1"

# Runtime libs only (no *-dev here)
RUN apk add --no-cache \
      btop git curl tzdata openssh \
      mariadb-client postgresql-client \
      unzip shadow supervisor cronie \
      libpng libjpeg-turbo freetype imagemagick libzip libxml2 gmp icu \
      libmemcached-libs cyrus-sasl

# =========================
# Stage 2: Build extensions
# =========================
FROM base AS build

# Toolchain + headers (+ linux-headers for xdebug on Alpine)
RUN apk add --no-cache --virtual .build-deps \
      $PHPIZE_DEPS \
      build-base autoconf pkgconf re2c \
      linux-headers \
      libpng-dev libjpeg-turbo-dev freetype-dev \
      imagemagick-dev libzip-dev zlib-dev \
      libxml2-dev gmp-dev icu-dev \
      postgresql-dev libmemcached-dev cyrus-sasl-dev

# Core PHP extensions
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
  && docker-php-ext-install -j$(nproc) \
       gd exif pcntl zip pdo_mysql pdo_pgsql bcmath intl gmp soap opcache

# PECL modules
RUN pecl install redis \
  && docker-php-ext-enable redis \
  && pecl install xdebug \
  && docker-php-ext-enable xdebug \
  && pecl install imagick \
  && docker-php-ext-enable imagick \
  && pecl install memcached \
  && docker-php-ext-enable memcached

# Stash the compiled extension dir + existing conf.d
RUN set -eux; \
    EXT_DIR="$(php -r 'echo ini_get("extension_dir");')"; \
    mkdir -p /build-out/extensions /build-out/conf.d; \
    cp -a "${EXT_DIR}/." /build-out/extensions/; \
    cp -a /usr/local/etc/php/conf.d/* /build-out/conf.d/ || true

# =========================
# Stage 3: Runtime image
# =========================
FROM base AS runtime

# Your config files
# NOTE: opcache.ini must NOT have `zend_extension=opcache`
# (optional but nice to keep it self-documented)
ENV PHP_EXT_DIR=/usr/local/lib/php/extensions/no-debug-non-zts-20210902

# Copy compiled extensions & default conf.d from BUILD
COPY --from=build /build-out/extensions/ ${PHP_EXT_DIR}/
COPY --from=build /build-out/conf.d/ /usr/local/etc/php/conf.d/

# Your custom INIs last (override defaults)
COPY xdebug.ini   /usr/local/etc/php/conf.d/zz-xdebug.ini
COPY opcache.ini  /usr/local/etc/php/conf.d/zz-opcache.ini
COPY laravel.ini  /usr/local/etc/php/conf.d/zz-laravel.ini

# Composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer \
  && chmod +x /usr/local/bin/composer

# Cron: Laravel scheduler (runs as www-data via su)
RUN echo "* * * * * su -s /bin/sh -c '/usr/local/bin/php /var/www/artisan schedule:run >/dev/null 2>&1' www-data" >> /etc/crontabs/root

# Helper shims
RUN printf '#!/bin/sh\nexec /usr/local/bin/php /var/www/vendor/bin/dep "$@"\n' > /usr/bin/dep \
  && printf '#!/bin/sh\nexec /usr/local/bin/php /var/www/artisan "$@"\n' > /usr/bin/art \
  && printf '#!/bin/sh\nexec /usr/local/bin/php /var/www/artisan migrate "$@"\n' > /usr/bin/migrate \
  && printf '#!/bin/sh\nexec /usr/local/bin/php /var/www/artisan migrate:fresh --seed\n' > /usr/bin/fresh \
  && printf '#!/bin/sh\n/usr/local/bin/php /var/www/artisan config:clear\nexec /var/www/vendor/bin/phpunit -d memory_limit=2G --stop-on-error --stop-on-failure --testdox-text=tests/report.txt \"$@\"\n' > /usr/bin/t \
  && printf '#!/bin/sh\n/usr/local/bin/php /var/www/artisan config:clear\nexec /usr/local/bin/php /var/www/artisan dusk -d memory_limit=2G --stop-on-error --stop-on-failure --testdox-text=tests/report-dusk.txt \"$@\"\n' > /usr/bin/d \
  && chmod +x /usr/bin/dep /usr/bin/art /usr/bin/migrate /usr/bin/fresh /usr/bin/t /usr/bin/d

# Supervisor
RUN mkdir -p /var/log/supervisor /etc/supervisor/conf.d
COPY supervisord.conf /etc/supervisord.conf
COPY supervisor/laravel-worker.conf /etc/supervisor/conf.d/laravel-worker.conf
# (tip) set `user=www-data` inside laravel-worker.conf to remove the root warning

# Writable dirs
RUN mkdir -p bootstrap/cache storage/framework/{cache,sessions,views,testing,cache/data} \
  && chown -R www-data:www-data bootstrap storage

WORKDIR /var/www
#COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
#RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
#  && ln -s /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh

RUN apk add --no-cache bash

# Align UID with host (optional)
RUN usermod -u 1000 www-data || true

COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
 && ln -sf /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh

EXPOSE 9000

# use absolute path (explicit)
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]

#ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["php-fpm"]
