---
# This action is a candidate to centrally manage in https://github.com/<organization>/.github/
# If more Flathub applications are developed, consider moving this action to the organization's .github repository,
# using the `flathub-pkg` repository label to identify repositories that should trigger this workflow.

# Update Flathub on release events.

name: Update flathub repo

on:
  release:
    types: [released]

concurrency:
  group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
  cancel-in-progress: true

jobs:
  update-flathub-repo:
    env:
      FLATHUB_PKG: dev.lizardbyte.app.${{ github.event.repository.name }}
    if: >-
      github.repository_owner == 'LizardByte'
    runs-on: ubuntu-latest
    steps:
      - name: Check if flathub repo
        env:
          TOPIC: flathub-pkg
        id: check-label
        uses: actions/github-script@v7
        with:
          script: |
            const topic = process.env.TOPIC;
            console.log(`Checking if repo has topic: ${topic}`);

            const repoTopics = await github.rest.repos.getAllTopics({
              owner: context.repo.owner,
              repo: context.repo.repo
            });
            console.log(`Repo topics: ${repoTopics.data.names}`);

            const hasTopic = repoTopics.data.names.includes(topic);
            console.log(`Has topic: ${hasTopic}`);

            core.setOutput('hasTopic', hasTopic);

      - name: Check if latest GitHub release
        id: check-release
        if: >-
          steps.check-label.outputs.hasTopic == 'true'
        uses: actions/github-script@v7
        with:
          script: |
            const latestRelease = await github.rest.repos.getLatestRelease({
              owner: context.repo.owner,
              repo: context.repo.repo
            });

            core.setOutput('isLatestRelease', latestRelease.data.tag_name === context.payload.release.tag_name);

      - name: Checkout
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        uses: actions/checkout@v4

      - name: Checkout flathub-repo
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        uses: actions/checkout@v4
        with:
          repository: "flathub/${{ env.FLATHUB_PKG }}"
          path: "flathub/${{ env.FLATHUB_PKG }}"

      - name: Clean up legacy files
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        working-directory: flathub/${{ env.FLATHUB_PKG }}
        run: |
          rm -rf ./*

      - name: Copy github files
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        working-directory: flathub/${{ env.FLATHUB_PKG }}
        run: |
          mkdir -p .github/ISSUE_TEMPLATE

          # sponsors
          curl -sSL https://github.com/LizardByte/.github/raw/refs/heads/master/.github/FUNDING.yml \
            -o .github/FUNDING.yml
          # pull request template
          curl -sSL https://github.com/LizardByte/.github/raw/refs/heads/master/.github/pull_request_template.md \
            -o .github/pull_request_template.md
          # issue config
          curl -sSL https://github.com/LizardByte/.github/raw/refs/heads/master/.github/ISSUE_TEMPLATE/config.yml \
            -o .github/ISSUE_TEMPLATE/config.yml

      - name: Download release asset
        id: download
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        uses: robinraju/release-downloader@v1.11
        with:
          repository: "${{ github.repository }}"
          tag: "${{ github.event.release.tag_name }}"
          fileName: "flathub.tar.gz"
          tarBall: false
          zipBall: false
          out-file-path: "flathub/${{ env.FLATHUB_PKG }}"
          extract: true

      - name: Delete arhive
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        run: |
          rm -f flathub/${{ env.FLATHUB_PKG }}/flathub.tar.gz

      - name: Update metainfo.xml
        id: update_metainfo
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        run: |
          xml_file="flathub/${{ env.FLATHUB_PKG }}/${{ env.FLATHUB_PKG }}.metainfo.xml"

          # Extract release information
          version="${{ github.event.release.tag_name }}" && version="${version#v}"
          date="${{ github.event.release.published_at }}" && date="${date%%T*}"
          changelog="${{ github.event.release.body }}" && changelog="${changelog//&/&amp;}" && \
            changelog="${changelog//</&lt;}" && changelog="${changelog//>/&gt;}"

          # Store the old release information into a temp file to be used for precise replacement
          tmpfile=$(mktemp)

          # Match the existing <release> block, replace it with the new data
          awk -v version="$version" -v date="$date" -v changelog="$changelog" '
          BEGIN { replaced = 0 }
          /<release version=.*>/ {
            if (!replaced) {
              print "<release version=\"" version "\" date=\"" date "\">"
              print "<description><p>" changelog "</p></description>"
              print "</release>"
              replaced = 1
            }
          }
          !/<release version=.*>/ && !/<\/release>/ { print $0 }
          ' "$xml_file" > "$tmpfile"

          # Move the updated file back to the original location
          mv "$tmpfile" "$xml_file"

      - name: Update submodule
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true'
        run: |
          # Get the current commit of the submodule in the main repository
          git submodule update --init packaging/linux/flatpak/deps/shared-modules
          cd ${{ github.workspace }}/packaging/linux/flatpak/deps/shared-modules
          main_commit=$(git rev-parse HEAD)

          # update submodules
          cd ${{ github.workspace }}/flathub/${{ env.FLATHUB_PKG }}
          git submodule update --init shared-modules
          cd shared-modules
          git checkout $main_commit

      - name: Create/Update Pull Request
        if: >-
          steps.check-label.outputs.hasTopic == 'true' &&
          steps.check-release.outputs.isLatestRelease == 'true' &&
          fromJson(steps.download.outputs.downloaded_files)[0]
        uses: peter-evans/create-pull-request@v7
        with:
          path: "flathub/${{ env.FLATHUB_PKG }}"
          token: ${{ secrets.GH_BOT_TOKEN }}
          commit-message: "chore: Update ${{ env.FLATHUB_PKG }} to ${{ github.event.release.tag_name }}"
          branch: bot/bump-${{ env.FLATHUB_PKG }}-${{ github.event.release.tag_name }}
          delete-branch: true
          title: "chore: Update ${{ env.FLATHUB_PKG }} to ${{ github.event.release.tag_name }}"
          body: ${{ github.event.release.body }}
