name: 'Release'
on:
  workflow_dispatch:
    inputs:
      git_ref:
        description: git ref, branch or tag to test against
        required: false
        type: string
      sd-images:
        type: boolean
        description: 'Build/test SD images?'
        required: false
        default: true
      lxd:
        type: boolean
        description: 'Build/test LXD image?'
        required: false
        default: true
      docker:
        type: boolean
        description: 'Build/test docker images?'
        required: false
        default: true
      installer:
        type: boolean
        description: 'Run curl-installer/upgrade tests?'
        required: false
        default: true
      release:
        type: boolean
        description: 'Release images to GH and docker registry'
        required: false
        default: false
  push:
    tags: ["v*"]
    branches:
      - master

permissions:
  contents: write

jobs:
  lxd:
    if: ${{ inputs.lxd || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-lxd.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
    secrets: inherit

  docker-x86:
    if: ${{ inputs.docker || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-docker.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      arch: "x86"
    secrets: inherit

  docker-armhf:
    if: ${{ inputs.docker || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-docker.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      arch: "armhf"
    secrets: inherit

  docker-arm64:
    if: ${{ inputs.docker || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-docker.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      arch: "arm64"
    secrets: inherit

  test-curl-installer:
    if: ${{ inputs.installer || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/vm-tests.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
    secrets: inherit

  raspberrypi:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: raspberrypi
      board_name: RaspberryPi
    secrets: inherit

  # TODO: Fix 32bit armbian images
  odroidxu4:
    # if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    if: ${{ false }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: odroidxu4
      board_name: OdroidHC2
    secrets: inherit
  rockpro64:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: rockpro64
      board_name: RockPro64
    secrets: inherit
  rock64:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: rock64
      board_name: Rock64
    secrets: inherit
  # TODO: Fix 32bit armbian images
  bananapi:
    #if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    if: ${{ false }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: bananapi
      board_name: BananaPi
    secrets: inherit
  odroidhc4:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: odroidhc4
      board_name: OdroidHC4
    secrets: inherit
  odroidc4:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: odroidc4
      board_name: OdroidC4
    secrets: inherit
  odroidc2:
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/build-sd-images.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      board_id: odroidc2
      board_name: OdroidC2
    secrets: inherit

  lxd-release:
    needs:
      - github-release
      - lxd
    if: ${{ inputs.lxd || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.lxd.outputs.artifact_name }}"
      artifact_file: "${{ needs.lxd.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit

  raspberrypi-release:
    needs:
      - raspberrypi
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.raspberrypi.outputs.artifact_name }}"
      artifact_file: "${{ needs.raspberrypi.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit

  odroidxu4-release:
    needs:
      - odroidxu4
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.odroidxu4.outputs.artifact_name }}"
      artifact_file: "${{ needs.odroidxu4.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  rockpro64-release:
    needs:
      - rockpro64
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.rockpro64.outputs.artifact_name }}"
      artifact_file: "${{ needs.rockpro64.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  rock64-release:
    needs:
      - rock64
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.rock64.outputs.artifact_name }}"
      artifact_file: "${{ needs.rock64.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  bananapi-release:
    needs:
      - bananapi
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.bananapi.outputs.artifact_name }}"
      artifact_file: "${{ needs.bananapi.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  odroidhc4-release:
    needs:
      - odroidhc4
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.odroidhc4.outputs.artifact_name }}"
      artifact_file: "${{ needs.odroidhc4.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  odroidc4-release:
    needs:
      - odroidc4
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.odroidc4.outputs.artifact_name }}"
      artifact_file: "${{ needs.odroidc4.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit
  odroidc2-release:
    needs:
      - odroidc2
      - github-release
    if: ${{ inputs.sd-images || github.event_name != 'workflow_dispatch' }}
    uses: ./.github/workflows/publish-image.yml
    with:
      git_ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      artifact_id: "${{ needs.odroidc2.outputs.artifact_name }}"
      artifact_file: "${{ needs.odroidc2.outputs.artifact_file }}"
      dry_run: ${{ (!inputs.release && github.event_name == 'workflow_dispatch') || github.ref_type != 'tag' || !(github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    secrets: inherit

  docker-release:
    needs:
      - docker-x86
      - docker-armhf
      - docker-arm64
      - test-curl-installer
    if: ${{ (inputs.release || github.event_name != 'workflow_dispatch') && github.ref_type == 'tag' && (github.ref_protected || startsWith(github.ref, 'refs/tags/v'))  }}
    runs-on: ubuntu-latest
    steps:
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Checkout code
        uses: actions/checkout@v3

      - name: Create manifest and push as tag to docker hub
        run: |
          . ./build/buildlib.sh
          
          for arch in x86 armhf arm64
          do
            docker pull "thecalcaholic/ncp-internal-${arch}:${{ github.run_id }}"
            docker tag "thecalcaholic/ncp-internal-${arch}:${{ github.run_id }}" "ownyourbits/nextcloudpi-${arch}:${version?}"
            docker tag "ownyourbits/nextcloudpi-${arch}:${version?}" "ownyourbits/nextcloudpi-${arch}:latest"
            docker push "ownyourbits/nextcloudpi-${arch}:${version?}"
            [[ "$version" =~ ^v[0-9]+'.'[0-9]+'.'[0-9]+$ ]] && docker push "ownyourbits/nextcloudpi-${arch}:latest"
          done

          docker manifest create ownyourbits/nextcloudpi:${version?} \
            ownyourbits/nextcloudpi-armhf:${version?} \
            ownyourbits/nextcloudpi-x86:${version?} \
            ownyourbits/nextcloudpi-arm64:${version?}
          docker manifest push ownyourbits/nextcloudpi:${version?}

      - name: Create manifest and push as latest to docker hub
        run: |
          [[ "$version" =~ ^v[0-9]+'.'[0-9]+'.'[0-9]+$ ]] || {
            echo "not tagging latest - is a pre-/beta-release"
            exit 0
          }
          docker manifest create ownyourbits/nextcloudpi:latest \
          ownyourbits/nextcloudpi-armhf:latest \
          ownyourbits/nextcloudpi-x86:latest \
          ownyourbits/nextcloudpi-arm64:latest
          docker manifest push ownyourbits/nextcloudpi:latest

  github-release:
    needs:
      - test-curl-installer
    runs-on: ubuntu-latest
    env:
      UID: "${{ github.run_id }}-rpi"
      VERSION: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
    defaults:
      run:
        shell: bash
    permissions:
      contents: write
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          ref: "${{ inputs.git_ref || github.head_ref || github.ref_name }}"
      - name: Debug output
        run: |
          echo "do release?: ${{ inputs.release }}"
          echo "event name: ${{ github.event_name }}"
          echo "ref type: ${{ github.ref_type }}"
          echo "protected?: ${{ github.ref_protected }}"
      - name: Create Draft
        if: ${{ (inputs.release || github.event_name != 'workflow_dispatch') && github.ref_type == 'tag' && (github.ref_protected || startsWith(github.ref, 'refs/tags/v')) }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          subject="$(git tag -n10 --format="%(contents:subject)" "${{ env.VERSION }}")"
          body="$(git tag -n10 --format="%(contents:body)" "${{ env.VERSION }}")"
          separator="

          ---
          
          "

          hub release create --draft -F - "${{ env.VERSION }}" <<EOF
          ${subject:-No message found}

          ${body:+${body}${separator}}[Docker images](https://hub.docker.com/r/ownyourbits/nextcloudpi)

          [Changelog](https://github.com/nextcloud/nextcloudpi/blob/${{ env.VERSION }}/changelog.md)
          EOF
