# Full-stack image: Expo web (Node) + Bun API on :8080
# Flat deploy layout — no packages/ monorepo folder required in the ZIP
FROM node:22-alpine AS web-build
WORKDIR /src

COPY package.json ./
RUN npm install --legacy-peer-deps

COPY app.config.ts app.json babel.config.js metro.config.js tsconfig.json expo-env.d.ts eslint.config.js ./
COPY app ./app
COPY admin ./admin
COPY assets ./assets
COPY components ./components
COPY constants ./constants
COPY lib ./lib
COPY types ./types
COPY scripts/normalize-web-build.js scripts/obfuscate-sensitive-web.js ./scripts/

RUN test -f lib/design-system/src/index.ts || (echo "Missing lib/design-system — re-create the deploy ZIP with npm run package:full" >&2 && exit 1)

ENV NODE_ENV=production \
    EXPO_PUBLIC_APP_ENV=production \
    EXPO_PUBLIC_DEMO_MODE_ENABLED=false \
    EXPO_PUBLIC_API_BASE_URL=""
ENV NODE_OPTIONS=--max-old-space-size=2048

RUN npm run build:web

FROM oven/bun:1.2-alpine AS runtime
WORKDIR /app

ENV NODE_ENV=production \
    RUNTIME=bun \
    SERVE_WEB=true \
    HOST=0.0.0.0 \
    PORT=8080 \
    DB_FILE_PATH=/data/zendo-store.json

RUN apk add --no-cache wget \
    && addgroup -S zendo && adduser -S zendo -G zendo \
    && mkdir -p /data && chown zendo:zendo /data

COPY backend/package.json backend/bun.lock ./
RUN bun install --frozen-lockfile --production

COPY backend/ ./
COPY --from=web-build /src/dist ./dist

RUN chown -R zendo:zendo /app
USER zendo

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=5s --start-period=120s --retries=3 \
  CMD wget -qO- "http://127.0.0.1:8080/api/health" || exit 1

CMD ["sh", "-c", "if [ -n \"$DATABASE_URL\" ]; then bun run db/migrate.ts || true; fi; exec bun run server.ts"]
