on:
  push:
    tags:
      - 'v*.*.*'
  
name: 🚀 Release on GitHub
jobs:
  release:
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: 'macos-latest'
            args: '--target aarch64-apple-darwin --config ./src-tauri/tauri.macos-aarch64.conf.json'
            arch: 'aarch64-apple-darwin'
          - platform: 'macos-latest'
            args: '--target x86_64-apple-darwin --config ./src-tauri/tauri.macos-x86_64.conf.json'
            arch: 'x86_64-apple-darwin'
          - platform: 'ubuntu-22.04'
            args: ''
            arch: ''
          - platform: 'windows-latest'
            args: ''
            arch: ''
    runs-on: ${{ matrix.platform }}
    steps:
      - name: 🚚 Checkout repository
        uses: actions/checkout@v4
        with:
          lfs: true

      - name: 🛠️ Install dependencies
        if: matrix.platform == 'ubuntu-22.04'
        run: |
            sudo apt-get update
            sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf

      - name: 📦 Setup node
        uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'npm'

      - name: 🛠️ install Rust stable
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

      - name: 🛠️ Rust cache
        uses: swatinem/rust-cache@v2
        with:
          workspaces: './src-tauri -> target'

      - name: 🛠️ Install frontend dependencies
        run: npm install

      - name: 📄 Read and Process CHANGELOG (Unix)
        if: matrix.platform != 'windows-latest'
        id: changelog_unix
        shell: bash
        run: |
            if [ -f CHANGELOG.md ]; then
                # Extract version number from tag
                VERSION_NUM=$(echo "${{ github.ref_name }}" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$/\1/')
                
                # Read and replace placeholders
                CONTENT=$(cat CHANGELOG.md)
                CONTENT=${CONTENT//<release_tag>/${{ github.ref_name }}}
                CONTENT=${CONTENT//<version>/$VERSION_NUM}
                
                echo "content<<EOF" >> $GITHUB_OUTPUT
                echo "$CONTENT" >> $GITHUB_OUTPUT
                echo "EOF" >> $GITHUB_OUTPUT
            else
                echo "content=No changelog found" >> $GITHUB_OUTPUT
            fi

      - name: 📄 Read and Process CHANGELOG (Windows)
        if: matrix.platform == 'windows-latest'
        id: changelog_windows
        shell: pwsh
        run: |
            if (Test-Path "CHANGELOG.md") {
                # Extract version number from tag
                $version_num = "${{ github.ref_name }}" -replace '^v([0-9]+\.[0-9]+\.[0-9]+)(-.*)?$','$1'
                
                # Read and replace placeholders
                $content = Get-Content -Path CHANGELOG.md -Raw
                $content = $content -replace '<release_tag>', "${{ github.ref_name }}"
                $content = $content -replace '<version>', "$version_num"
                
                "content<<EOF" >> $env:GITHUB_OUTPUT
                $content >> $env:GITHUB_OUTPUT
                "EOF" >> $env:GITHUB_OUTPUT
            } else {
                "content=No changelog found" >> $env:GITHUB_OUTPUT
            }

      - name: 🚀 Build and publish
        uses: tauri-apps/tauri-action@v0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TARGET_ARCH: ${{ matrix.arch }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
        with:
          tagName: ${{ github.ref_name }}
          releaseName: ${{ github.event.repository.name }}-${{ github.ref_name }}
          releaseBody: ${{ matrix.platform == 'windows-latest' && steps.changelog_windows.outputs.content || steps.changelog_unix.outputs.content }}
          releaseDraft: true
          prerelease: false
          includeUpdaterJson: true
          updaterJsonPreferNsis: true
          args: ${{ matrix.args }}