---

name: Flatpak

on:
  release:
    types: [published]
    branches: [master, 'release/**']

env:
  TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
  TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
  RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
  RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
  YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
  YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
  YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
  YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}

jobs:
  check_tag:
    name: Check release tag
    runs-on: [ubuntu-latest]
    outputs:
      valid_tag: ${{ steps.check_tag.outputs.valid_tag }}
      matrix: ${{ steps.check_tag.outputs.matrix }}
    steps:
      - name: Check the tag
        id: check_tag
        run: |
          shopt -s extglob

          case ${GITHUB_REF##*/} in
            +([0-9]).+([0-9]).+([0-9]) )
              echo 'valid_tag=${{ toJSON(true) }}' >> $GITHUB_OUTPUT
              echo 'matrix=["beta", "stable"]' >> $GITHUB_OUTPUT
              ;;
            +([0-9]).+([0-9]).+([0-9])-@(beta|rc)*([0-9]) )
              echo 'valid_tag=${{ toJSON(true) }}' >> $GITHUB_OUTPUT
              echo 'matrix=["beta"]' >> $GITHUB_OUTPUT
              ;;
            * ) echo 'valid_tag=${{ toJSON(false) }}' >> $GITHUB_OUTPUT ;;
          esac

  publish:
    name: Publish to Flathub
    runs-on: [ubuntu-latest]
    needs: check_tag
    if: fromJSON(needs.check_tag.outputs.valid_tag)
    env:
      FLATPAK_BUILD_PATH: flatpak_app/files/share
    container:
      image: bilelmoussaoui/flatpak-github-actions:kde-6.4
      options: --privileged
    strategy:
      matrix:
        branch: ${{ fromJSON(needs.check_tag.outputs.matrix) }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: 'recursive'

      - name: 'Setup build environment'
        id: setup
        run: |
          git config --global --add safe.directory $GITHUB_WORKSPACE
          echo "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT

      - name: Build Flatpak Manifest
        uses: flatpak/flatpak-github-actions/flatpak-builder@v5
        with:
          bundle: obs-studio-${{ steps.setup.outputs.commitHash }}.flatpak
          manifest-path: CI/flatpak/com.obsproject.Studio.json
          cache-key: flatpak-builder-${{ hashFiles('CI/flatpak/com.obsproject.Studio.json') }}
          mirror-screenshots-url: https://dl.flathub.org/repo/screenshots
          branch: ${{ matrix.branch }}

      - name: Validate AppStream
        shell: bash
        working-directory: ${{ env.FLATPAK_BUILD_PATH }}
        run: |
          appstream-util validate appdata/com.obsproject.Studio.appdata.xml

      - name: Verify icon and metadata in app-info
        shell: bash
        working-directory: ${{ env.FLATPAK_BUILD_PATH }}
        run: |
          test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "Missing 128x128 icon in app-info" ; exit 1; }
          test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "Missing com.obsproject.Studio.xml.gz in app-info" ; exit 1; }

      - name: Commit screenshots to the OSTree repository
        run: |
          ostree commit --repo=repo --canonical-permissions --branch=screenshots/x86_64 flatpak_app/screenshots

      - name: Publish to Flathub Beta
        uses: flatpak/flatpak-github-actions/flat-manager@v5
        if: matrix.branch == 'beta'
        with:
          flat-manager-url: https://hub.flathub.org/
          repository: beta
          token: ${{ secrets.FLATHUB_BETA_TOKEN }}

      - name: Publish to Flathub
        uses: flatpak/flatpak-github-actions/flat-manager@v5
        if: matrix.branch == 'stable'
        with:
          flat-manager-url: https://hub.flathub.org/
          repository: stable
          token: ${{ secrets.FLATHUB_TOKEN }}
