# 多阶段构建：前后端一体化部署
# 阶段1：构建前端
FROM node:18-alpine AS frontend-build

WORKDIR /app/frontend

# 定义构建参数（版本号信息）
ARG VERSION=dev
ARG GIT_TAG=
ARG GITHUB_REPO_URL=https://github.com/WrBug/PolyHermes

# 设置环境变量（用于 Vite 构建时注入）
ENV VERSION=${VERSION}
ENV GIT_TAG=${GIT_TAG}
ENV GITHUB_REPO_URL=${GITHUB_REPO_URL}

# 复制前端文件
COPY frontend/package*.json ./
RUN npm ci

COPY frontend/ ./

# 构建前端（使用相对路径，通过 Nginx 代理）
# 版本号会通过环境变量注入到构建产物中
RUN npm run build

# 阶段2：构建后端
FROM gradle:8.5-jdk17 AS backend-build

WORKDIR /app/backend

# 复制 Gradle 配置文件
COPY backend/build.gradle.kts backend/settings.gradle.kts ./
COPY backend/gradle ./gradle

# 下载依赖（利用 Docker 缓存）
RUN gradle dependencies --no-daemon || true

# 复制源代码
COPY backend/src ./src

# 构建应用
RUN gradle bootJar --no-daemon

# 阶段3：运行环境
FROM eclipse-temurin:17-jre-jammy

WORKDIR /app

# 安装 Nginx 和必要的工具
RUN apt-get update && \
    apt-get install -y nginx curl && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /etc/nginx/sites-enabled/default

# 从构建阶段复制文件
COPY --from=frontend-build /app/frontend/dist /usr/share/nginx/html
COPY --from=backend-build /app/backend/build/libs/*.jar app.jar

# 复制 Nginx 配置
COPY docker/nginx.conf /etc/nginx/nginx.conf

# 创建启动脚本
COPY docker/start.sh /app/start.sh
RUN chmod +x /app/start.sh

# 创建非 root 用户（用于运行后端应用）
RUN useradd -m -u 1000 appuser

# 设置目录权限（Nginx 以 root 运行，后端应用以 appuser 运行）
RUN mkdir -p /var/log/nginx /var/lib/nginx /var/cache/nginx /var/run && \
    chown -R appuser:appuser /app && \
    chown -R root:root /usr/share/nginx/html && \
    chown -R root:root /var/log/nginx && \
    chown -R root:root /var/lib/nginx && \
    chown -R root:root /var/cache/nginx && \
    chown -R root:root /etc/nginx && \
    chown -R root:root /var/run

# 保持 root 用户（Nginx 需要 root 权限绑定 80 端口）
# USER appuser

# 暴露端口
EXPOSE 80

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost/api/health || exit 1

# 启动服务（同时启动 Nginx 和后端）
ENTRYPOINT ["/app/start.sh"]

