# syntax=docker/dockerfile:1

FROM node:22-slim AS builder

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

WORKDIR /workspace

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

COPY pnpm-workspace.yaml package.json pnpm-lock.yaml .npmrc ./
COPY extractor-ts/package.json ./extractor-ts/
COPY transcriber-ts/package.json ./transcriber-ts/
COPY brain-nest/package.json ./brain-nest/
COPY client/package.json ./client/

RUN pnpm install --frozen-lockfile --filter wegulo-brain-nest...

COPY extractor-ts/ ./extractor-ts/
COPY transcriber-ts/ ./transcriber-ts/
COPY brain-nest/ ./brain-nest/

RUN pnpm --filter @wegulo/extractor-ts build
RUN pnpm --filter @wegulo/transcriber-ts build \
    || echo "WARN: transcriber-ts build skipped — transcription feature unavailable"

# Host dist/ is dockerignored, but a leftover *.tsbuildinfo from a local
# incremental build can still sneak into the context. With incremental:true,
# tsc then treats outputs as up-to-date and emits only .d.ts (no .js),
# producing a silently broken image. Force a clean emit and assert entrypoints.
WORKDIR /workspace/brain-nest
RUN rm -f tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo \
    && pnpm exec tsc -p tsconfig.build.json --incremental false \
    && test -f dist/main.js && test -f dist/worker.js

WORKDIR /workspace
# Portable production tree with workspace packages injected (not symlinked).
# Replace asset dirs outright — deploy may already copy them, and `cp -R src dest`
# into an existing directory nests as dest/src.
RUN pnpm --filter=wegulo-brain-nest deploy --prod /deploy
RUN rm -rf /deploy/dist /deploy/prompts /deploy/default-skills \
    && cp -R brain-nest/dist /deploy/dist \
    && cp -R brain-nest/prompts /deploy/prompts \
    && cp -R brain-nest/default-skills /deploy/default-skills \
    && mkdir -p /deploy/dist/database \
    && cp -R brain-nest/src/database/migrations /deploy/dist/database/migrations

FROM node:22-slim AS runtime

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

WORKDIR /app

COPY --from=builder /deploy/ ./

ENV API_HOST=0.0.0.0
ENV API_PORT=5055
ENV NODE_ENV=production

RUN mkdir -p /app/data/uploads /app/data/sqlite-db

EXPOSE 5055

CMD ["node", "dist/main.js"]
