# syntax=docker/dockerfile:1.7

FROM node:22-bookworm-slim AS build
WORKDIR /app

COPY package.json package-lock.json .npmrc ./
COPY apps/relayer/package.json apps/relayer/package.json
COPY apps/guardian/package.json apps/guardian/package.json
COPY apps/web/package.json apps/web/package.json
COPY packages/sdk/package.json packages/sdk/package.json
COPY packages/shared/package.json packages/shared/package.json
RUN npm ci

COPY tsconfig.base.json tsconfig.tools.json ./
COPY apps/relayer apps/relayer
COPY apps/guardian apps/guardian
COPY apps/web apps/web
COPY packages packages

ARG VITE_PROTOCOL_MODE=mock
ARG VITE_RELAYER_URL=http://127.0.0.1:8787
ARG VITE_GUARDIAN_URL=http://127.0.0.1:8790
ARG VITE_SOLANA_RPC_URL=https://api.devnet.solana.com
ARG VITE_PROGRAM_ID=F6oaJejg2kNmDQM5RXSt2hoEG7b83PRtctajQ54MfdgZ
ENV VITE_PROTOCOL_MODE=$VITE_PROTOCOL_MODE \
    VITE_RELAYER_URL=$VITE_RELAYER_URL \
    VITE_GUARDIAN_URL=$VITE_GUARDIAN_URL \
    VITE_SOLANA_RPC_URL=$VITE_SOLANA_RPC_URL \
    VITE_PROGRAM_ID=$VITE_PROGRAM_ID

RUN npm run build \
    && mkdir -p target/idl \
    && cp packages/sdk/src/idl/open_sp_protocol.json target/idl/open_sp_protocol.json \
    && npm prune --omit=dev

FROM node:22-bookworm-slim AS relayer
WORKDIR /app/apps/relayer
ENV NODE_ENV=production \
    HOST=0.0.0.0 \
    PORT=8787
COPY --from=build /app/package.json /app/package.json
COPY --from=build /app/node_modules /app/node_modules
COPY --from=build /app/apps/relayer/package.json ./package.json
COPY --from=build /app/apps/relayer/dist ./dist
COPY --from=build /app/packages/shared /app/packages/shared
COPY --from=build /app/packages/sdk /app/packages/sdk
COPY --from=build /app/target/idl /app/target/idl
EXPOSE 8787
USER node
CMD ["node", "dist/main.js"]

FROM node:22-bookworm-slim AS guardian
WORKDIR /app
ENV NODE_ENV=production \
    HOST=0.0.0.0 \
    GUARDIAN_PORT=8790 \
    SNAPSHOT_SOURCE=demo \
    AI_MONITOR_ENABLED=false
COPY --from=build /app/package.json /app/package.json
COPY --from=build /app/node_modules /app/node_modules
COPY --from=build /app/apps/guardian/package.json /app/apps/guardian/package.json
COPY --from=build /app/apps/guardian/dist /app/apps/guardian/dist
WORKDIR /app/apps/guardian
EXPOSE 8790
USER node
CMD ["node", "dist/main.js"]

FROM nginx:1.27-alpine AS web
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/apps/web/dist /usr/share/nginx/html
EXPOSE 80
