name: Release

on:
  push:
    tags: [ v\d+\.\d+\.\d+ ]

permissions:
    contents: write
    packages: write

env:
  CARGO_TERM_COLOR: always

jobs:
  create-release:
    permissions:
      contents: write
    runs-on: ubuntu-20.04
    outputs:
      release_id: ${{ steps.create-release.outputs.id }}
      release_upload_url: ${{ steps.create-release.outputs.upload_url }}
      release_body: "${{ steps.tag.outputs.message }}"

    steps:
      - uses: actions/checkout@v4

      - name: Get version
        id: get_version
        uses: battila7/get-version-action@v2

      - name: Get tag message
        id: tag
        run: |
          git fetch --depth=1 origin +refs/tags/*:refs/tags/*
          echo "message<<EOF" >> $GITHUB_OUTPUT
          echo "$(git tag -l --format='%(contents)' ${{ steps.get_version.outputs.version }})" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Create Release
        id: create-release
        uses: ncipollo/release-action@v1
        with:
          draft: true
          name: ${{ steps.get_version.outputs.version }}
          tag: ${{ steps.get_version.outputs.version }}
          body: "${{ steps.tag.outputs.message }}"

  releases-matrix:
    needs: [create-release]
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        feature: [lua51, luajit]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.80.0
      - name: Build all crates
        run: cargo build --release --features ${{ matrix.feature }}
      - name: Handle binaries
        if: ${{ matrix.os != 'windows-latest' }}
        shell: bash
        run: |
          mkdir -p results
          if [ "${{ matrix.os }}" == "ubuntu-latest" ]; then
            OS="linux"
            EXT="so"
          else
            OS="macOS"
            EXT="dylib"
          fi
          cp target/release/libavante_templates.$EXT results/avante_templates.$EXT
          cp target/release/libavante_tokenizers.$EXT results/avante_tokenizers.$EXT

          cd results
          tar zcvf avante_lib-${{ matrix.os }}-${{ matrix.feature }}.tar.gz *.${EXT}
      - name: Handle binaries (Windows)
        if: ${{ matrix.os == 'windows-latest' }}
        shell: pwsh
        run: |
          New-Item -ItemType Directory -Force -Path results

          Copy-Item -Path "target\release\avante_templates.dll" -Destination "results\avante_templates.dll"
          Copy-Item -Path "target\release\avante_tokenizers.dll" -Destination "results\avante_tokenizers.dll"

          Set-Location -Path results

          $dllFiles = Get-ChildItem -Filter "*.dll" | Select-Object -ExpandProperty Name
          Compress-Archive -Path $dllFiles -DestinationPath "avante_lib-${{ matrix.os }}-${{ matrix.feature }}.zip"

      - name: Upload Release Asset
        uses: shogo82148/actions-upload-release-asset@v1
        if: ${{ matrix.os != 'windows-latest' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ASSET_NAME: avante_lib-${{ matrix.os }}-${{ matrix.feature }}.tar.gz
        with:
          upload_url: ${{ needs.create-release.outputs.release_upload_url }}
          asset_path: ./results/avante_lib-${{ matrix.os }}-${{ matrix.feature }}.tar.gz
      - name: Upload Release Asset (Windows)
        uses: shogo82148/actions-upload-release-asset@v1
        if: ${{ matrix.os == 'windows-latest' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ASSET_NAME: avante_lib-${{ matrix.os }}-${{ matrix.feature }}.zip
        with:
          upload_url: ${{ needs.create-release.outputs.release_upload_url }}
          asset_path: ./results/avante_lib-${{ matrix.os }}-${{ matrix.feature }}.zip

  publish-release:
    permissions:
      contents: write
    runs-on: ubuntu-20.04
    needs: [create-release, releases-matrix]

    steps:
      - name: publish release
        id: publish-release
        uses: actions/github-script@v6
        env:
          release_id: ${{ needs.create-release.outputs.release_id }}
        with:
          script: |
            github.rest.repos.updateRelease({
              owner: context.repo.owner,
              repo: context.repo.repo,
              release_id: process.env.release_id,
              draft: false,
              prerelease: false
            })