name: Create or Update Draft Release

on:
  push:
    branches:
    - main
  repository_dispatch:
    types: [ version-bump ]
  workflow_dispatch:
    inputs:
      version:
        description: 'Version of the release to cut (e.g. 1.2.3)'
        required: false

concurrency: release

jobs:
  unit:
    name: Unit Tests
    runs-on: ubuntu-22.04
    outputs:
      builders: ${{ steps.builders.outputs.builders }}
    steps:
    - name: Setup Go
      uses: actions/setup-go@v3
      with:
        go-version: 'stable'
    - name: Checkout
      uses: actions/checkout@v3
    - name: Run Unit Tests
      run: ./scripts/unit.sh
    - name: Get builders from integration.json
      id: builders
      run: |
        source "${{ github.workspace }}/scripts/.util/builders.sh"
        builders="$(util::builders::list "${{ github.workspace }}/integration.json")"
        printf "Output: %s\n" "${builders}"
        printf "builders=%s\n" "${builders}" >> "$GITHUB_OUTPUT"

  integration:
    name: Integration Tests
    runs-on: ubuntu-22.04
    needs: unit
    strategy:
      matrix:
        builder: ${{ fromJSON(needs.unit.outputs.builders) }}
      fail-fast: false  # don't cancel all test jobs when one fails
    steps:
    - name: Setup Go
      uses: actions/setup-go@v3
      with:
        go-version: 'stable'
    - name: Checkout
      uses: actions/checkout@v3
    - name: Run Integration Tests
      run: ./scripts/integration.sh --builder ${{ matrix.builder }} --token ${{ github.token }}
      env:
        TMPDIR: "${{ runner.temp }}"

  release:
    name: Release
    runs-on: ubuntu-22.04
    needs: integration
    steps:
    - name: Setup Go
      uses: actions/setup-go@v3
      with:
        go-version: 'stable'

    - name: Checkout
      uses: actions/checkout@v3
      with:
        fetch-tags: true

    - name: Reset Draft Release
      id: reset
      uses: paketo-buildpacks/github-config/actions/release/reset-draft@main
      with:
        repo: ${{ github.repository }}
        token: ${{ github.token }}

    - name: Calculate Semver Tag
      if: github.event.inputs.version == ''
      id: semver
      uses: paketo-buildpacks/github-config/actions/tag/calculate-semver@main
      with:
        repo: ${{ github.repository }}
        token: ${{ github.token }}
        ref-name: ${{ github.ref_name }}

    - name: Set Release Tag
      id: tag
      run: |
        tag="${{ github.event.inputs.version }}"
        if [ -z "${tag}" ]; then
          tag="${{ steps.semver.outputs.tag }}"
        fi
        echo "tag=${tag}" >> "$GITHUB_OUTPUT"

    - name: Package
      run: ./scripts/package.sh --version "${{ steps.tag.outputs.tag }}"

    - name: Get buildpack type
      id: get_buildpack_type
      run: |

        if [ -f "extension.toml" ]; then
          echo "buildpack_type=extension" >> "$GITHUB_OUTPUT"
        else
          echo "buildpack_type=buildpack" >> "$GITHUB_OUTPUT"
        fi

    - name: Create Release Notes
      id: create-release-notes
      uses: paketo-buildpacks/github-config/actions/release/notes@main
      with:
        repo: ${{ github.repository }}
        token: ${{ secrets.PAKETO_BOT_GITHUB_TOKEN }}
        buildpack_type: ${{ steps.get_buildpack_type.outputs.buildpack_type }}

    - name: Create Release
      uses: paketo-buildpacks/github-config/actions/release/create@main
      with:
        repo: ${{ github.repository }}
        token: ${{ secrets.PAKETO_BOT_GITHUB_TOKEN }}
        tag_name: v${{ steps.tag.outputs.tag }}
        target_commitish: ${{ github.sha }}
        name: v${{ steps.tag.outputs.tag }}
        body: ${{ steps.create-release-notes.outputs.release_body }}
        draft: true
        assets: |
          [
            {
              "path": "build/buildpack.tgz",
              "name": "${{ github.event.repository.name }}-${{ steps.tag.outputs.tag }}.tgz",
              "content_type": "application/gzip"
            },
            {
              "path": "build/buildpackage.cnb",
              "name": "${{ github.event.repository.name }}-${{ steps.tag.outputs.tag }}.cnb",
              "content_type": "application/gzip"
            }
          ]

  failure:
    name: Alert on Failure
    runs-on: ubuntu-22.04
    needs: [ unit, integration, release ]
    if: ${{ always() && needs.unit.result == 'failure' || needs.integration.result == 'failure' || needs.release.result == 'failure' }}
    steps:
    - name: File Failure Alert Issue
      uses: paketo-buildpacks/github-config/actions/issue/file@main
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        repo: ${{ github.repository }}
        label: "failure:release"
        comment_if_exists: true
        issue_title: "Failure: Create Draft Release workflow"
        issue_body: |
          Create Draft Release workflow [failed](https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}).
        comment_body: |
           Another failure occurred: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}