name: Publish
on:
  workflow_dispatch:
    inputs:
      prerelease:
        type: boolean
        default: false
        description: mark as a prerelease

jobs:  
  build:
    name: Build native ${{ matrix.platform && '' || '' }}

    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: ubuntu-22.04
            id: linux-x64
          - platform: macos-14
            id: darwin-arm64
          - platform: macos-13
            id: darwin-x64
          - platform: windows-2022
            id: win32-x64

    uses:
      ./.github/workflows/build.yml
    with:
      platform: ${{ matrix.platform }}
      publish: ${{ matrix.id }}


  create-release:
    name: Create the Github release
    runs-on: ubuntu-latest
    needs: build
    permissions:
      contents: write

    steps:
    - uses: actions/checkout@v5
    - name: Create Release
      uses: ncipollo/release-action@v1
      with:
        draft: true
        prerelease: ${{ inputs.prerelease }}


  pack-prebuilt-binaries:
    name: Pack the prebuilt binaries
    runs-on: ubuntu-latest
    needs: [ create-release ]
    permissions:
      contents: write

    strategy:
      fail-fast: false
      matrix:
        platform: [linux-x64, win32-x64, darwin-x64, darwin-arm64]

    steps:
    - name: Checkout
      uses: actions/checkout@v5
    - name: Setup Node.js 20
      uses: actions/setup-node@v4
      with:
        node-version: 20

    - name: Download the artifact for ${{ matrix.platform }}
      uses: actions/download-artifact@v5
      with:
        name: ${{ matrix.platform }}
        path: lib/binding

    - name: Pack
      run:
        tar -zcvf ${{ matrix.platform }}.tar.gz lib/binding

    - name: Publish
      uses: ncipollo/release-action@v1
      with:
        allowUpdates: true
        artifacts: ${{ matrix.platform }}.tar.gz
        updateOnlyUnreleased: true
        omitDraftDuringUpdate: true
        omitPrereleaseDuringUpdate: true


  create-npm-package:
    name: Create the npm package
    runs-on: ubuntu-latest
    needs: build
    permissions:
      contents: write
    outputs:
      version: ${{ steps.version.outputs.version }}

    steps:
    - uses: actions/checkout@v5
      with:
        fetch-depth: 0
        submodules: true

    - run: npm install --ignore-scripts
    - name: Download the artifact for linux-x64
      uses: actions/download-artifact@v5
      with:
        name: linux-x64
        path: lib/binding
    - run: npm pack
    - name: Get version
      id: version
      run: node -p '"version=" + require("./package.json").version' >> "$GITHUB_OUTPUT"
    - name: Upload the npm package
      uses: ncipollo/release-action@v1
      with:
        allowUpdates: true
        artifacts: mmomtchev-ffmpeg-${{ steps.version.outputs.version }}.tgz
        updateOnlyUnreleased: true
        omitDraftDuringUpdate: true
        omitPrereleaseDuringUpdate: true


  publish-release:
    name: Publish the Github release
    runs-on: ubuntu-latest
    needs: [ create-npm-package, pack-prebuilt-binaries ]
    permissions:
      contents: write
    steps:
    - name: Publish the draft release
      uses: ncipollo/release-action@v1
      with:
        allowUpdates: true
        omitDraftDuringUpdate: false
        draft: false
        omitPrereleaseDuringUpdate: true


  test_package:
    name: Test the npm package
    uses: ./.github/workflows/test-npm.yml
    needs: [ publish-release, create-npm-package ]
    with:
      package: mmomtchev-ffmpeg-${{ needs.create-npm-package.outputs.version }}.tgz
      download: true
