# 自动化发版流水线
#
# 触发方式：
#   1. 推送 tag：git tag v1.2.3 && git push --tags
#   2. 手动触发：GitHub Actions 页面 → Run workflow → 输入版本号
#
# 产出物：
#   - GitHub Release：linux/amd64 + linux/arm64 预编译 tar.gz
#   - Docker Hub：awuqing/backupx:latest + awuqing/backupx:v1.2.3（多架构）
#
# 前置配置：
#   在仓库 Settings → Secrets → Actions 添加：
#   - DOCKERHUB_USERNAME（Docker Hub 用户名）
#   - DOCKERHUB_TOKEN（Docker Hub Access Token）

name: Release

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:
    inputs:
      version:
        description: '版本号（如 v1.2.3）'
        required: true
        type: string

permissions:
  contents: write
  packages: write

# 统一版本号：tag 推送取 ref_name，手动触发取 inputs.version
env:
  VERSION: ${{ github.event.inputs.version || github.ref_name }}

jobs:
  # ─── Job 1: 构建前端 ───
  build-web:
    name: Build Frontend
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install & Build
        working-directory: web
        run: |
          npm ci
          npm run build

      - name: Upload frontend artifact
        uses: actions/upload-artifact@v4
        with:
          name: web-dist
          path: web/dist
          retention-days: 1

  # ─── Job 2: 预编译二进制 → GitHub Release ───
  build-release:
    name: Build ${{ matrix.goarch }}
    needs: build-web
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - goos: linux
            goarch: amd64
          - goos: linux
            goarch: arm64
    steps:
      - uses: actions/checkout@v4

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.25'
          cache-dependency-path: server/go.sum

      - name: Download frontend artifact
        uses: actions/download-artifact@v4
        with:
          name: web-dist
          path: web/dist

      - name: Build binary
        working-directory: server
        env:
          GOOS: ${{ matrix.goos }}
          GOARCH: ${{ matrix.goarch }}
          CGO_ENABLED: '0'
        run: |
          go build \
            -trimpath \
            -ldflags "-s -w -X main.version=${{ env.VERSION }}" \
            -o ../backupx \
            ./cmd/backupx

      - name: Package release
        run: |
          ARCHIVE_NAME="backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}"
          mkdir -p "${ARCHIVE_NAME}"
          cp backupx "${ARCHIVE_NAME}/"
          cp -r web/dist "${ARCHIVE_NAME}/web"
          cp server/config.example.yaml "${ARCHIVE_NAME}/"
          cp deploy/install.sh "${ARCHIVE_NAME}/" 2>/dev/null || true
          tar czf "${ARCHIVE_NAME}.tar.gz" "${ARCHIVE_NAME}"

      - name: Upload to GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ env.VERSION }}
          files: backupx-${{ env.VERSION }}-${{ matrix.goos }}-${{ matrix.goarch }}.tar.gz
          generate_release_notes: true

  # ─── Job 3: Docker 多架构 → Docker Hub ───
  build-docker:
    name: Build & Push Docker
    needs: build-web
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build & Push
        uses: docker/build-push-action@v6
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          build-args: |
            VERSION=${{ env.VERSION }}
          tags: |
            ${{ secrets.DOCKERHUB_USERNAME }}/backupx:latest
            ${{ secrets.DOCKERHUB_USERNAME }}/backupx:${{ env.VERSION }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
