name: Build Single Popular App
on:
  workflow_dispatch:
    inputs:
      name:
        description: 'App Name'
        required: true
        default: 'twitter'
      title:
        description: 'App Title'
        required: true
        default: 'Twitter'
      name_zh:
        description: 'App Name in Chinese'
        required: true
        default: '推特'
      url:
        description: 'App URL'
        required: true
        default: 'https://twitter.com/'
  workflow_call:
    inputs:
      name:
        description: 'App Name'
        type: string
        required: true
        default: 'twitter'
      title:
        description: 'App Title'
        required: true
        type: string
        default: 'Twitter'
      name_zh:
        description: 'App Name in Chinese'
        required: true
        type: string
        default: '推特'
      url:
        description: 'App URL'
        required: true
        type: string
        default: 'https://twitter.com/'

jobs:
  build_single_app:
    name: ${{ inputs.title }} (${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        build: [linux, macos, windows]
        include:
          - build: linux
            os: ubuntu-latest
            rust: stable
            target: x86_64-unknown-linux-musl
          - build: windows
            os: windows-latest
            rust: stable-x86_64-msvc
            target: x86_64-pc-windows-msvc
          - build: macos
            os: macos-latest
            rust: stable
            target: x86_64-apple-darwin
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

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

      - name: Install dependencies (ubuntu only)
        if: matrix.os == 'ubuntu-latest'
        uses: awalsh128/cache-apt-pkgs-action@v1.4.3
        with:
          packages: libjavascriptcoregtk-4.1-dev libwebkit2gtk-4.1-dev build-essential curl wget file libxdo-dev libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev gnome-video-effects gnome-video-effects-extra
          version: 1.1

      - name: Rust cache restore
        id: cache_store
        uses: actions/cache/restore@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            src-tauri/target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Config App
        env:
          NAME: ${{ inputs.name }}
          TITLE: ${{ inputs.title }}
          NAME_ZH: ${{ inputs.name_zh }}
          URL: ${{ inputs.url }}
        run: |
          npm install
          npm run build:config

      - name: Build for Ubuntu
        if: matrix.os == 'ubuntu-latest'
        run: |
          npm run tauri build
          mkdir -p output/linux
          mv src-tauri/target/release/bundle/deb/*.deb output/linux/${{inputs.title}}_`arch`.deb
          mv src-tauri/target/release/bundle/appimage/*.AppImage output/linux/"${{inputs.title}}"_`arch`.AppImage

      - name: Build for macOS
        if: matrix.os == 'macos-latest'
        run: |
          rustup target add aarch64-apple-darwin
          rustup target add x86_64-apple-darwin
          npm run tauri build -- --target universal-apple-darwin
          mkdir -p output/macos
          mv src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg output/macos/"${{inputs.title}}".dmg

      - name: Build for Windows
        if: matrix.os == 'windows-latest'
        run: |
          npm run tauri build -- --target x86_64-pc-windows-msvc
          New-Item -Path "output\windows" -ItemType Directory
          Move-Item -Path "src-tauri\target\x86_64-pc-windows-msvc\release\bundle\msi\*.msi" -Destination "output\windows\${{inputs.title}}_x64.msi"

      - name: Restore Cargo Lock File(Windows Only)
        if: matrix.os == 'windows-latest'
        run: |
          git checkout -- src-tauri/Cargo.lock

      - name: Rust cache store
        uses: actions/cache/save@v3
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            src-tauri/target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Upload For Single Build
        uses: actions/upload-artifact@v4
        if: startsWith(github.ref, 'refs/tags/') != true
        with:
          path: 'output/*/*.*'

      - name: Upload For Release
        # arg info: https://github.com/ncipollo/release-action#release-action
        uses: ncipollo/release-action@v1
        if: startsWith(github.ref, 'refs/tags/') == true
        with:
          allowUpdates: true
          artifacts: 'output/*/*.*'
          token: ${{ secrets.GITHUB_TOKEN }}
