# Multi-stage build для оптимизации размера образа

# Development stage
FROM node:20-alpine AS development

WORKDIR /app

# Аргументы сборки для Next.js (должны быть доступны во время сборки)
ARG NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_WS_URL
ARG NEXT_PUBLIC_LIVEKIT_URL

ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL
ENV NODE_ENV=development
ENV HOSTNAME=0.0.0.0
ENV WATCHPACK_POLLING=true
ENV CHOKIDAR_USEPOLLING=true

# Копируем package files
COPY package*.json ./

# Устанавливаем зависимости
RUN npm install

# Копируем остальные файлы (при запуске в compose поверх монтируется volume)
COPY . .

# Entrypoint: при volume-монтировании /app/node_modules при первом запуске пуст — ставим зависимости
RUN echo '#!/bin/sh' > /entrypoint.sh && \
    echo 'set -e' >> /entrypoint.sh && \
    echo 'if [ ! -d node_modules/next ] 2>/dev/null || [ ! -f node_modules/.package-lock.json ] 2>/dev/null; then npm install; fi' >> /entrypoint.sh && \
    echo 'exec npx next dev --webpack --hostname 0.0.0.0' >> /entrypoint.sh && \
    chmod +x /entrypoint.sh

# Открываем порт
EXPOSE 3000

ENTRYPOINT ["/entrypoint.sh"]

# Production dependencies stage
FROM node:20-alpine AS production-deps

WORKDIR /app

# Копируем package files
COPY package*.json ./

# Устанавливаем только production зависимости
RUN npm ci --only=production && npm cache clean --force

# Production build stage
FROM node:20-alpine AS production-build

WORKDIR /app

# Аргументы сборки для Next.js
ARG NEXT_PUBLIC_API_URL
ARG NEXT_PUBLIC_WS_URL
ARG NEXT_PUBLIC_LIVEKIT_URL

ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL
ENV NEXT_PUBLIC_LIVEKIT_URL=$NEXT_PUBLIC_LIVEKIT_URL

# Копируем package files
COPY package*.json ./

# Устанавливаем все зависимости для сборки
RUN npm ci

# Копируем исходный код
COPY . .

# Папка public может отсутствовать — Next.js работает и без неё
RUN mkdir -p public

# Собираем приложение с оптимизацией
ENV NODE_ENV=production
RUN npm run build

# Production stage
FROM node:20-alpine AS production

WORKDIR /app

# Копируем собранное приложение (standalone mode)
COPY --from=production-build /app/.next/standalone ./
COPY --from=production-build /app/.next/static ./.next/static
COPY --from=production-build /app/public ./public

# Создаем непривилегированного пользователя
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
RUN chown -R nextjs:nodejs /app
USER nextjs

# Открываем порт
EXPOSE 3000

ENV NODE_ENV=production
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"

# Запускаем production server
CMD ["node", "server.js"]
