# Multi-stage build для оптимального размера
FROM node:20-alpine AS base

# Установка зависимостей для сборки
RUN apk add --no-cache libc6-compat curl

# Dependencies stage
FROM base AS deps
WORKDIR /app

# Копирование файлов зависимостей
COPY package.json package-lock.json* ./

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

# Builder stage
FROM base AS builder
WORKDIR /app

# Копирование зависимостей из предыдущего stage
COPY --from=deps /app/node_modules ./node_modules

# Копирование исходного кода
COPY . .

# Build arguments
ARG BUILD_VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
ARG NEXT_PUBLIC_API_URL

# Переменные окружения для сборки
ENV NODE_ENV=production \
    NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
    BUILD_VERSION=$BUILD_VERSION

# Генерация статических файлов Next.js
RUN npm run build

# Production stage
FROM node:20-alpine AS runner

# Build arguments для метаданных
ARG BUILD_VERSION=latest
ARG BUILD_DATE
ARG VCS_REF

# Метаданные образа
LABEL org.opencontainers.image.title="CatLink Frontend" \
      org.opencontainers.image.description="Next.js приложение для CatLink" \
      org.opencontainers.image.version="$BUILD_VERSION" \
      org.opencontainers.image.created="$BUILD_DATE" \
      org.opencontainers.image.revision="$VCS_REF" \
      org.opencontainers.image.source="https://github.com/smartsoltech/links"

WORKDIR /app

# Создание пользователя приложения
RUN addgroup --system --gid 1001 nodejs && \
    adduser --system --uid 1001 nextjs

# Копирование собранного приложения
COPY --from=builder /app/public ./public

# Копирование статических файлов
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

# Переменные окружения
ENV NODE_ENV=production \
    PORT=3000 \
    HOSTNAME="0.0.0.0"

# Переключение на пользователя приложения
USER nextjs

# Health check
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:$PORT/health || exit 1

# Открытие порта
EXPOSE $PORT

# Команда запуска
CMD ["node", "server.js"]