# 多阶段构建Dockerfile - Laravel知识库系统 (Swoole版本)
# 确保构建为linux/amd64架构

# ================================
# 基础阶段 - 安装系统依赖
# ================================
FROM php:8.2-cli-alpine AS base

# 设置工作目录
WORKDIR /var/www/html

# 安装系统依赖
RUN apk add --no-cache \
    # 基础工具
    curl \
    git \
    unzip \
    zip \
    # PHP扩展依赖
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    libzip-dev \
    icu-dev \
    oniguruma-dev \
    # Pandoc文档转换工具
    pandoc \
    # LibreOffice用于生成高保真PDF预览，Noto CJK用于中文字体渲染
    libreoffice \
    font-noto-cjk \
    ttf-dejavu \
    # Node.js和npm (使用较小的版本)
    nodejs \
    npm \
    # 进程管理
    supervisor

# 配置和安装PHP扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) \
        pdo_mysql \
        mysqli \
        zip \
        gd \
        intl \
        mbstring \
        opcache \
        bcmath \
        exif \
        pcntl

# 安装Redis和Swoole扩展
RUN apk add --no-cache --virtual .build-deps $PHPIZE_DEPS linux-headers \
    && pecl install redis-6.0.2 swoole-5.1.1 \
    && docker-php-ext-enable redis swoole \
    && apk del .build-deps

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# ================================
# 构建阶段 - 安装依赖和构建资源
# ================================
FROM base AS builder

# 复制composer文件
COPY composer.json composer.lock ./

# 复制源代码（需要artisan文件）
COPY . .

# 安装PHP依赖（生产环境）
RUN composer install --no-dev --optimize-autoloader --no-interaction --no-progress

# 复制package.json文件
COPY package.json package-lock.json ./

# 安装NPM依赖（包括开发依赖用于构建）
RUN npm ci

# 构建前端资源
RUN npm run build

# 设置Laravel缓存和优化
RUN php artisan config:cache \
    && php artisan route:cache \
    && php artisan view:cache

# ================================
# 生产阶段 - 最终镜像
# ================================
FROM base AS production

# 确保www-data用户存在（Alpine中可能已存在）
RUN if ! getent group www-data > /dev/null 2>&1; then \
        addgroup -g 82 -S www-data; \
    fi \
    && if ! getent passwd www-data > /dev/null 2>&1; then \
        adduser -u 82 -D -S -G www-data www-data; \
    fi

# 复制PHP配置（仅保留基础PHP配置，移除PHP-FPM配置）
COPY docker/php/php.ini /usr/local/etc/php/php.ini

# 复制Supervisor配置（更新为Swoole版本）
COPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 复制健康检查脚本
COPY docker/queue-health-check.sh /usr/local/bin/queue-health-check.sh
COPY docker/swoole-health-check.sh /usr/local/bin/swoole-health-check.sh
RUN chmod +x /usr/local/bin/queue-health-check.sh \
    && chmod +x /usr/local/bin/swoole-health-check.sh

# 从构建阶段复制应用文件
COPY --from=builder --chown=www-data:www-data /var/www/html /var/www/html

# 创建必要的目录并设置权限
RUN mkdir -p /var/www/html/storage/logs \
    && mkdir -p /var/www/html/storage/framework/cache \
    && mkdir -p /var/www/html/storage/framework/sessions \
    && mkdir -p /var/www/html/storage/framework/views \
    && mkdir -p /var/www/html/bootstrap/cache \
    && mkdir -p /var/log/supervisor \
    && mkdir -p /var/log \
    && chown -R www-data:www-data /var/www/html/storage \
    && chown -R www-data:www-data /var/www/html/bootstrap/cache \
    && chmod -R 775 /var/www/html/storage \
    && chmod -R 775 /var/www/html/bootstrap/cache

# 暴露Swoole端口
EXPOSE 8000

# 健康检查 - 使用Swoole健康检查脚本
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD /usr/local/bin/swoole-health-check.sh || exit 1

# 使用supervisor启动多个服务
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
