name: Release Editor App

on:
  push:
    tags:
      - 'editor-v*'
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version (e.g., 1.0.0)'
        required: true
        default: '1.0.0'

jobs:
  build-tauri:
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: windows-latest
            target: x86_64-pc-windows-msvc
            arch: x64
          - platform: macos-latest
            target: x86_64-apple-darwin
            arch: x64
          - platform: macos-latest
            target: aarch64-apple-darwin
            arch: arm64

    runs-on: ${{ matrix.platform }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - name: Install Rust stable
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Rust cache
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: packages/editor-app/src-tauri
          cache-on-failure: true

      - name: Install dependencies (Ubuntu)
        if: matrix.platform == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf

      - name: Install frontend dependencies
        run: npm ci

      - name: Update version in config files (for manual trigger)
        if: github.event_name == 'workflow_dispatch'
        run: |
          cd packages/editor-app
          # 临时更新版本号用于构建（不提交到仓库）
          npm version ${{ github.event.inputs.version }} --no-git-tag-version
          node scripts/sync-version.js

      - name: Cache TypeScript build
        uses: actions/cache@v4
        with:
          path: |
            packages/core/bin
            packages/editor-core/dist
          key: ${{ runner.os }}-ts-build-${{ hashFiles('packages/core/src/**', 'packages/editor-core/src/**') }}
          restore-keys: |
            ${{ runner.os }}-ts-build-

      - name: Build core package
        run: npm run build:core

      - name: Build editor-core package
        run: |
          cd packages/editor-core
          npm run build

      - name: Build Tauri app
        uses: tauri-apps/tauri-action@v0.5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
        with:
          projectPath: packages/editor-app
          tagName: ${{ github.event_name == 'workflow_dispatch' && format('editor-v{0}', github.event.inputs.version) || github.ref_name }}
          releaseName: 'ECS Editor v${{ github.event.inputs.version || github.ref_name }}'
          releaseBody: 'See the assets to download this version and install.'
          releaseDraft: false
          prerelease: false
          includeUpdaterJson: true
          updaterJsonKeepUniversal: false
          args: ${{ matrix.platform == 'macos-latest' && format('--target {0}', matrix.target) || '' }}

  # 构建成功后，创建 PR 更新版本号
  update-version-pr:
    needs: build-tauri
    if: github.event_name == 'workflow_dispatch' && success()
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'

      - name: Update version files
        run: |
          cd packages/editor-app
          npm version ${{ github.event.inputs.version }} --no-git-tag-version
          node scripts/sync-version.js

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: "chore(editor): bump version to ${{ github.event.inputs.version }}"
          branch: release/editor-v${{ github.event.inputs.version }}
          delete-branch: true
          title: "chore(editor): Release v${{ github.event.inputs.version }}"
          body: |
            ## 🚀 Release v${{ github.event.inputs.version }}

            This PR updates the editor version after successful release build.

            ### Changes
            - ✅ Updated `packages/editor-app/package.json` → `${{ github.event.inputs.version }}`
            - ✅ Updated `packages/editor-app/src-tauri/tauri.conf.json` → `${{ github.event.inputs.version }}`

            ### Release
            - 📦 [GitHub Release](https://github.com/${{ github.repository }}/releases/tag/editor-v${{ github.event.inputs.version }})

            ---
            *This PR was automatically created by the release workflow.*
          labels: |
            release
            editor
            automated pr
