on:
  pull_request:
    branches: [main, dev]
  push:
    branches: [main, dev]

# the name of our workflow
name: CI

jobs:
  lint:
    name: Lint
    strategy:
      matrix:
        targets:
          - os: ubuntu-latest
          - os: macos-latest
          - os: windows-latest
    runs-on: ${{ matrix.targets.os }}
    steps:
      - uses: actions/checkout@v4
      - name: Rust
        run: |
          rustup toolchain install stable --profile minimal --no-self-update
          rustup default stable
          rustup component add clippy rustfmt
          rustc --version
          cargo --version
          rustup show

      - name: Tauri dependencies
        if: startsWith(matrix.targets.os, 'ubuntu-')
        run: >-
          sudo apt-get update &&
          sudo apt-get install -y
          libgtk-3-dev
          libayatana-appindicator3-dev
          libwebkit2gtk-4.0-dev
          webkit2gtk-driver
          xvfb
      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: "./backend/"
          prefix-key: "rust-stable"
          shared-key: "ci"
          save-if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' }}
      - uses: maxim-lobanov/setup-xcode@v1
        if: startsWith(matrix.targets.os, 'macos-')
        with:
          xcode-version: "15.0"
      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - uses: pnpm/action-setup@v4
        name: Install pnpm
        with:
          run_install: false

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v4
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

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

      - name: Prepare fronend
        run: pnpm -r build # Build frontend
      - name: Prepare sidecar and resources
        run: pnpm check
      - name: Lint
        if: startsWith(matrix.targets.os, 'ubuntu-')
        run: pnpm lint # Lint
      - name: Lint
        if: startsWith(matrix.targets.os, 'ubuntu-') == false
        run: pnpm run-p lint:clippy lint:rustfmt # Lint


  # 以后完善了新的测试套件后再添加
  # test_unit:
  #   name: Unit Test
  #   needs: lint
  #   # we want to run on the latest linux environment
  #   runs-on: ubuntu-latest

  #   # the steps our job runs **in order**
  #   steps:
  #     # checkout the code on the workflow runner
  #     - uses: actions/checkout@v4

  #     # install system dependencies that Tauri needs to compile on Linux.
  #     # note the extra dependencies for `tauri-driver` to run which are: `webkit2gtk-driver` and `xvfb`
  #     - name: Tauri dependencies
  #       run: >-
  #         sudo apt-get update &&
  #         sudo apt-get install -y
  #         libgtk-3-dev
  #         libayatana-appindicator3-dev
  #         libwebkit2gtk-4.0-dev
  #         webkit2gtk-driver
  #         xvfb

  #     # install the latest Rust stable
  #     - name: Rust stable
  #       run: rustup toolchain install stable --profile minimal && rustup default stable
  #     - uses: Swatinem/rust-cache@v2
  #       with:
  #         workspaces: "./backend/"
  #         prefix-key: "rust-stable"
  #         shared-key: "ci"
  #         save-if: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' }}

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

  #     - uses: pnpm/action-setup@v2
  #       name: Install pnpm
  #       with:
  #         version: 8
  #         run_install: false

  #     - name: Get pnpm store directory
  #       shell: bash
  #       run: |
  #         echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

  #     - uses: actions/cache@v4
  #       name: Setup pnpm cache
  #       with:
  #         path: ${{ env.STORE_PATH }}
  #         key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
  #         restore-keys: |
  #           ${{ runner.os }}-pnpm-store-

  #     - name: Install dependencies
  #       run: pnpm install
  #     - name: Prepare fronend
  #       run: pnpm web:build # Build frontend
  #     - name: Prepare sidecar and resources
  #       run: pnpm check
  #     - name: Test
  #       # run: pnpm test:unit && pnpm test:backend
  #       run: pnpm test:backend

  # test_e2e:
  #   # the display name of the test job
  #   name: E2E Test
  #   needs: lint
  #   # we want to run on the latest linux environment
  #   runs-on: ubuntu-latest

  #   # the steps our job runs **in order**
  #   steps:
  #     # checkout the code on the workflow runner
  #     - uses: actions/checkout@v4

  #     # install system dependencies that Tauri needs to compile on Linux.
  #     # note the extra dependencies for `tauri-driver` to run which are: `webkit2gtk-driver` and `xvfb`
  #     - name: Tauri dependencies
  #       run: >-
  #         sudo apt-get update &&
  #         sudo apt-get install -y
  #         libgtk-3-dev
  #         libayatana-appindicator3-dev
  #         libwebkit2gtk-4.0-dev
  #         webkit2gtk-driver
  #         xvfb

  #     # install the latest Rust stable
  #     - name: Rust stable
  #       run: rustup toolchain install stable --profile minimal
  #     - uses: Swatinem/rust-cache@v2
  #       with:
  #         workspaces: "./backend/"
  #         prefix-key: "rust-stable"
  #         shared-key: "ci"
  #         save-if: ${{ github.ref == 'refs/heads/main' }}
  #     - name: Install Node.js
  #       uses: actions/setup-node@v4
  #       with:
  #         node-version: 20

  #     - uses: pnpm/action-setup@v2
  #       name: Install pnpm
  #       with:
  #         version: 8
  #         run_install: false

  #     - name: Get pnpm store directory
  #       shell: bash
  #       run: |
  #         echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

  #     - uses: actions/cache@v3
  #       name: Setup pnpm cache
  #       with:
  #         path: ${{ env.STORE_PATH }}
  #         key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
  #         restore-keys: |
  #             ${{ runner.os }}-pnpm-store-

  #     - name: Install dependencies
  #       run: pnpm install

  #     # install the latest version of `tauri-driver`.
  #     # note: the tauri-driver version is independent of any other Tauri versions
  #     - name: Install tauri-driver
  #       uses: actions-rs/cargo@v1
  #       with:
  #         command: install
  #         args: tauri-driver
  #     - name: Prepare fronend
  #       run: pnpm build # Build frontend
  #     # run the WebdriverIO test suite.
  #     # we run it through `xvfb-run` (the dependency we installed earlier) to have a fake
  #     # display server which allows our application to run headless without any changes to the code
  #     - name: Test
  #       run: xvfb-run pnpm test:e2e
