FROM python:3.12-slim

# Chromium system deps + Node.js
RUN apt-get update && apt-get install -y --no-install-recommends \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
    libdbus-1-3 libdrm2 libxkbcommon0 libatspi2.0-0 libxcomposite1 \
    libxdamage1 libxfixes3 libxrandr2 libgbm1 libpango-1.0-0 \
    libcairo2 libasound2 libx11-xcb1 libfontconfig1 libx11-6 \
    libxcb1 libxext6 libxshmfence1 \
    libglib2.0-0 libgtk-3-0 libpangocairo-1.0-0 libcairo-gobject2 \
    libgdk-pixbuf-2.0-0 libxss1 libxtst6 fonts-liberation \
    fonts-noto-color-emoji fonts-unifont fonts-freefont-ttf \
    fonts-ipafont-gothic fonts-wqy-zenhei fonts-tlwg-loma-otf \
    fonts-urw-base35 \
    xvfb xdotool openbox \
    curl ca-certificates xz-utils \
    && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Python wrapper
COPY pyproject.toml README.md LICENSE BINARY-LICENSE.md ./
COPY xbrowser/ xbrowser/
RUN pip install --no-cache-dir ".[serve,geoip]"

# JS wrapper
COPY js/ js/
RUN cd js && npm install && npm run build

# Examples
COPY examples/ examples/

# Pre-download pro Chromium binary during build
# Pass license key via: docker build --build-arg XBROWSER_LICENSE_KEY=cb_xxx
ARG XBROWSER_LICENSE_KEY
ARG XBROWSER_LICENSE_API=https://cloak.devkuroxai.dev
ARG XBROWSER_VERSION=154.0.8037.57.1
ARG XBROWSER_CACHE_DIR=/root/.xbrowser

RUN set -e; \
    if [ -z "$XBROWSER_LICENSE_KEY" ]; then \
        echo "ERROR: XBROWSER_LICENSE_KEY build arg required for pro binary" >&2; \
        echo "Usage: docker build --build-arg XBROWSER_LICENSE_KEY=cb_xxx ." >&2; \
        exit 1; \
    fi; \
    BINARY_DIR="${XBROWSER_CACHE_DIR}/chromium-${XBROWSER_VERSION}-pro"; \
    mkdir -p "$BINARY_DIR"; \
    echo "Downloading xbrowser pro binary v${XBROWSER_VERSION}..."; \
    curl -fL --max-redirs 10 \
        -H "Authorization: Bearer ${XBROWSER_LICENSE_KEY}" \
        -H "X-Platform: linux-x64" \
        "${XBROWSER_LICENSE_API}/api/download/${XBROWSER_VERSION}" \
        -o /xbrowser.tar.xz; \
    echo "Downloaded $(du -sh /xbrowser.tar.xz | cut -f1)"; \
    tar -xJf /xbrowser.tar.xz -C "$BINARY_DIR"; \
    chmod +x "$BINARY_DIR/chrome"; \
    rm /xbrowser.tar.xz; \
    echo "Binary ready: $BINARY_DIR/chrome"

# Bake env vars so container always finds pro binary without extra config
ENV XBROWSER_CACHE_DIR=/root/.xbrowser
ENV XBROWSER_AUTO_UPDATE=false
# Docker has no GPU — these args prevent GPU init crash.
# Pass XBROWSER_LICENSE_KEY at runtime: docker run -e XBROWSER_LICENSE_KEY=cb_xxx
ENV XBROWSER_BINARY_PATH=/root/.xbrowser/chromium-154.0.8037.57.1-pro/chrome

# CLI shortcuts
COPY bin/xbrowsertest /usr/local/bin/xbrowsertest
COPY bin/xbrowserserve /usr/local/bin/xbrowserserve
COPY bin/fetch-widevine.py /usr/local/bin/fetch-widevine.py
RUN chmod +x /usr/local/bin/xbrowsertest /usr/local/bin/xbrowserserve /usr/local/bin/fetch-widevine.py

EXPOSE 9222

# Xvfb entrypoint for headed mode support
COPY bin/docker-entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENV DISPLAY=:99

ENTRYPOINT ["/entrypoint.sh"]
CMD ["python"]
