# Stage 0: GPU Base image
FROM nvidia/cuda:12.6.0-devel-ubuntu22.04 AS base-gpu

ENV DEBIAN_FRONTEND=noninteractive
ENV PATH="/root/.local/bin:$PATH"

# Install system dependencies (libgl and libglib are required for OpenCV)
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    git \
    libgl1 \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*

# Install uv
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# --- vLLM Server Stage ---
FROM base-gpu AS vllm-server
WORKDIR /app

# Install project dependencies
COPY pyproject.toml uv.lock ./
RUN uv python pin 3.12 && uv sync --frozen --no-dev

# Install prebuilt flash-attention wheel
ARG FLASH_ATTN_WHEEL=https://github.com/mjun0812/flash-attention-prebuild-wheels/releases/download/v0.3.14/flash_attn-2.8.2+cu128torch2.8-cp312-cp312-linux_x86_64.whl
RUN uv pip install --python .venv "${FLASH_ATTN_WHEEL}"

COPY . /app
RUN chmod +x /app/scripts/serve.sh

EXPOSE 8118
CMD ["./scripts/serve.sh"]

# --- Pipeline API Stage ---
FROM base-gpu AS pipeline-api
WORKDIR /app

# Build paddlepaddle and paddlex virtual env
RUN uv venv .venv-api --python 3.12
RUN uv pip install --python .venv-api paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/stable/cu126/
RUN uv pip install --python .venv-api "paddleocr[doc-parser]>=3.3.0"
RUN uv pip install --python .venv-api "aiohttp>=3.9" "filetype>=1.2" "fastapi>=0.110" "starlette>=0.36" "uvicorn>=0.16" "ultralytics>=8.0"

COPY . /app
RUN chmod +x /app/scripts/serve-pipeline.sh

EXPOSE 8090
CMD ["./scripts/serve-pipeline.sh"]

# --- Gradio UI Stage ---
FROM python:3.12-slim AS gradio-ui
WORKDIR /app/PaddleOCR-VL-1.6_Online_Demo

RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    && rm -rf /var/lib/apt/lists/*

COPY PaddleOCR-VL-1.6_Online_Demo/requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY PaddleOCR-VL-1.6_Online_Demo ./

EXPOSE 7870

ENV GRADIO_SERVER_NAME="0.0.0.0"
ENV GRADIO_SERVER_PORT="7870"

CMD ["python", "app.py"]

# --- Next.js Web App Stage ---
FROM node:20-slim AS pfm-web-app
WORKDIR /app
COPY pfm-web-app/package.json pfm-web-app/package-lock.json ./
RUN npm ci
COPY pfm-web-app/ ./
ENV NODE_ENV=production
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]

