name: Release

on:
  push:
    tags:
      - "v*"

jobs:
  build:
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    permissions:
      contents: read
    strategy:
      matrix:
        include:
          ## Linux builds
          # Glibc 2.21
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            artifact_name: target/x86_64-unknown-linux-gnu/release/libblink_cmp_fuzzy.so
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            artifact_name: target/aarch64-unknown-linux-gnu/release/libblink_cmp_fuzzy.so
          # Musl 1.2.3
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            artifact_name: target/x86_64-unknown-linux-musl/release/libblink_cmp_fuzzy.so
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
            artifact_name: target/aarch64-unknown-linux-musl/release/libblink_cmp_fuzzy.so
          # Android (Termux)
          - os: ubuntu-latest
            target: aarch64-linux-android
            artifact_name: target/aarch64-linux-android/release/libblink_cmp_fuzzy.so

          ## macOS builds
          - os: macos-latest
            target: x86_64-apple-darwin
            artifact_name: target/x86_64-apple-darwin/release/libblink_cmp_fuzzy.dylib
          - os: macos-latest
            target: aarch64-apple-darwin
            artifact_name: target/aarch64-apple-darwin/release/libblink_cmp_fuzzy.dylib

          ## Windows builds
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            artifact_name: target/x86_64-pc-windows-msvc/release/blink_cmp_fuzzy.dll

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Set Rust toolchain
        if: contains(matrix.target, 'linux')
        # https://github.com/rust-cross/cargo-zigbuild/issues/327
        run: echo -e '[toolchain]\nchannel = "nightly-2025-02-19"' > rust-toolchain.toml

      - name: Install Rust
        run: |
          # https://github.com/rust-cross/cargo-zigbuild/issues/327
          rustup toolchain install nightly-2025-02-19
          rustup default nightly-2025-02-19
          rustup target add ${{ matrix.target }}

      - name: Build for Linux
        if: contains(matrix.os, 'ubuntu')
        run: |
          cargo install cross --git https://github.com/cross-rs/cross
          cross build --release --target ${{ matrix.target }}
          mv "${{ matrix.artifact_name }}" "${{ matrix.target }}.so"

      - name: Build for macOS
        if: contains(matrix.os, 'macos')
        run: |
          # Ventura (https://en.wikipedia.org/wiki/MacOS_version_history#Releases)
          MACOSX_DEPLOYMENT_TARGET="13" cargo build --release --target ${{ matrix.target }}
          mv "${{ matrix.artifact_name }}" "${{ matrix.target }}.dylib"

      - name: Build for Windows
        if: contains(matrix.os, 'windows')
        run: |
          cargo build --release --target ${{ matrix.target }}
          mv "${{ matrix.artifact_name }}" "${{ matrix.target }}.dll"

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.target }}
          path: ${{ matrix.target }}.*

  release:
    name: Release
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4

      - name: Generate checksums
        run: |
          for file in ./**/*; do
            sha256sum "$file" > "${file}.sha256"
          done

      - name: Upload Release Assets
        uses: softprops/action-gh-release@v2
        with:
          name: ${{ github.ref_name }}
          tag_name: ${{ github.ref_name }}
          token: ${{ github.token }}
          files: ./**/*
          draft: false
          prerelease: false
          generate_release_notes: true

  deploy-docs:
    name: Deploy docs
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
          fetch-depth: 0
          fetch-tags: true
      - uses: actions/setup-node@v4

      - name: Build
        run: npm ci && npm run build:release
        working-directory: doc

      - name: Deploy
        uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          command: pages deploy doc/.vitepress/dist --project-name=blink-cmp
