name: Build Beta Package

on:
  schedule:
    - cron: "22 22 * * *"
  workflow_dispatch:
    inputs:
      updater:
        description: "Enable updater?"
        required: true
        type: boolean
        default: true
      platform_windows:
        description: "windows"
        required: true
        type: boolean
        default: true
      platform_linux:
        description: "linux"
        required: true
        type: boolean
        default: false
      platform_macos_aarch64:
        description: "macos-aarch64"
        required: true
        type: boolean
        default: false
      platform_macos_x86_64:
        description: "macos-x86_64"
        required: true
        type: boolean
        default: false
      isDebug:
        description: "is debug?"
        required: true
        type: boolean
        default: false
      retention_days:
        description: "Artifacts retention time (days)"
        required: true
        type: string
        default: "1"

jobs:
  preprocess:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.setting.outputs.matrix }}
      build_mode: ${{ steps.setting.outputs.build_mode }}
      build_path: ${{ steps.setting.outputs.build_path }}
      retention_days: ${{ steps.setting.outputs.retention_days }}
      file_prefix: ${{ steps.filename.outputs.file_prefix }}
      # build_time: ${{ steps.filename.outputs.build_time }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install yq
        uses: mikefarah/yq@master
        with:
          cmd: yq -V

      - name: Update tauri.conf.json
        if: ${{ github.event_name != 'schedule' && !inputs.updater }}
        run: yq -i '.bundle.active = false' src-tauri/tauri.conf.json
        working-directory: apps/desktop

      - name: Upload tauri-config
        if: ${{ github.event_name != 'schedule' && !inputs.updater }}
        uses: actions/upload-artifact@v4
        with:
          name: tauri-config
          path: apps/desktop/src-tauri/tauri.conf.json
          retention-days: 1

      - name: Get file name
        id: filename
        working-directory: apps/desktop
        run: |
          productName=$(yq e -r '.productName' src-tauri/tauri.conf.json)
          # ersion=$(yq e -r '.version' package.json)
          # build_time=$(TZ=UTC-8 date +%y%m%d%H)
          git_des=$(git describe --long --tags --always --dirty)
          echo "file_prefix=${productName}_${git_des}" >> "$GITHUB_OUTPUT"
          # echo "build_time=${build_time}" >> "$GITHUB_OUTPUT"

      - name: Setting variable
        id: setting
        run: |
          matrix=""
          if [ "${{ github.event_name }}" == "schedule" ]; then
            matrix="\"windows-latest\",\"ubuntu-22.04\",\"macos-14\",\"macos-13\""
            build_mode=""
            build_path="release"
            retention_days='1'
          else
            if [ "${{ inputs.platform_windows }}" == "true" ]; then
              matrix="${matrix}\"windows-latest\","
            fi
            if [ "${{ inputs.platform_linux }}" == "true" ]; then
              matrix="${matrix}\"ubuntu-22.04\","
            fi
            if [ "${{ inputs.platform_macos_aarch64 }}" == "true" ]; then
              matrix="${matrix}\"macos-14\","
            fi
            if [ "${{ inputs.platform_macos_x86_64 }}" == "true" ]; then
              matrix="${matrix}\"macos-13\","
            fi
            if [ -z "${matrix}" ]; then
              matrix="\"windows-latest\","
            fi
            matrix="${matrix%,}"
            build_mode="${{ inputs.isDebug && '--debug' || '' }}"
            build_path="${{ inputs.isDebug && 'debug' || 'release' }}"
            retention_days="${{ inputs.retention_days }}"
          fi
          echo "matrix=[${matrix}]" >> "$GITHUB_OUTPUT"
          echo "build_mode=${build_mode}" >> "$GITHUB_OUTPUT"
          echo "build_path=${build_path}" >> "$GITHUB_OUTPUT"
          echo "retention_days=${retention_days}" >> "$GITHUB_OUTPUT"

  auto-build:
    needs: preprocess
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
        os: ${{ fromJson(needs.preprocess.outputs.matrix) }}

    runs-on: ${{ matrix.os }}
    env:
      BUILD_MODE: ${{ needs.preprocess.outputs.build_mode }}
      BUILD_PATH: ${{ needs.preprocess.outputs.build_path }}
      RETENTION_DAYS: ${{ needs.preprocess.outputs.retention_days }}
      FILE_PREFIX: ${{ needs.preprocess.outputs.file_prefix }}
      # BUILD_TIME: ${{ needs.preprocess.outputs.build_time }}
      TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
      TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
      NO_STRIP: true
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: "true"

      - name: Download artifact
        if: ${{ github.event_name != 'schedule' && !inputs.updater }}
        uses: actions/download-artifact@v4
        with:
          name: tauri-config
          path: src-tauri

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: latest

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: pnpm

      - uses: oven-sh/setup-bun@v1
        with:
          bun-version: 1.1.27

      - name: Install protobuf (Mac)
        if: startsWith(matrix.os, 'macos')
        run: |
          brew install protobuf
      - name: Install protoc and openssl for windows
        if: matrix.os == 'windows-latest'
        run: |
          choco install protoc
          choco install openssl
          echo OPENSSL_DIR='"C:\\Program Files\\OpenSSL-Win64"' >> $env:GITHUB_ENV
          echo OPENSSL_INCLUDE_DIR='"C:\\Program Files\\OpenSSL-Win64\\include"' >> $env:GITHUB_ENV
          echo OPENSSL_LIB_DIR='"C:\\Program Files\\OpenSSL-Win64\\lib"' >> $env:GITHUB_ENV
      - name: Install dependencies (ubuntu only)
        if: matrix.os == 'ubuntu-22.04'
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev protobuf-compiler

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          # 那些目标仅在 macos 运行器上使用，因此将其置于 `if` 语句中，以稍微加快 Windows 和 Linux 的构建速度。
          targets: ${{ startsWith(matrix.os, 'macos') && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

      - name: Rust cache
        uses: swatinem/rust-cache@v2
        with:
          workspaces: "./apps/desktop/src-tauri -> target"

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Prepare
        run: pnpm prepare

      - name: Build Packages
        run: pnpm build

      - name: Build the app (Windows)
        working-directory: apps/desktop
        env:
          CI: false
        run: pnpm tauri build ${{ env.BUILD_MODE}} ${{ matrix.os == 'windows-latest' && '-b nsis' || '' }}

      - name: Rename macos-aarch64
        if: matrix.os == 'macos-14'
        run: mv target/${{ env.BUILD_PATH }}/bundle/dmg/*.dmg target/${{ env.BUILD_PATH }}/bundle/dmg/${{ env.FILE_PREFIX }}-aarch64.dmg

      - name: Rename macos-x86_64
        if: matrix.os == 'macos-13'
        run: mv target/${{ env.BUILD_PATH }}/bundle/dmg/*.dmg target/${{ env.BUILD_PATH }}/bundle/dmg/${{ env.FILE_PREFIX }}-amd64.dmg

      - name: Rename windows
        if: matrix.os == 'windows-latest'
        run: |
          # mv target/${{ env.BUILD_PATH }}/bundle/msi/*.msi target/${{ env.BUILD_PATH }}/bundle/msi/${{ env.FILE_PREFIX }}-amd64.msi
          mv target/${{ env.BUILD_PATH }}/bundle/nsis/*.exe target/${{ env.BUILD_PATH }}/bundle/nsis/${{ env.FILE_PREFIX }}-amd64.exe

      - name: Rename linux
        if: matrix.os == 'ubuntu-22.04'
        run: |
          mv target/${{ env.BUILD_PATH }}/bundle/deb/*.deb target/${{ env.BUILD_PATH }}/bundle/deb/${{ env.FILE_PREFIX }}-amd64.deb
          mv target/${{ env.BUILD_PATH }}/bundle/rpm/*.rpm target/${{ env.BUILD_PATH }}/bundle/rpm/${{ env.FILE_PREFIX }}-amd64.rpm
          mv target/${{ env.BUILD_PATH }}/bundle/appimage/*.AppImage target/${{ env.BUILD_PATH }}/bundle/appimage/${{ env.FILE_PREFIX }}-amd64.AppImage

      - name: Upload artifacts (Windows)
        if: matrix.os == 'windows-latest'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.FILE_PREFIX }}_windows-amd64
          path: |
            # target/${{ env.BUILD_PATH }}/bundle/msi/*.msi
            target/${{ env.BUILD_PATH }}/bundle/nsis/*.exe
          retention-days: ${{ env.RETENTION_DAYS}}
          compression-level: 0

      - name: Upload artifacts (MacOS)
        if: startsWith(matrix.os, 'macos')
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.FILE_PREFIX }}_${{ matrix.os == 'macos-14' && 'macos-aarch64' || 'macos-amd64' }}
          path: target/${{ env.BUILD_PATH }}/bundle/dmg/*.dmg
          retention-days: ${{ env.RETENTION_DAYS}}
          compression-level: 0

      - name: Upload artifacts (Linux)
        if: matrix.os == 'ubuntu-22.04'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.FILE_PREFIX }}_linux-amd64
          path: |
            target/${{ env.BUILD_PATH }}/bundle/deb/*.deb
            target/${{ env.BUILD_PATH }}/bundle/rpm/*.rpm
            target/${{ env.BUILD_PATH }}/bundle/appimage/*.AppImage
          retention-days: ${{ env.RETENTION_DAYS}}
          compression-level: 0
