# Peikarband Platform - Production Dockerfile
# Multi-stage build for optimized image size and security

# Build arguments
ARG PYTHON_VERSION=3.11
ARG NODE_VERSION=20
ARG VERSION=latest
ARG BUILD_DATE

# ============================================
# Stage 1: Builder
# ============================================
FROM python:${PYTHON_VERSION}-slim as builder

LABEL maintainer="Peikarband Team <dev@peikarband.ir>"
LABEL org.opencontainers.image.title="Peikarband Landing"
LABEL org.opencontainers.image.description="Peikarband hosting platform landing page"
LABEL org.opencontainers.image.version="${VERSION}"
LABEL org.opencontainers.image.created="${BUILD_DATE}"

WORKDIR /build

# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    g++ \
    make \
    curl \
    gnupg \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Install Node.js (required for Reflex)
RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && rm -rf /var/lib/apt/lists/*

# Copy only requirements first (for better layer caching)
COPY requirements.txt .

# Install Python dependencies in user space
RUN pip install --no-cache-dir --upgrade pip setuptools wheel && \
    pip install --no-cache-dir --user -r requirements.txt

# Copy application code
COPY . .

# Initialize and build Reflex app
RUN python -m reflex init --template blank && \
    python -m reflex export --frontend-only --no-zip || true

# Clean up unnecessary files
RUN find /build -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true && \
    find /build -type f -name "*.pyc" -delete && \
    find /build -type f -name "*.pyo" -delete

# ============================================
# Stage 2: Runtime
# ============================================
FROM python:${PYTHON_VERSION}-slim

# Build info
ARG VERSION
ARG BUILD_DATE
ENV VERSION=${VERSION} \
    BUILD_DATE=${BUILD_DATE}

WORKDIR /app

# Install runtime dependencies only
RUN apt-get update && apt-get install -y --no-install-recommends \
    postgresql-client \
    curl \
    ca-certificates \
    tini \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# Install Node.js runtime
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

# Copy Python dependencies from builder
COPY --from=builder /root/.local /root/.local

# Copy application code from builder
COPY --from=builder /build /app

# Create non-root user with specific UID/GID
RUN groupadd -r -g 1000 peikarband && \
    useradd -r -u 1000 -g peikarband -m -s /bin/bash peikarband && \
    mkdir -p /app/logs /app/uploads /app/.reflex && \
    chown -R peikarband:peikarband /app

# Set environment variables
ENV PATH=/root/.local/bin:$PATH \
    PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PYTHONHASHSEED=random \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    REFLEX_ENV=production \
    ENVIRONMENT=production

# Security: Remove unnecessary setuid/setgid permissions
RUN find / -perm /6000 -type f -exec chmod a-s {} \; 2>/dev/null || true

# Switch to non-root user
USER peikarband

# Expose ports
EXPOSE 3000 8000

# Health check with better error handling
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f -s -o /dev/null -w "%{http_code}" http://localhost:8000/ping | grep -q "200" || exit 1

# Add version info endpoint
RUN echo "${VERSION}" > /app/.version

# Use tini as init system for proper signal handling
ENTRYPOINT ["/usr/bin/tini", "--"]

# Run application
CMD ["python", "-m", "reflex", "run", "--env", "production", "--backend-only"]

