# syntax=docker/dockerfile:1
# ─── RepoPilot ─────────────────────────────────────────────────
# Multi-stage build:
#   1. deps    — install pnpm + dependencies (including native addons)
#   2. builder — build SDK + Next.js standalone app
#   3. runner  — production image
# ────────────────────────────────────────────────────────────────

# ── Stage 1: Install dependencies ───────────────────────────────
FROM node:22-slim AS deps

RUN apt-get update && \
    apt-get install -y --no-install-recommends python3 make g++ && \
    rm -rf /var/lib/apt/lists/*

RUN corepack enable && corepack prepare pnpm@latest --activate

WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY packages/sdk/package.json packages/sdk/
COPY packages/ui/package.json packages/ui/
RUN pnpm install --frozen-lockfile --shamefully-hoist

# ── Stage 2: Build SDK + Next.js standalone ─────────────────────
FROM node:22-slim AS builder

RUN corepack enable && corepack prepare pnpm@latest --activate

WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY --from=deps /app/packages/sdk/node_modules ./packages/sdk/node_modules
COPY --from=deps /app/packages/ui/node_modules ./packages/ui/node_modules
COPY . ./

ARG NEXT_PUBLIC_AGENT_COMPACTION_THRESHOLD_TOKENS=100000
ARG NEXT_PUBLIC_AGENT_MIN_HISTORY_MESSAGES_FOR_COMPACTION=12
ENV NEXT_TELEMETRY_DISABLED=1
ENV NEXT_PUBLIC_AGENT_COMPACTION_THRESHOLD_TOKENS=${NEXT_PUBLIC_AGENT_COMPACTION_THRESHOLD_TOKENS}
ENV NEXT_PUBLIC_AGENT_MIN_HISTORY_MESSAGES_FOR_COMPACTION=${NEXT_PUBLIC_AGENT_MIN_HISTORY_MESSAGES_FOR_COMPACTION}

RUN pnpm -r build

# ── Stage 3: Build Rust agent binary compatible with the runtime image ──────
FROM rust:1.85-slim-bookworm AS rust-builder

RUN apt-get update && \
    apt-get install -y --no-install-recommends pkg-config libssl-dev && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /build/rust-agent-sdk
COPY rust-agent-sdk/Cargo.toml rust-agent-sdk/Cargo.lock ./
COPY rust-agent-sdk/src ./src
RUN cargo build --release --locked --bin agent

# ── Stage 3: Production runner ──────────────────────────────────
FROM node:22-slim AS runner

RUN apt-get update && \
    apt-get install -y --no-install-recommends ca-certificates git unzip && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -r repopilot && useradd -r -g repopilot -m repopilot

WORKDIR /app

# Next's standalone output for this monorepo keeps the app under packages/ui.
COPY --from=builder /app/packages/ui/.next/standalone ./
COPY --from=builder /app/packages/ui/.next/static ./packages/ui/.next/static

# --- SDK scan-worker for child-process scanning ---
COPY --from=builder /app/packages/sdk/dist/repopilot/scanner/scan-worker.cjs ./packages/sdk/dist/repopilot/scanner/scan-worker.cjs

# --- better-sqlite3 native addon (not included in Next.js standalone output) ---
# Use a shell to resolve the wildcard version path
RUN --mount=from=builder,source=/app/node_modules,target=/src_modules \
    mkdir -p /app/node_modules && \
    cp -a /src_modules/.pnpm/better-sqlite3@*/node_modules/better-sqlite3 /app/node_modules/better-sqlite3 && \
    cp -a /src_modules/.pnpm/bindings@*/node_modules/bindings /app/node_modules/bindings && \
    cp -a /src_modules/.pnpm/file-uri-to-path@*/node_modules/file-uri-to-path /app/node_modules/file-uri-to-path

# --- Rust agent binary ---
COPY --from=rust-builder /build/rust-agent-sdk/target/release/agent /usr/local/bin/agent
RUN chmod +x /usr/local/bin/agent

# --- Entrypoint ---
RUN <<'EOF'
cat > /app/entrypoint.sh <<'ENTRY'
#!/bin/sh
set -e
export LITELLM_PROXY_URL="${LITELLM_PROXY_URL:-http://172.30.162.95:4141}"
export LLM_MODEL="${LLM_MODEL:-gpt-5-mini}"
export SOURCE_PATH="${SOURCE_PATH:-/workspace}"
export DATABASE_URL="${DATABASE_URL:-postgresql://repopilot:repopilot@postgres:5432/repopilot}"
export REPOS_PATH="${REPOS_PATH:-/repos}"
mkdir -p "$REPOS_PATH"
export ANTHROPIC_BASE_URL="${ANTHROPIC_BASE_URL:-$LITELLM_PROXY_URL}"
export ANTHROPIC_API_KEY="${ANTHROPIC_API_KEY:-dummy}"
export RUST_AGENT_BINARY_PATH="${RUST_AGENT_BINARY_PATH:-/usr/local/bin/agent}"
export NODE_ENV=production
export PORT="${PORT:-3000}"
export HOSTNAME="0.0.0.0"
echo "RepoPilot starting..."
echo "  LLM proxy:   $LITELLM_PROXY_URL"
echo "  Model:        $LLM_MODEL"
echo "  Source path:  $SOURCE_PATH"
echo "  Port:         $PORT"
echo "  Database:     $DATABASE_URL"
echo "  Repos path:   $REPOS_PATH"
cd /app/packages/ui
exec node server.js
ENTRY
chmod +x /app/entrypoint.sh
EOF

RUN mkdir -p /repos && chown repopilot:repopilot /repos
RUN chown -R repopilot:repopilot /app

ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1

USER repopilot
EXPOSE 3000
ENTRYPOINT ["/app/entrypoint.sh"]
