# ============================================================
# match_12 – Synology NAS Docker イメージ
# PHP 8.3 + Nginx + Node.js 20 + Python 3
# ============================================================

# --- Stage 1: フロントエンドビルド ---
FROM node:20-alpine AS frontend

WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY vite.config.js ./
COPY resources/ ./resources/
COPY public/ ./public/
RUN npm run build

# --- Stage 2: Composer 依存インストール ---
FROM composer:2 AS composer

# simplito/elliptic-php が ext-gmp を要求するためインストール
RUN apk add --no-cache gmp-dev && docker-php-ext-install gmp

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

COPY . .
RUN composer dump-autoload --optimize

# --- Stage 3: 本番イメージ ---
FROM php:8.3-fpm-bookworm

# システムパッケージ
RUN apt-get update && apt-get install -y --no-install-recommends \
    nginx \
    supervisor \
    cron \
    acl \
    sqlite3 \
    libsqlite3-dev \
    libzip-dev \
    libpng-dev \
    libjpeg62-turbo-dev \
    libwebp-dev \
    libfreetype6-dev \
    libonig-dev \
    libxml2-dev \
    libcurl4-openssl-dev \
    libgmp-dev \
    imagemagick \
    libheif-dev \
    libheif-examples \
    default-mysql-client \
    ffmpeg \
    python3 \
    python3-pip \
    python3-venv \
    curl \
    unzip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
    && docker-php-ext-install -j$(nproc) \
        pdo_sqlite \
        pdo_mysql \
        zip \
        gd \
        mbstring \
        xml \
        curl \
        bcmath \
        gmp \
        pcntl \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Composer インストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Node.js 20 インストール（Debian 公式リポジトリ経由）
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Docker CLI インストール（メルカリサーバー再起動用、ホストの docker.sock をマウントして使用）
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker.gpg \
    && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/debian bookworm stable" \
       > /etc/apt/sources.list.d/docker.list \
    && apt-get update && apt-get install -y --no-install-recommends docker-ce-cli docker-compose-plugin \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# PHP 設定
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php.ini "$PHP_INI_DIR/conf.d/99-custom.ini"

# Nginx 設定
COPY docker/nginx.conf /etc/nginx/sites-available/default

# Supervisor 設定
COPY docker/supervisord.conf /etc/supervisor/conf.d/app.conf

# Laravel cron（スケジューラ）– /etc/cron.d 形式はユーザー指定が必要
RUN echo "* * * * * www-data cd /var/www/html && /usr/local/bin/php artisan schedule:run >> /var/www/html/storage/logs/scheduler.log 2>&1" \
    > /etc/cron.d/laravel-scheduler \
    && echo "" >> /etc/cron.d/laravel-scheduler \
    && chmod 0644 /etc/cron.d/laravel-scheduler

WORKDIR /var/www/html

# Composer 成果物コピー
COPY --from=composer /app/vendor ./vendor
COPY . .

# フロントエンドビルド成果物コピー
COPY --from=frontend /app/public/build ./public/build

# Python 仮想環境セットアップ
RUN python3 -m venv /opt/python-venv \
    && /opt/python-venv/bin/pip install --no-cache-dir --upgrade pip
# Hyperliquid SDK
COPY python/hyperliquid/requirements_hl.txt /tmp/requirements_hl.txt
RUN /opt/python-venv/bin/pip install --no-cache-dir -r /tmp/requirements_hl.txt 2>/dev/null || true
# Rakuten lottery
COPY python/rakuten-lottery/requirements.txt /tmp/requirements_rakuten.txt
RUN /opt/python-venv/bin/pip install --no-cache-dir -r /tmp/requirements_rakuten.txt 2>/dev/null || true
# HEIC→JPEG 変換
RUN /opt/python-venv/bin/pip install --no-cache-dir pillow-heif 2>/dev/null || true
# PSD→PNG 変換（レイヤー解析・合成）
COPY python/psd-convert/requirements.txt /tmp/requirements_psd.txt
RUN /opt/python-venv/bin/pip install --no-cache-dir -r /tmp/requirements_psd.txt 2>/dev/null || true
# 競馬 ML（LightGBM 勝率予測）
COPY python/horse-racing-ml/requirements.txt /tmp/requirements_horse_ml.txt
RUN /opt/python-venv/bin/pip install --no-cache-dir -r /tmp/requirements_horse_ml.txt 2>/dev/null || true

ENV PATH="/opt/python-venv/bin:$PATH"

# パーミッション設定（setgid + ACL で新規ファイルにも権限を継承）
# setfacl は Synology NAS の overlay FS 等 ACL 非対応環境で "Operation not supported" になるため非致命化。
# ACL はランタイム側（entrypoint.sh / デプロイ時）でも再設定されるためビルドでは失敗させない。
RUN chown -R www-data:www-data /var/www/html \
    && find storage bootstrap/cache -type d -exec chmod 2775 {} \; \
    && find storage bootstrap/cache -type f -exec chmod 664 {} \; \
    && (setfacl -R -m u:www-data:rwx -m g:www-data:rwx storage bootstrap/cache 2>/dev/null || true) \
    && (setfacl -R -d -m u:www-data:rwx -m g:www-data:rwx storage bootstrap/cache 2>/dev/null || true)

# エントリーポイント
COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

EXPOSE 80 443 8080

ENTRYPOINT ["entrypoint.sh"]
CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/app.conf"]
