# Build stage
FROM node:22-alpine AS builder
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@11.13.0 --activate

# 复制 workspace 配置 + tsconfig 基线
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml tsconfig.base.json ./

# 移除 prepare 脚本（husky 在 Docker 中不可用）
RUN node -e "const p=require('./package.json');delete p.scripts.prepare;require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))"

# 复制 shared-proto（gRPC proto-loader 运行时加载）
COPY packages/shared-proto ./packages/shared-proto

# 复制 shared-ts（workspace 依赖）
COPY packages/shared-ts ./packages/shared-ts

# 复制 iam 源码
COPY services/iam ./services/iam

# 安装依赖（仅 iam + shared-ts）
RUN cd services/iam && pnpm install --frozen-lockfile

# 先构建 shared-ts（iam 依赖 @edu/shared-ts/outbox）
WORKDIR /app/packages/shared-ts
RUN pnpm build

# 构建 iam
WORKDIR /app/services/iam
RUN pnpm build

# 复制 proto 文件到 dist 旁（生产环境 ./proto/iam.proto）
RUN mkdir -p /app/proto && cp /app/packages/shared-proto/proto/iam.proto /app/proto/iam.proto

# Runtime stage
FROM node:22-alpine
WORKDIR /app
RUN corepack enable && corepack prepare pnpm@11.13.0 --activate

# 复制 workspace 配置 + tsconfig 基线
COPY package.json pnpm-lock.yaml* pnpm-workspace.yaml tsconfig.base.json ./

# 移除 prepare 脚本（husky 在 Docker 中不可用）
RUN node -e "const p=require('./package.json');delete p.scripts.prepare;require('fs').writeFileSync('./package.json',JSON.stringify(p,null,2))"

# 复制 shared-proto + shared-ts（运行时需要）
COPY packages/shared-proto ./packages/shared-proto
COPY packages/shared-ts ./packages/shared-ts

# 复制 iam
COPY services/iam ./services/iam

WORKDIR /app/services/iam
RUN pnpm install --prod --frozen-lockfile

# 复制构建产物
COPY --from=builder /app/services/iam/dist ./dist
COPY --from=builder /app/packages/shared-ts/dist /app/packages/shared-ts/dist

# 复制 proto 文件（生产环境从 ./proto/ 加载）
COPY --from=builder /app/proto ./proto

EXPOSE 3002 50052
CMD ["node", "dist/main.js"]
