# syntax=docker/dockerfile:1

# --- Stage 0: Сборка Rust/Wasm ---
FROM rust:1.80-slim AS wasm-builder

RUN apt-get update && apt-get install -y pkg-config libssl-dev curl && \
    curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

WORKDIR /build
COPY ./matrix-engine ./matrix-engine

WORKDIR /build/matrix-engine
# Собираем Wasm. Кэширование теперь полагается на слои Docker (Registry Cache)
RUN cargo install wasm-bindgen-cli --version 0.2.100 --locked
RUN wasm-pack build --target web --release

# --- Stage 1: Установка зависимостей Node.js ---
FROM node:20-alpine AS deps
WORKDIR /app
RUN npm install -g pnpm
COPY package.json pnpm-lock.yaml* ./
RUN pnpm install --frozen-lockfile

# --- Stage 2: Сборка Next.js ---
FROM node:20-alpine AS builder
WORKDIR /app
RUN npm install -g pnpm
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# 1. Создаем директорию для статики движка
RUN mkdir -p ./public/wasm-matrix/

# 2. Копируем результат компиляции Rust (wasm, glue js)
COPY --from=wasm-builder /build/matrix-engine/pkg/* ./public/wasm-matrix/

# 3. КОПИРУЕМ КЛИЕНТСКИЕ ФАЙЛЫ ВОРКЕРА
RUN cp matrix-engine/matrix_worker.js ./public/wasm-matrix/ && \
    cp matrix-engine/shaders.js ./public/wasm-matrix/ && \
    cp matrix-engine/gl-utils.js ./public/wasm-matrix/

# 3.1 Прописываем cache-busting версию (ENGINE_VERSION из NetrunnerMatrix.tsx)
# в импорты воркера. Без этого matrix_worker.js?v=X кэш-бастится сам по себе
# (см. NetrunnerMatrix.tsx), а его собственные `import ... from "./shaders.js"`
# и "./gl-utils.js" — нет: после деплоя браузер/CDN может отдать по тому же
# пути старую версию этих файлов, воркер не найдёт в ней нужный экспорт,
# упадёт молча и никогда не пришлёт READY — на экране просто фон Hero
# (белый/чёрный по теме) вместо матрицы, до жёсткой перезагрузки страницы.
RUN ENGINE_VERSION=$(sed -n 's/.*ENGINE_VERSION = "\([^"]*\)".*/\1/p' matrix-engine/NetrunnerMatrix.tsx | head -1) && \
    sed -i \
        -e "s/^const version = \".*\";/const version = \"${ENGINE_VERSION}\";/" \
        -e "s/from \"\.\/shaders\.js\";/from \".\/shaders.js?v=${ENGINE_VERSION}\";/" \
        -e "s/from \"\.\/gl-utils\.js\";/from \".\/gl-utils.js?v=${ENGINE_VERSION}\";/" \
        ./public/wasm-matrix/matrix_worker.js

# 4. Собираем Next.js
ENV NEXT_TELEMETRY_DISABLED=1
RUN pnpm run build

# --- Stage 3: Продакшен сервер ---
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
USER nextjs

COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json

EXPOSE 3000
CMD ["npm", "start"]