name: Release

on:
  push:
    tags:
      - 'v*'

permissions:
  contents: write

jobs:
  build:
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
            archive: tar.gz
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
            archive: tar.gz
            cross: true
          - target: x86_64-apple-darwin
            os: macos-latest
            archive: tar.gz
          - target: aarch64-apple-darwin
            os: macos-latest
            archive: tar.gz

    steps:
      - uses: actions/checkout@v4

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

      - name: Install cross
        if: matrix.cross
        run: cargo install cross --git https://github.com/cross-rs/cross

      - name: Build
        run: |
          if [ "${{ matrix.cross }}" = "true" ]; then
            cross build --release --target ${{ matrix.target }}
          else
            cargo build --release --target ${{ matrix.target }}
          fi

      - name: Package
        run: |
          BINARY=target/${{ matrix.target }}/release/flexi
          ARCHIVE=flexi-${{ github.ref_name }}-${{ matrix.target }}.tar.gz
          tar -czf "$ARCHIVE" -C "$(dirname $BINARY)" "$(basename $BINARY)"
          echo "ARCHIVE=$ARCHIVE" >> $GITHUB_ENV

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

  release:
    name: Create Release
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: artifacts
          merge-multiple: true

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: artifacts/*
          generate_release_notes: true

  update-homebrew:
    name: Update Homebrew Formula
    needs: release
    runs-on: ubuntu-latest
    steps:
      - name: Compute SHA256s
        run: |
          VERSION="${{ github.ref_name }}"
          BASE="https://github.com/thombruce/flexi/releases/download/${VERSION}"
          echo "VERSION=${VERSION#v}" >> $GITHUB_ENV
          echo "SHA256_X86_MAC=$(curl -sL ${BASE}/flexi-${VERSION}-x86_64-apple-darwin.tar.gz | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
          echo "SHA256_ARM_MAC=$(curl -sL ${BASE}/flexi-${VERSION}-aarch64-apple-darwin.tar.gz | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
          echo "SHA256_X86_LINUX=$(curl -sL ${BASE}/flexi-${VERSION}-x86_64-unknown-linux-gnu.tar.gz | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
          echo "SHA256_ARM_LINUX=$(curl -sL ${BASE}/flexi-${VERSION}-aarch64-unknown-linux-gnu.tar.gz | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV

      - name: Clone homebrew-tap
        run: |
          git clone https://x-access-token:${{ secrets.HOMEBREW_TAP_TOKEN }}@github.com/thombruce/homebrew-tap.git

      - name: Update formula
        run: |
          cat > homebrew-tap/Formula/flexi.rb << EOF
          class Flexi < Formula
            desc "A minimal CLI tool for tracking your flexi-time balance"
            homepage "https://github.com/thombruce/flexi"
            version "${{ env.VERSION }}"
            license "MIT"

            on_macos do
              on_arm do
                url "https://github.com/thombruce/flexi/releases/download/v#{version}/flexi-v#{version}-aarch64-apple-darwin.tar.gz"
                sha256 "${{ env.SHA256_ARM_MAC }}"
              end
              on_intel do
                url "https://github.com/thombruce/flexi/releases/download/v#{version}/flexi-v#{version}-x86_64-apple-darwin.tar.gz"
                sha256 "${{ env.SHA256_X86_MAC }}"
              end
            end

            on_linux do
              on_arm do
                url "https://github.com/thombruce/flexi/releases/download/v#{version}/flexi-v#{version}-aarch64-unknown-linux-gnu.tar.gz"
                sha256 "${{ env.SHA256_ARM_LINUX }}"
              end
              on_intel do
                url "https://github.com/thombruce/flexi/releases/download/v#{version}/flexi-v#{version}-x86_64-unknown-linux-gnu.tar.gz"
                sha256 "${{ env.SHA256_X86_LINUX }}"
              end
            end

            def install
              bin.install "flexi"
            end

            test do
              assert_match "0 min", shell_output("#{bin}/flexi")
            end
          end
          EOF

      - name: Commit and push
        run: |
          cd homebrew-tap
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git config user.name "github-actions[bot]"
          git add Formula/flexi.rb
          git commit -m "chore: update flexi to v${{ env.VERSION }}"
          git push
