name: Build and release artifacts

on:
  workflow_dispatch:
    inputs:
      tag:
        default: ''
  push:
    branches:
      - master
  release:
    types: [released]

defaults:
  run:
    shell: bash

jobs:
  unix-build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-20.04, macos-latest]

    steps:
      - uses: actions/checkout@v3
        with:
            # grab the commit passed in via `tag`, if any
            ref: ${{ github.event.inputs.tag }}
            # need to fetch unshallow so that setuptools_scm can infer the version
            fetch-depth: 0

      - name: Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
          cache: "pip"

      - name: Generate Binary
        run: >-
          pip install --no-binary pycryptodome . &&
          pip install pyinstaller &&
          make freeze

      - name: Upload Artifact
        uses: actions/upload-artifact@v3
        with:
          path: dist/vyper.*

  windows-build:
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3
        with:
            # grab the commit passed in via `tag`, if any
            ref: ${{ github.event.inputs.tag }}
            # need to fetch unshallow so that setuptools_scm can infer the version
            fetch-depth: 0

      - name: Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
          cache: "pip"

      - name: Generate Binary
        run: >-
          pip install . &&
          pip install pyinstaller &&
          ./make.cmd freeze

      - name: Upload Artifact
        uses: actions/upload-artifact@v3
        with:
          path: dist/vyper.*

  publish-release-assets:
    needs: [windows-build, unix-build]
    if: ${{ github.event_name == 'release' }}
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/download-artifact@v3
        with:
          path: artifacts/

      - name: Upload assets
        # fun - artifacts are downloaded into "artifact/".
        working-directory: artifacts/artifact
        run: |
          set -Eeuxo pipefail
          for BIN_NAME in $(ls)
          do
            curl -L \
              --no-progress-meter \
              -X POST \
              -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}"\
              -H "Content-Type: application/octet-stream" \
              "https://uploads.github.com/repos/${{ github.repository }}/releases/${{ github.event.release.id }}/assets?name=${BIN_NAME}" \
              --data-binary "@${BIN_NAME}"
          done
