# ── Stage 1: Build assets (Vite) ─────────────────────────────────────────────
FROM node:20-alpine AS node-builder
WORKDIR /app

# Instala build essentials para packages nativos
RUN apk add --no-cache build-base python3

# Copia package files e instala dependências
COPY package*.json ./
RUN npm ci

# Copia código e compila assets
COPY . .
RUN npm run build --verbose && \
    test -f public/build/manifest.json || (echo "ERROR: Vite manifest not generated!" && ls -la public/ && exit 1)

# ── Stage 2: PHP dependencies (Composer) ─────────────────────────────────────
FROM composer:2 AS composer-builder
WORKDIR /app

# Instala dependências necessárias para o composer validar extensões de plataforma
RUN apk add --no-cache icu-dev \
    && docker-php-ext-install intl

COPY composer.json composer.lock ./
RUN composer install \
    --no-interaction \
    --no-scripts \
    --prefer-dist \
    --optimize-autoloader
COPY . .
RUN composer dump-autoload --optimize --no-scripts

# ── Stage 3: Imagem de produção ───────────────────────────────────────────────
FROM php:8.3-fpm-alpine

ARG GITHUB_REPOSITORY="valuor/ticketpro"
LABEL org.opencontainers.image.source="https://github.com/${GITHUB_REPOSITORY}"
LABEL org.opencontainers.image.description="TicketPRO — Valuor Service Platform"

# Dependências de sistema
RUN apk update --no-cache \
    && apk add --no-cache \
        nginx \
        supervisor \
        libpng \
        libjpeg-turbo \
        freetype \
        libzip \
        libxml2 \
        oniguruma \
        icu-libs \
        icu-data-full \
        curl \
        bash \
        nodejs \
        npm \
        git \
        unzip \
        mysql-client \
    && apk add --no-cache --virtual .build-deps \
        libpng-dev \
        libjpeg-turbo-dev \
        freetype-dev \
        libzip-dev \
        libxml2-dev \
        oniguruma-dev \
        icu-dev \
        sqlite-dev \
        $PHPIZE_DEPS \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) \
        pdo_mysql \
        pdo_sqlite \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip \
        intl \
        opcache \
    && pecl install redis \
    && docker-php-ext-enable redis \
    && apk del .build-deps \
    && rm -rf /var/cache/apk/* /tmp/pear*

# Configurações PHP
COPY docker/php/php.ini /usr/local/etc/php/conf.d/99-custom.ini
COPY docker/php/www.conf /usr/local/etc/php-fpm.d/www.conf

# Configuração Nginx
COPY docker/nginx/default.conf /etc/nginx/http.d/default.conf
RUN rm -f /etc/nginx/http.d/default.conf.bak 2>/dev/null; \
    mkdir -p /var/log/nginx /run/nginx

# Configuração Supervisor
COPY docker/php/supervisord.conf /etc/supervisor/conf.d/app.conf

# Entrypoint
COPY docker/php/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Código da aplicação
WORKDIR /var/www/html
COPY --from=composer-builder /usr/bin/composer /usr/bin/composer
COPY --from=composer-builder /app/vendor ./vendor
COPY --from=node-builder /app/public ./public
COPY . .

# Permissões
RUN mkdir -p \
        storage/framework/cache \
        storage/framework/sessions \
        storage/framework/views \
        storage/framework/testing \
        storage/app/public \
        storage/logs \
        bootstrap/cache \
    && chown -R www-data:www-data /var/www/html \
    && chmod -R 775 storage bootstrap/cache

# Limpa qualquer resquício de cache do Windows e gera o manifest em um ambiente Linux limpo.
# DB_CONNECTION=sqlite com banco em memória garante que o boot do framework aconteça sem erros de conexão.
RUN rm -f bootstrap/cache/*.php \
    && DB_CONNECTION=sqlite DB_DATABASE=:memory: php artisan package:discover --ansi

EXPOSE 80

HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
    CMD curl -f http://localhost/up || exit 1

ENTRYPOINT ["/entrypoint.sh"]
CMD ["web"]
